2013-05-14 2 views
1

Я пытаюсь в течение последних нескольких дней ставить простые столкновения в мою простую игру. Я смотрел во многих местах по всему Интернету, но я просто не нашел ничего полезного. Я просто использую ограничивающие поля, и все, что я хочу, чтобы ящик игрока делал, останавливается, когда он попадает в блок с любой из четырех сторон (и не застревает или не отказывается от блока). Звучит не так сложно, но я нашел это невероятно трудным. Я действительно хочу знать код, который мне нужно поставить в скобки if, я прочитал и услышал всю теорию, которую я могу взять. Пожалуйста, помоги, если можешь.Как справиться с столкновением после его обнаружения

if(bb_collide(player,block)){ //detection works just fine, 
             //just not sure what to do afterwards 


    } 
    else{ 
     player.setX((player.getX() + velx)); 
     player.setY((player.getY() - vely)); 
     player.set_coll(player.getX(),player.getY(),player.getWidth(),player.getHeight()); 
     block.set_coll(block.getX(),block.getY(),block.getWidth(),block.getHeight()); 

    } 

я на самом деле понял это, я просто имея пару плохих дней, извините, если у меня было как плохое отношение или что-то, но я получил это делать то, что я хотел. Вот что я сделал, если кому-то интересно, потому что он отлично работает, когда один движущийся объект (двигатель) натыкается на другой неподвижный объект (ситтера). Он находит расстояние между сторонами, которые будут сталкиваться, и устанавливает скорость на это расстояние минус несколько, поэтому он не перекрывается. У меня были рендеринг с ограничивающими прямоугольниками, поэтому я мог видеть, что они перекрываются. Спасибо за ваши ответы!

public void Fix_Vel(Player mover, Terrain sitter){ 

    if(sitter.coll_box.contains(mover.getX() + mover.getHeight() + mover.getVelX(), mover.getY()) || 
      sitter.coll_box.contains(mover.getX() + mover.getHeight() + mover.getVelX(), mover.getY() + mover.getHeight())){  //mover top right and bottom right coords right collision testing 

     mover.setVelX(sitter.getX() - (mover.getX() + mover.getWidth()) - 2); 

    } 

    if(sitter.coll_box.contains(mover.getX() + mover.getVelX(), mover.getY()) || 
      sitter.coll_box.contains(mover.getX() + mover.getVelX(), mover.getY() + mover.getHeight())){        //mover top left + bottom left coords left collision testing 

     mover.setVelX((sitter.getX() + sitter.getWidth()) - mover.getX() + 2); 

    } 

    if(sitter.coll_box.contains(mover.getX(), mover.getY() + mover.getVelY()) || 
      sitter.coll_box.contains(mover.getX() + mover.getWidth(), mover.getY() + mover.getVelY())){         //mover top left + top right coords top collision testing 

     mover.setVelY((sitter.getY() + sitter.getHeight()) - mover.getY() + 2); 


    } 

    if(sitter.coll_box.contains(mover.getX(), mover.getY() + mover.getHeight() + mover.getVelY()) ||        //mover bottom left and bottom right coords bottom collision testing 
      sitter.coll_box.contains(mover.getX() + mover.getWidth(), mover.getY() + mover.getHeight() + mover.getVelY())){ 

     mover.setVelY(sitter.getY() - (mover.getY() + mover.getHeight()) - 2); 
     jumping = false; 

     if(mover.getVelY() < 0) 
      mover.setVelY(0); 

    } 
} 
+0

Значит, вы хотите, чтобы предмет придерживался сталкивающегося элемента? –

ответ

0

Вы не говорите, как управляется каждый ящик, поэтому я не уверен точно, что вы хотите. Если обнаружение работает, просто не позволяйте движению объекта, если это вызовет столкновение.

PS: I really just wanna know the code that i need to put in the if statement's brackets, I've read and heard all the theory I can take. Чтобы быть честным, с таким отношением вы не достигнете очень далеко, и вам всегда будет нужна помощь людей. Для игрового программирования требуется достаточная математическая интуиция. Необходимы тригонометрия, исчисление и линейная алгебра.

0

Возможно, вы хотите сделать что-то подобное?

if(bb_collide(player,block)){ 
    velx = 0; 
    vely = 0; 
} 
else{ 
    player.setX((player.getX() + velx)); 
    player.setY((player.getY() - vely)); 
    player.set_coll(player.getX(),player.getY(),player.getWidth(),player.getHeight()); 
    block.set_coll(block.getX(),block.getY(),block.getWidth(),block.getHeight()); 

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