开发者

How to animate (moving by default) and inanimate (make stationary on tap) colliding objects

Hey Guys I am making a game using corona sdk and so needed help with the lus code. In this program there are bubbles floating across the screen and colliding with each either as well as with the walls of the screen.

I am using 'Collision Filter' for the collisions and the masking operation and it is working well. But in this game I want a bubble to continuously move unless and until it is tapped upon. I thought of using the frame animation to animate each bubble and then add a separate function that will make it stationary when tapped.

But the problem is that at a time only 1 program seems to wrok fine. So, 1) either the bubbles collide, fall down, bounce against wall and eventually rest down. 2) The bubbles continuously keep moving across the screen, without colliding against each other, and instead pass through the other bubbles

What should I do to animate and inanimate(on tapping that bubble) a colliding bubble.

My code is below,

borderCollisionFilter = { categoryBits = 1, maskBits = 2 } -- collides with (4 & 2) only
local borderBodyElement = {  bounce=1.0, filter=borderCollisionFilter }

local borderTop = display.newRect( 0, 0, 480, 1 )
borderTop:setFillColor( 0, 0, 0, 0)     -- make invisible
physics.addBody( borderTop, "static", borderBodyElement )

local borderBottom = display.newRect( 0, 318, 480, 1 )
borderBottom:setFillColor( 0, 0, 0, 0)      -- make invisible
physics.addBody( borderBottom, "static", borderBodyElement )

local borderLeft = display.newRect( 0, 0, 1, 320 )
borderLeft:setFillColor( 0, 0, 0, 0)        -- make invisible
physics.addBody( borderLeft, "static", borderBodyElement )

local borderRight = display.newRect( 480, 1, 1, 320 )
borderRight:setFillColor( 0, 0, 0, 0)       -- make invisible
physics.addBody( borderRight, "static", borderBodyElement )

--BUBBLES

local bubbleCollisionFilter = { categoryBits = 2, maskBits = 7 }
bubble = {bounce=0.94, radius=18,filter = bubbleCollisionFilter }


local bubble1 = display.newImage( "bubble.png", 50, 50 )    
physics.addBody( bubble1, bubble )

local bubble2 = display.newImage( "bubble.png", 100, 230 )  
physics.addBody( bubble2, bubble )

local bubble3 = display.newImage( "bubble.png", 180, 200 )  
physics.addBody( bubble3, bubble )

local bubble4 = display.newImage( "bubble.png", 90, 30 )    
physics.addBody( bubble4, bubble )

-开发者_运维技巧-MINIONS

minionCollisionFilter = { categoryBits = 4, maskBits = 2 } 
minionBodyElement = { bounce=0.8, filter=minionCollisionFilter }

local c1 = display.newImage("str-minion-small.png")
c1.isVisible=false
physics.addBody( c1, "static", minionBodyElement )

local c2 = display.newImage("str-minion-mid.png")
c2.isVisible=false
physics.addBody( c2, "static", minionBodyElement )

local c3 = display.newImage("str-minion-big.png")
c3.isVisible=false
physics.addBody( c3, "static", minionBodyElement )

--SPAWNING

local function spawnDisk( event )
      local phase = event.phase
      local volumeBar = display.newLine( 0, 0, 1, 0 )
      volumeBar.y =  400
      volumeBar.x = 20
      local v = 20*math.log(r:getTunerVolume())    
      local MINTHRESH = 30
      local LEFTMARGIN = 20
      local v2 = MINTHRESH + math.max (v, -MINTHRESH)

      v2 = (display.contentWidth - 1 * LEFTMARGIN ) * v2 / MINTHRESH
      volumeBar.xScale =  math.max ( 20, v2 )

      local l = volumeBar.xScale
      local cnt1 = 0
      local cnt2 = 0
      local cnt3 = 0
      local ONE =1
      local val = event.numTaps

            if "ended" == phase then
                 if l > 50 and l <=150 then
              c1.x=math.random( 10, 450 )
              c1.y=math.random( 10, 300 )
              physics.addBody( c1, { density=1, radius=10.0 } )
              c1.isVisible=true
              cnt1= cnt1+ ONE
              return c1

         elseif l > 100 and l <=250 then
              c2.x=math.random( 10, 450 )
              c2.y=math.random( 10, 300 )
              physics.addBody( c2, { density=2, radius=30.0 } )
              c2.isVisible=true
              cnt2= cnt2+ ONE
              return c2


         elseif l >=250 then
              c3.x=math.random( 40, 450 )
                      c3.y=math.random( 40, 300 )
              physics.addBody( c3, { density=2, radius=50.0 , bounce=0.0 } )
              c3.isVisible=true
              cnt3= cnt3+ ONE
              return c3
                 end
      end
end

buzzR:addEventListener( "touch", spawnDisk ) -- 

touch the Button to create minions


Listen for tap events and set objects to static:

http://developer.anscamobile.com/reference/index/bodybodytype

ADDITION: I hadn't bothered to run your code because you claimed the collision masking worked. Now that I actually have tried to run it, I got an error immediately.

First off, you need to require "physics" at the top of your code:

local physics = require("physics")

Then there is a timeout error just a few lines down because you didn't start the physics simulation. The second line of your code should be:

physics.start()

Now I'm going to assume those two lines are actually at the top of your code but you simply didn't paste them here, because I can't imagine you would write a hundred lines of code without ever running it.

However that still leaves more errors. Like, at the bottom of your code it references buzzR but there's no object buzzR defined anywhere.

Please either post code that works or say that you don't have code that works. Sorting through this mess is frustrating.


I have done one application to help with collision masking in Corona SDK, for free of course.

http://developer.anscamobile.com/forum/2011/09/12/coolmasking-take-total-control-over-collision-masking

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜