2016-08-06 2 views
0

Я создаю 2d-игру, используя Corona, чтобы практиковать кодирование, и я застрял в проблеме. Задняя часть одного из врагов в игре имеет форму ухабистого слайда (вроде), когда мой персонаж наносит врагу на спину, он начинает соскальзывать с экрана. Когда противник попадает, игра переключается на другой экран и переключается обратно.Мой персонаж сместился с экрана, несмотря на то, что он был перепозиционирован, и я не уверен, почему

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

Это видео, которое показывает, что происходит, около 40 или 45 секунд вы увидите символ начинает скользить.

Я пробовал несколько вещей, чтобы исправить это, и коэффициент отказов врагов и игрока установлен на ноль. Я попробовал установить линейнуюValocity координаты x игрока равным нулю, но это не сработало. Это мой код для обнаружения столкновений.

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 

ответ

0

Я просто упростили код для вас

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

Этот сценарий я переписывал может быть упрощена больше, однако я не хочу, чтобы изменить логику вы съемки для: р –

+0

Спасибо вы, но, как вы думаете, вы могли бы помочь мне с этой проблемой столкновения? – alexjr

+0

Я обновил код, чтобы показать, как я порожу врагов. У меня есть система подсчета очков, которая дает точки пользователя, когда объект достигает координаты x. Может ли это быть упрощенным, чтобы соответствовать моим потребностям? – alexjr

Смежные вопросы