Как оживить (перемещать по умолчанию) и неодушевить (сделать неподвижным при нажатии) сталкивающиеся объекты - PullRequest
0 голосов
/ 12 мая 2011

Привет, ребята. Я делаю игру, используя Corona SDK, и поэтому мне нужна помощь с кодом LUS.В этой программе пузырьки плавают по экрану и сталкиваются с каждым из них, а также со стенами экрана.

Я использую «Фильтр столкновений» для столкновений и маскирования, и он работает хорошо,Но в этой игре я хочу, чтобы пузырь непрерывно двигался до тех пор, пока на него не нажали.Я подумал об использовании кадровой анимации для анимации каждого пузыря, а затем добавил отдельную функцию, которая сделает его неподвижным при касании.

Но проблема в том, что за раз только одна программа работает нормально.Итак, 1) либо пузырьки сталкиваются, падают, отскакивают от стены и в конце концов ложатся.2) Пузыри постоянно движутся по экрану, не сталкиваясь друг с другом, и вместо этого проходят сквозь другие пузыри

Что я должен сделать, чтобы оживить (не касаясь этого пузыря) сталкивающийся пузырь.

Мой код ниже,

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 ) -- 

нажмите кнопку, чтобы создать миньонов

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Я сделал одно приложение, чтобы помочь с маскированием столкновений в Corona SDK, конечно, бесплатно.

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

0 голосов
/ 13 мая 2011

Прослушивание событий касания и установка статических объектов:

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

ДОПОЛНЕНИЕ: я не удосужился запустить ваш код, потому что вы утверждали, что маскировка столкновений работает.Теперь, когда я действительно попытался запустить его, я сразу же получил ошибку.

Прежде всего, вам нужно указать "физику" в верхней части кода:

local physics = require("physics")

Затемошибка тайм-аута всего на несколько строк, потому что вы не запустили физическое моделирование.Вторая строка вашего кода должна быть:

physics.start()

Теперь я собираюсь предположить, что эти две строки на самом деле находятся в верхней части вашего кода, но вы просто не вставили их сюда, потому что я могу 'Я не думаю, что вы бы написали сто строк кода, даже не запустив его.

Однако это все равно оставляет больше ошибок.Например, внизу вашего кода он ссылается на buzzR, но нигде не определен объект buzzR.

Пожалуйста, отправьте работающий код или скажите, что у вас нет работающего кода.Разбираться в этом беспорядке неприятно.

...