2017-01-24 13 views
0

Итак, я создал базовую систему столкновений в love2D, используя базовый ООП.Столкновение и ООП в lua

function love.update(dt) 
    player:update(dt) 
    for _, rect in pairs(randomRectangles) do 
     local collides,mtv,side = collider:collidesMTV(player,rect) 
     if collides then 
      print(side) 
      player:collide(collides,mtv,side) 
     end 
    end 
end 

МТВ быть минимальный перевод, чтобы переместить часть, когда она сталкивается, а сторона является стороной она сталкивается с.

Проблема заключается в том, я хочу быть в состоянии сделать это так, в плеере: сталкиваюсь функции, как показано здесь:

function player:collide(colliding,mtv,side) 
    if colliding==true and side=="top" or colliding==true and side == "bottom" then 
     self.Position=self.Position-mtv 
    end 
    if colliding==true and side=="left" or colliding==true and side == "right" then 
     self.Position=self.Position-mtv 
     self.Gravity=-0.1 
    end 
    if not colliding and self.Gravity ~= -0.95 then 
     self.Gravity=-0.95 
    end 
end 

я могу сделать это так, когда это не сталкивающееся, он устанавливает гравитацию обратно нормальный, но если я добавлю elseif/else заявление внутри, когда он не сталкивается, он также будет делать это, если он сталкивается с одним блоком, так как на экране есть еще 30 других блоков и не будет устанавливать силу тяжести на -0.1, всегда будем возвращать его к нормальной гравитации, если это имеет смысл.

Как это исправить?

ответ

1

Возможно, просто извлеките поведение столкновений вне метода collide? Вот идея:

function player:collide(colliding,mtv,side) 
    if colliding==true and side=="top" or colliding==true and side == "bottom" then 
     self.Position=self.Position-mtv 
    end 
    if colliding==true and side=="left" or colliding==true and side == "right" then 
     self.Position=self.Position-mtv 
     self.hasSideCollision = true 
    end 
end 

function player:computeGravity() 
    if player.hasSideCollision then 
     self.Gravity = -0.1 
    else 
     self.Gravity = -0.95 
    end 
end 

function love.update(dt) 
    player:update(dt) 
    player.hasSideCollision = false 

    for _, rect in pairs(randomRectangles) do 
     local collides,mtv,side = collider:collidesMTV(player,rect) 
     if collides then 
      print(side) 
      player:collide(collides,mtv,side) 
     end 
    end 

    player:computeGravity() 
end 

Работа с гравитацией должна решаться на уровне игрока, а не отдельные столкновения х.

EDIT

Взял направление во внимание и переехал гравитационные логики в свой собственный метод.

+0

Но я имею дело с ним на уровне игрока (если вы имеете в виду внутри файла player.lua)? love.update находится в совершенно другом файле - файле main.lua. – Ducktor

+0

Прошу прощения, мой комментарий был не очень ясен! Я имел в виду, что это не должно рассматриваться в каждом отдельном столкновении. Я обновлю свое решение, так как не заметил, что направление столкновения важно. – SolarBear

+0

Спасибо, теперь он отлично работает! – Ducktor