2016-08-06 58 views
0

Ich erstelle ein 2D-Spiel mit Corona, um Codierung zu üben, und ich stecke auf ein Problem fest. Der Rücken eines der Feinde im Spiel ist wie eine holprige Rutsche geformt (irgendwie), wenn mein Charakter den Gegner auf seinem Rücken trifft, beginnt es vom Bildschirm zu rutschen. Wenn ein Gegner getroffen wird, wechselt das Spiel zu einem anderen Bildschirm und schaltet zurück.Mein Charakter gleitet vom Bildschirm, obwohl er neu positioniert wird und ich bin nicht sicher, warum

https://www.youtube.com/watch?v=xGoZ1jEG0YA&feature=youtu.be

Dies ist ein Video, das zeigt, was, 40 oder 45 Sekunden bei um geschieht sehen Sie das Zeichen zu gleiten beginnen.

Ich habe mehrere Dinge ausprobiert, um dies zu beheben, sowohl der Bounce-Faktor der Feinde und der Spieler ist auf Null gesetzt. Ich habe versucht, die lineare Velocity der x-Koordinate des Spielers auf Null zu setzen, aber das hat nicht funktioniert. Dies ist mein Code für die Kollisionserkennung.

function spawnEnemies() 
     temp = math.random(1, 4) 
      enemy = display.newSprite(beetle, beetleSequenceData) 
      enemy.x = _R + 100 
      enemy.y = _CY 
      enemy.hasBeenScored = false 
      physics.addBody(enemy, "dynamic", physicsData:get("beetle")) 
      enemy.xScale = -1 
      enemy.id = "enemy" 
      enemy.isFixedRotation = true 
      enemy:play() 
      group:insert(enemy) 

      enemy2 = display.newSprite(vulture, vultureSequenceData) 
      enemy2.x = _R + 100 
      enemy2.y = _CY - (enemy2.height * 0.25) 
      enemy2.hasBeenScored = false 
      physics.addBody(enemy2, "dynamic", physicsData:get("vulture")) 
      enemy2.xScale = -1 
      enemy2.gravityScale = -0.01 
      enemy2.id = "enemy2" 
      enemy2.isFixedRotation = true 
      enemy2:play() 
      specialGroup:insert(enemy2) 

      enemy3 = display.newSprite(scorpion, scorpionSequenceData) 
      enemy3.x = _R + 100 
      enemy3.y = _CY 
      enemy3.hasBeenScored = false 
      physics.addBody(enemy3, "dynamic", physicsData:get("scorpion")) 
      enemy3.xScale = -1 
      enemy3.id = "enemy3" 
      enemy3.isFixedRotation = true 
      enemy3:play() 
      group:insert(enemy3) 

      enemy4 = display.newSprite(bee, beeSequenceData) 
      enemy4.x = _R + 100 
      enemy4.y = _CY - (enemy4.height * 0.25) 
      enemy4.hasBeenScored = false 
      physics.addBody(enemy4, "dynamic", floatingEnemies:get("bee")) 
      enemy4.xScale = -1 
      enemy4.gravityScale = -0.01 
      enemy4.id = "enemy4" 
      enemy4.isFixedRotation = true 
      enemy4:play() 
      specialGroup:insert(enemy4) 

      if temp == 1 then 
       enemy2:removeSelf() 
       enemy3:removeSelf() 
       enemy4:removeSelf() 
      elseif temp == 2 then 
       enemy:removeSelf() 
       enemy3:removeSelf() 
       enemy4:removeSelf() 
      elseif temp == 3 then 
       enemy:removeSelf() 
       enemy2:removeSelf() 
       enemy4:removeSelf() 
      else 
       enemy:removeSelf() 
       enemy2:removeSelf() 
       enemy3:removeSelf() 
      end 
    end 

    function moveEnemies() 
     for a = group.numChildren, 1, -1 do 
      if group[a].x < 100 then 
       if group[a].hasBeenScored == false then 
        updateScore() 
        group[a].hasBeenScored = true 
       end 
      end 
      if group[a].x > _L - 100 then 
       group[a].x = group[a].x - 8 
      else 
       group:remove(group[a]) 
      end 
     end 
     for b = specialGroup.numChildren, 1, -1 do 
      if specialGroup[b].x < 100 then 
       if specialGroup[b].hasBeenScored == false then 
        specialUpdateScore() 
        specialGroup[b].hasBeenScored = true 
       end 
      end 
      if specialGroup[b].x > _L - 100 then 
       specialGroup[b].x = specialGroup[b].x - 8 
      else 
       specialGroup:remove(specialGroup[b]) 
      end 
     end 
    end 

function onCollision(event) 
     local function removeOnPlayerHit(obj1, obj2) 
      if(obj1 ~= nil and obj1.id == "enemy") then 
       display.remove(obj1) 
      end 
      if(obj2 ~= nil and obj2.id == "enemy") then 
       display.remove(obj2) 
      end 
      if(obj1 ~= nil and obj1.id == "enemy2") then 
       display.remove(obj1) 
      end 
      if(obj2 ~= nil and obj2.id == "enemy2") then 
       display.remove(obj2) 
      end 
      if(obj1 ~= nil and obj1.id == "enemy3") then 
       display.remove(obj1) 
      end 
      if(obj2 ~= nil and obj2.id == "enemy3") then 
       display.remove(obj2) 
      end 
      if(obj1 ~= nil and obj1.id == "enemy4") then 
       display.remove(obj1) 
      end 
      if(obj2 ~= nil and obj2.id == "enemy4") then 
       display.remove(obj2) 
      end 
     end 

     local function showPlayerHit() 
      local tmr_onPlayerHit = timer.performWithDelay(1, playerHit, 1) 
     end 

     if event.phase == "began" then 
      if((event.object1.id == "enemy" or event.object1.id == "enemy2" or event.object1.id == "enemy3" or event.object1.id == "enemy4") and event.object2.id == "character") then 
       showPlayerHit() 
       removeOnPlayerHit(event.object1, nil) 
      elseif(event.object1.id == "character" and (event.object2.id == "enemy" or event.object2.id == "enemy2" or event.object2.id == "enemy3" or event.object2.id == "enemy4")) then 
       showPlayerHit() 
       removeOnPlayerHit(nil, event.object2) 
      end 
     end 
    end 

Antwort

0

ich vereinfacht nur den Code für Sie

-- utility function 
function isInArray(a, s, t) 
    local g = {} 
    for k, v in pairs(a) do 
     if t then 
      if v ~= s then 
       table.insert(g, v) 
      end 
     else 
      if v == s then 
       return true 
      end 
     end 
    end 
    return t and (#g > 0 and g or false) or false 
end 

-- this will hold all the enemies names 
local enemies = {} 
-- this function creates all the enemies 
function createEnemies(name, number) 
    for i = 1, number do 
     table.insert(enemies, i, name..i) 
    end 
end 

-- now lets create the enemies, 4 enemies in total with the name enemy+n 
-- e.g. enemy1, enemy2 etc.. for value of number 
createEnemies('enemy', 4) 


function onCollision(event) 
    local function removeOnPlayerHit(obj1, obj2) 
     -- see if either of the arguments are nil 
     local objects = isInArray({obj1, obj2}, nil, true) 
     -- now check if objects contains any of the objects 
     if next(objects) then 
      -- if it does cycle through them 
      for i = 1, #objects do 
       -- now check against all the enemies 
       if isInArray(enemies, objects[i].id) then 
        -- now remove the objects 
        display.remove(objecta[i]) 
       end 
      end 
     end 
    end 

    local function showPlayerHit() 
     local tmr_onPlayerHit = timer.performWithDelay(1, playerHit, 1) 
    end 
    if event.phase == "began" then 
     if isInArray(enemies, event.object1.id) and event.object2.id == "character" then 
      showPlayerHit() 
      removeOnPlayerHit(event.object1, nil) 
     elseif isInArray(enemies, event.object2.id) and event.object1.id == "character" then 
      showPlayerHit() 
      removeOnPlayerHit(nil, event.object2) 
     end 
    end 
end 
+0

Das obige Skript I-re schrieb mehr vereinfacht werden, jedoch wollte ich nicht die Logik, die Sie für drehten sich ändern: p –

+0

Thank Sie glauben aber, Sie könnten mir bei diesem Kollisionsproblem helfen? – alexjr

+0

Ich habe den Code aktualisiert, um zu zeigen, wie ich die Gegner spawne. Ich habe ein Punktesystem, das dem Benutzer Punkte gibt, wenn ein Objekt eine x-Koordinate erreicht. Kann dies vereinfacht werden, um meine Bedürfnisse zu erfüllen? – alexjr