Rotating Shield

Hi all,

I’m new to Corona, and am working on a game with a ship in the center of the screen. Around that ship are 3 concentric 12-sided polygons that will be the shields. They rotate around the center ship. I figured out a way to make them display properly and even rotate, but I’m having a hard time figuring out 2 things:

1 - Is there a better way to do this?

and

2 - How can I detect where any single segment (of the 12 in any of the shields) is located at any instant? When a shield is hit, I want to make that segment go away. I tried to look at the x and y properties of a segment, but it always returns the same value, no matter where the shield is in its rotation.

Here’s the code I use to set up the shields:

local nYCenter = display.viewableContentHeight / 2local nXCenter = display.viewableContentWidth / 2local physics = require ("physics")physics.start( true )physics.setDrawMode( "normal" ) --use normal for builds, hybrid or debug for testingphysics.setGravity( 0, 0 )-- Show the fortress shiplocal fortressShip = display.newImage( "FortressShip.png" , nXCenter - 15, nYCenter - 15)physics.addBody( fortressShip, "static", { density = 1.0, friction = 0.0, bounce = 0.2, radius=70, } )--fortressShip.isVisible = false-- Hide statusbar using setStatusBar()display.setStatusBar( display.HiddenStatusBar )-- Build inner shield-- Declare the Arraylocal innerShield = {}innerShield[1] = display.newLine( nXCenter , nYCenter - 30, nXCenter - 15 , nYCenter - 26 )innerShield[2] = display.newLine( nXCenter - 15 , nYCenter - 26 , nXCenter - 26 , nYCenter - 15 )innerShield[3] = display.newLine( nXCenter - 26 , nYCenter - 15 , nXCenter - 30 , nYCenter )innerShield[4] = display.newLine( nXCenter - 30 , nYCenter , nXCenter - 26 , nYCenter + 15 )innerShield[5] = display.newLine( nXCenter - 26 , nYCenter + 15 , nXCenter - 15 , nYCenter + 26 )innerShield[6] = display.newLine( nXCenter - 15 , nYCenter + 26 , nXCenter , nYCenter + 30 )innerShield[7] = display.newLine( nXCenter , nYCenter + 30 , nXCenter + 15 , nYCenter + 26 )innerShield[8] = display.newLine( nXCenter + 15 , nYCenter + 26 , nXCenter + 26 , nYCenter + 15 )innerShield[9] = display.newLine( nXCenter + 26 , nYCenter + 15 , nXCenter + 30 , nYCenter )innerShield[10] = display.newLine( nXCenter + 30 , nYCenter , nXCenter + 26 , nYCenter - 15 )innerShield[11] = display.newLine( nXCenter + 26 , nYCenter - 15 , nXCenter + 15 , nYCenter - 26 )innerShield[12] = display.newLine( nXCenter + 15 , nYCenter - 26 , nXCenter , nYCenter - 30 )local gInnerShield = display.newGroup()gInnerShield.xReference = nXCentergInnerShield.yReference = nYCenterfor i=1,12 do innerShield[i]:setColor( 25, 25, 255, 255 ) innerShield[i].width = 2 gInnerShield:insert (innerShield[i]) end -- Build middle shield-- Declare the Arraylocal middleShield = {}middleShield[1] = display.newLine( nXCenter - 50 , nYCenter , nXCenter - 43 , nYCenter - 25 )middleShield[2] = display.newLine( nXCenter - 43 , nYCenter - 25 , nXCenter - 25 , nYCenter - 43 )middleShield[3] = display.newLine( nXCenter - 25 , nYCenter - 43 , nXCenter , nYCenter - 50 )middleShield[4] = display.newLine( nXCenter , nYCenter - 50 , nXCenter + 25 , nYCenter - 43 )middleShield[5] = display.newLine( nXCenter + 25 , nYCenter - 43 , nXCenter + 43 , nYCenter - 25 )middleShield[6] = display.newLine( nXCenter + 43 , nYCenter - 25 , nXCenter + 50 , nYCenter )middleShield[7] = display.newLine( nXCenter + 50 , nYCenter , nXCenter + 43 , nYCenter + 25 )middleShield[8] = display.newLine( nXCenter + 43 , nYCenter + 25 , nXCenter + 25 , nYCenter + 43 )middleShield[9] = display.newLine( nXCenter + 25 , nYCenter + 43 , nXCenter , nYCenter + 50 )middleShield[10] = display.newLine( nXCenter , nYCenter + 50 , nXCenter - 25, nYCenter + 43 )middleShield[11] = display.newLine( nXCenter - 25 , nYCenter + 43 , nXCenter - 43 , nYCenter + 25 )middleShield[12] = display.newLine( nXCenter - 43 , nYCenter + 25 , nXCenter - 50 , nYCenter )local gMiddleShield = display.newGroup()gMiddleShield.xReference = nXCentergMiddleShield.yReference = nYCenterfor i=1,12 do middleShield[i]:setColor( 255, 25, 25, 255 ) middleShield[i].width = 2 gMiddleShield:insert (middleShield[i]) end -- Build outer shield-- Declare the Arraylocal outerShield = {}outerShield[1] = display.newLine( nXCenter - 70 , nYCenter , nXCenter - 61 , nYCenter - 35 )outerShield[2] = display.newLine( nXCenter - 61 , nYCenter - 35 , nXCenter - 35 , nYCenter - 60 )outerShield[3] = display.newLine( nXCenter - 35 , nYCenter - 60 , nXCenter , nYCenter - 70 )outerShield[4] = display.newLine( nXCenter , nYCenter - 70 , nXCenter + 35 , nYCenter - 60 )outerShield[5] = display.newLine( nXCenter + 35 , nYCenter - 60 , nXCenter + 60 , nYCenter - 35 )outerShield[6] = display.newLine( nXCenter + 60 , nYCenter - 35 , nXCenter + 70 , nYCenter )outerShield[7] = display.newLine( nXCenter + 70 , nYCenter , nXCenter + 61 , nYCenter + 35 )outerShield[8] = display.newLine( nXCenter + 61 , nYCenter + 35 , nXCenter + 35 , nYCenter + 61 )outerShield[9] = display.newLine( nXCenter + 35 , nYCenter + 61 , nXCenter , nYCenter + 70 )outerShield[10] = display.newLine( nXCenter , nYCenter + 70 , nXCenter - 35 , nYCenter + 61 )outerShield[11] = display.newLine( nXCenter - 35 , nYCenter + 61 , nXCenter - 61 , nYCenter + 35 )outerShield[12] = display.newLine( nXCenter - 61 , nYCenter + 35 , nXCenter - 70 , nYCenter )local gOuterShield = display.newGroup()gOuterShield.xReference = nXCentergOuterShield.yReference = nYCenterfor i=1,12 do outerShield[i]:setColor( 25, 255, 25, 255 ) outerShield[i].width = 2 gOuterShield:insert (outerShield[i]) end local loopInnerShieldlocal initInnerShield = function() transition.to( gInnerShield, { time= 3599, rotation=359, onComplete=loopInnerShield} )endfunction loopInnerShield() transition.to( gInnerShield, { time= 1, rotation=0, onComplete=initInnerShield } )end local loopMiddleShieldlocal initMiddleShield = function() transition.to( gMiddleShield, { time= 3599, rotation=-359, onComplete=loopMiddleShield} )endfunction loopMiddleShield() transition.to( gMiddleShield, { time= 1, rotation=0, onComplete=initMiddleShield } )end local loopOuterShieldlocal initOuterShield = function() transition.to( gOuterShield, { time= 1999, rotation=359, onComplete=loopOuterShield} )endfunction loopOuterShield() transition.to( gOuterShield, { time= 1, rotation=0, onComplete=initOuterShield } )end initInnerShield()initMiddleShield()initOuterShield()function main() end[/code]Any pointers?Thanks a ton!David [import]uid: 106175 topic_id: 20002 reply_id: 320002[/import]

I’m not exactly sure how to code it, but what I used in my game were collision listeners. They have collision examples in the Corona sample code so just check it out there. For removing the lines, I’m sure you can just name the object then do object:removeSelf()

Hope this helps a little.

Regards,
Jordan Schuetz
Ninja Pig Studios [import]uid: 29181 topic_id: 20002 reply_id: 77963[/import]

Thanks for the reply. I started working along those lines, but have had problems trying to make each shield a physics object. Not only are there a lot of segments that are joined to make a group object, the three are, in effect, on top of one another and moving. Fine. So I then decided that I could switch between shields on the fly, but I still have my group(s) of 12 objects behaving in ways I didn’t expect and cannot explain.

But hey, that’s half the fun, right?

Thanks,

David [import]uid: 106175 topic_id: 20002 reply_id: 77967[/import]

I really am not sure how you could do that efficiently. Sorry :frowning: [import]uid: 29181 topic_id: 20002 reply_id: 77973[/import]

What I have ended up doing is based on an idea I read elsewhere on these forums (which are a godsend).

  1. Create a circle the size of the shield area.
  2. Make the circle invisible.
  3. Create a thin rectangle (as thin as a line would have been) and weld it on a tangent at the top of the circle, with the length of it equal to the base of an equilateral triangle with a 30 degree vertex and a height equal to the radius of the circle.
  4. Rotate circle 30 degrees and do it all again until circle has rotated in 12 steps of 30 degrees each.

All done with a for next loop, and it appears to work just fine.

Now, instead of moving a group of physics objects, I simply rotate the circle. The shields, all welded to the circle, go right along the path they need.

As soon as I have them set up, I’ll share the code I ended up with.

Thanks for all the code everyone shares!

David [import]uid: 106175 topic_id: 20002 reply_id: 78222[/import]