2016-06-02 3 views
0

Also baue ich ein Spiel mit Corona (in lua), wo es mehrere Objekte mit physikalischen Attributen gibt, und versuche diese zu speichern, manipuliere sie so, dass ich Kollisionen machen kann Handhabung einfacher ... die Idee ist, dass keine 2 der 3 Objekte kollidieren. die Objekte werden 1/a Ball (von vielen, die auf dem Bildschirm sein können) 2/die Tabelle (die hat einige Physic Attribute) und 3/Taschen (was nur am Ende einiger unsichtbaren Rechtecken) für die Bearbeitung des ChaosUmgang mit Kollisionsereignissen für mehrere Objekte mit Physik

von 2 Wochen zu sein ich bin gekommen, zu diesem Schluss

  • Ball trifft andere Kugel
  • Ball-Tabelle schlägt aus aus
  • Tabelle trifft nicht ab Tasche (statischer Körper)
  • Tasche schlägt aus NICHT Ball (statischer Körper)
  • Ball geht weg Tasche

eine Probe der Codestruktur den 100 Balls schaffen

balls = {} 
local i = 1 
function createBalls() 
     for i = 1,100,1 do -- create the 100 and hide them? 

     ball = display.newImage("ball.png") 
     ball.isVisible = false 
     ball.id = tostring("ball " ..i) 
     balls[#ball+1] = ball 
     sceneGroup:insert(ball[#ball]) 
    end 
end 

erklären 6 Taschen (die ID wie die Flagge für Kollisionsbehandlung unter Verwendung)

local Pocket1 = display.newRect(screenWidth * .28, screenHeight * .5, 15, 18) --Left Pocket 60pts 
physics.addBody(Pocket1, "kinematic", {isSensor = true}) 
Pocket1:addEventListener("collision", Pocket1) Pocket1.isVisible = true Pocket1.alpha = 0.5 
Pocket1.id ="Left Pocket 60pts" 

local Pocket2 = display.newRect(screenWidth * .3945, screenHeight * .556, 15, 18) -- Left Pocket 30pts 
physics.addBody(Pocket2, "kinematic", {isSensor = true}) 
Pocket2:addEventListener("collision", Pocket2) Pocket2.isVisible = false 
Pocket2.id ="Left Pocket 30pts" 

local Pocket3 = display.newRect(screenWidth * .512, screenHeight * .490, 15, 18) -- Center Pocket 10 pts 
physics.addBody(Pocket3, "kinematic", {isSensor = true}) 
Pocket3:addEventListener("collision", Pocket3) Pocket3.isVisible = false 
Pocket3.id ="Center Pocket 10pts" 

local Pocket4 = display.newRect(screenWidth * .613, screenHeight * .556, 15, 18) -- Right Pocket 30 pts 
physics.addBody(Pocket4, "kinematic", {isSensor = true}) 
Pocket4:addEventListener("collision", Pocket4) Pocket4.isVisible = false 
Pocket4.id ="Right Pocket 30pts" 

local Pocket5 = display.newRect(screenWidth * .736, screenHeight * .5, 15, 18) -- Far Right Pocket 60pts 
physics.addBody(Pocket5, "kinematic", {isSensor = true}) 
Pocket5:addEventListener("collision", Pocket5) Pocket5.isVisible = false 
Pocket5.id ="Right Pocket 60pts" 

local Pocket6 = display.newRect(screenWidth * .512, screenHeight * .638, 50, 10) -- Kill-z Pocketphysics.addBody(Pocket6, "kinematic", {isSensor = true}) 
Pocket6:addEventListener("collision", Pocket6) Pocket6.isVisible = false 
Pocket6.id ="Kill Pocket" 

Mein Problem, Kollisionserkennung auf der letzten Kugel funktioniert nur, die geladen wurde,

(falls jemand für das fragt loader-Funktion)

--handle loader 
function shootBall() 
    createBalls() --obviously this will now spawn 100 balls 

    if ballLoaded == true then 
    r1 = -687.5 r2 = -668 
    r3 = 595 r4 = 645 
    ball[k].x = screenWidth * .378 ball[k].y = screenHeight * .638 
    ball[k]:scale(0.16,0.16) 
    ball[k].isVisible = true 
    physics.addBody(ball[k], "dynamic", {radius = 5.5, density=15.0, friction=0.8, bounce=0.0 }) 
    ball[k]:setLinearVelocity(math.random(r1,r2), math.random(r3,r4)) 
    --and here it will have done nothing productive other than fill the screen with balls 

    end 

ein Rollback bearbeiten war ursprünglich, was heißen würde, aber wie Sie sehen können, ist nicht gut auf allen organisiert, angesichts der mehr die letzte Code ist ein Chaos ..

local i = 1 
local balls = {} 

local function spawnBall() 

    if i > 0 or i < 100 then 
    balls[i] = display.newImage("ball.png") 
    balls[i].id = "ball "..i 
    balls[i].x = screenWidth * .378 
    balls[i].y = screenHeight * .638 
    balls[i]:scale(0.16,0.16) 
    balls[i].isVisible = true 

    physics.addBody(balls[i], "dynamic", {radius = 5.5, density=15.0, friction=0.8, bounce=0.0 }) 
    balls[i]:setLinearVelocity(math.random(-687.5,-668), math.random(595,645)) 
    sceneGroup:insert(balls[i]) 
    print(balls[i].id.. " shot") 
    i = i + 1 

    end 

end` 
+0

Es gibt einige seltsame (und riechende) Dinge in Ihrem Code. Die createBall-Funktion ist definitiv falsch. Bist du sicher, dass du weißt, was du hier machst? Sie erstellen einen Ball-Tisch für jede Schleife, speichern einige Dinge dort und speichern dann einen Verweis auf diese Tabelle in der Tabelle ** selbst **, aber am Anfang ('#ball + 1' wird bei einem' k' größer als 1). In Ihrer Ladefunktion, was ist k? Wenn es eine globale Variable ist, tun Sie dies nicht. Vertrau mir, du willst das nicht so machen. Darüber hinaus sollten Sie vorsichtig mit dem Einzug sein, es hilft auch, Fehler zu erkennen. – pschulz

Antwort

0

Also hier ist meine Lösung, es ist ziemlich umfassend, ich kann Danny von Corona Labs mit dem größten Teil der Lösung, die Weitergabe von Parametern durch eine Funktion war auf der Liste, aber nicht besonders eine Priorität, aber vielen Dank für die Arbeit.

--on "Press" event 
--Function to spawn an object 
local function spawn(params) 
    local ball = display.newImage(params.image) 
    --Set the objects table to a table passed in by parameters 
    ball.Table = params.Table 
    --Automatically set the table index to be inserted into the next available table index 
    ball.index = #ball.Table + 1 
    --Give the object a custom name 
    ball.id = "ball : " .. ball.index 
    --If the object should have a body create it, else dont. 
     if params.hasBody then 
      --Allow physics parameters to be passed by parameters: 
      ball.x = params.x or contentCenterX 
      ball.y = params.y or contentCenterY 
      ball.isVisible = params.isVisible or false 
      ball.radius = params.radius or nil 
      ball.density = params.density or 0 
      ball.friction = params.friction or 0 
      ball.bounce = params.bounce or 0 
      ball.isSensor = params.isSensor or false 
      ball.bodyType = params.bodyType or "dynamic" 
      physics.addBody(ball, ball.bodyType, {radius = ball.radius, density = ball.density, friction = ball.friction, bounce = ball.bounce, isSensor = ball.isSensor}) 
      ball:setLinearVelocity(params.xVelocity or 0, params.yVelocity or 0) 
      ball:scale(params.xScale or 1,params.yScale or 1) 

     end 
    --The objects group 
    ball.group = params.group or nil 
    --If the function call has a parameter named group then insert it into the specified group 
    ball.group:insert(ball) 
    --Insert the object into the table at the specified index 
    ball.Table[ball.index] = ball  
    return ball 
end 
local displayGroup = display.newGroup() 
--Create a table to hold balls 
local ballTable = {} 

--Create spawns 
local function ballSpawn() 
    for i=1 ,1,1 do 
     local spawns = spawn(

      { 
      image = "ball.png", 
      Table = ballTable, 
      hasBody = true, 
      x = screenWidth * .378, 
      y = screenHeight * .638, 
      isVisible = true, 
      bodyType = "dynamic", radius = 5.5, density= 15.0, friction= 0.8, bounce = 0.0, 
      xVelocity = math.random(-687.5,-678), 
      yVelocity = math.random(595,645), 
      xScale = 0.16, yScale = 0.16, 
      group = sceneGroup, 
      } 
      ) 
    end 
end 

Dies ist mehr atypischer Teil des Codes, wo ich 3 oder 5 oder 25, ob es eine Taste für Taste Test, wenn je eine Kugel tun wollte, wenn i = 5 und Kugel: 3 kollidierte mit einem Kollisionstasche testen Ich wollte sicher gehen, dass alle Kollisionen gedruckt werden.

local function onPocketsCollision (event) 
local self = event.object2.id 
local other = event.object1.id 

    if event.phase == "began" then 

     for i = 1, #ballTable,1 do 
      if (self == ballTable[i].id and other == Pocket1.id) then 
       print(self .. " hit for " .. Pocket1.id) 
       ballTable[i]:removeSelf() 
       score.add(1) 
      end 
      if (self == ballTable[i].id and other == Pocket2.id) then 
       print(self .. " hit for " .. Pocket2.id) 
       ballTable[i]:removeSelf() 
       score.add(1) 
      end 
      if (self == ballTable[i].id and other == Pocket3.id) then 
       print(self .. " hit for " .. Pocket3.id) 
       ballTable[i]:removeSelf() 
       score.add(1) 
      end 
      if (self == ballTable[i].id and other == Pocket4.id) then 
       print(self .. " hit for " .. Pocket4.id) 
       ballTable[i]:removeSelf() 
       score.add(1) 
      end 
      if (self == ballTable[i].id and other == Pocket5.id) then 
       print(self .. " hit for " .. Pocket5.id) 
       ballTable[i]:removeSelf() 
       score.add(1) 
      end 
      if (self == ballTable[i].id and other == Pocket6.id) then 
       print(self .. " hit " .. Pocket6.id) 
       ballTable[i]:removeSelf() 
       score.add(-1) 
      end 
     end 
    end 
end 


Runtime:addEventListener("collision", onPocketsCollision) 

phantastisch genug, es funktioniert großartig, es war nur ein Fall ist es zur Verringerung nach unten, so dass es nicht wie Mist aussah ... Ich werde sicher sein, eine wenig Pflege in Zukunft zu übernehmen, wenn es darum geht, sharing code, muss ein poop Zeile für Zeile zu lesen sein ...

0
function createBalls() 
     for k = 1,100,1 do 
     ball = {} -- we do this every loop cycle!!! 
     ball[k] = display.newImage("ball.png") 
     ball[k].isVisible = false 
     ball[k].id = tostring("ball " ..i) 
     ball[#ball+1] = ball[k] 
     sceneGroup:insert(ball[#ball]) 
    end 
end 

Hier können Sie den globalen Variable Ball 100 Mal neu definieren.

Wenn Sie Ball in jedem Zyklus neu erstellen #ball wird immer 1 sein. So erstellen Sie eine Tabelle, fügen Sie verschiedene Werte zu Index k und 2, dann neu erstellen ... So ist Ihre globale Tabelle Ball völlig fertig.

In shootBall() verwenden Sie Index k, die nicht in der mitgelieferten Code definiert ist ...

Code Zeile für Zeile und darüber nachdenken, es gehen. Benutze einen Stift und zeichne einen Tisch ...

Bitte lesen Sie etwas über die Verwendung von lokalen Variablen in Lua !!!!

+0

Ich habe eine Rollback-Antwort auf mein anfängliches Problem geschrieben .... jeder würde den Grund für k ... Schlüssel verstehen .... v Wert .... s ... Suche, dies ermöglicht dem Endbenutzer zu gib so viele Bälle frei, wie sie wollen, es wird irgendwann eingeschränkt, aber der Tipp war definitiv aufschlussreich :) –

+0

@NealBarry Wenn du eine Anzahl von Kugeln spawnen willst, schreibe eine Funktion wie spawnBalls (numBalls) anstatt globale Variablen zu verwenden Stellen Sie die Anzahl der Bälle ein. Sie möchten die Anzahl der globalen Variablen so klein wie möglich halten. Überprüfen Sie Ihren bearbeiteten Code auf Tippfehler. Sie haben immer noch Fehler in Ihrer for-Schleife. – Piglet

+0

das ist tatsächlich geholfen, mir mehr von einer Idee der Annäherung zu geben, ich bin möglicherweise in meiner vierten Woche mit lua arbeiten, und sogar so viel hat mich erstaunt, kann persönlich nicht warten, C Funktionen aufrufen, nur um zu sehen, was passiert. ... –

Verwandte Themen