我正在尝试制作一个基本的游戏,在该游戏中,碰到一个物体会使玩家丧命。我编写代码的方式是,每次物体和玩家接触时都会发生这种情况。我希望玩家只失去一种生命,而不是全部。知道如何解决吗?谢谢
void colision() {
for ( int i = 0; i<cant; i++ ) {
if ( personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2) {
//if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){
personaje.restarVida();
personaje.reiniciar();
}
}
}
最佳答案
凯文(Kevin)提出的将角色击退的建议非常好:这样可以确保每次碰撞仅一次满足碰撞条件,而不会连续不断直到角色移开为止。您可能需要在发生碰撞之前存储先前的位置。
无需变回字符的另一种变体是具有一个布尔变量,该变量可以跟踪先前是否命中过字符。然后,您仅可以在角色当前被命中但之前未被命中的情况下减去生命。
这是一个基于您的代码的概念证明片段:
void colision() {
for ( int i = 0; i < cant; i++ ) {
boolean estChocando = personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2;
if (estChocando && !personaje.estabaChocando) {
//if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){
personaje.restarVida();
personaje.reiniciar();
// remember the character was hit, so this condition won't be met the next time around
personaje.estabaChocando = true;
}
// reset character was hit flag if no longer colliding
if(!estChocando && personaje.estabaChocando){
personaje.estabaChocando = false;
}
}
}
假设您已经在字符类中定义了
boolean estabaChocando;
。就我个人而言,我会接受凯文(Kevin)的建议,即在视觉上容易理解该角色,将其打回游戏,增加游戏的物理/真实感,并且在许多经典游戏中如此普遍,基本上是affordance。
这是基于上述内容的示例:
void colision() {
for ( int i = 0; i < cant; i++ ) {
boolean estChocando = personaje.x > o[i].x && personaje.x < o[i].x + o[i].tam &&
personaje.y > o[i].y && personaje.y < o[i].y + o[i].tam/2;
if (estChocando) {
//if( dist(personaje.x, personaje.y, o[i].x, o[i].y ) < (personaje.ph/2 + o[i].tam/2) ){
personaje.restarVida();
personaje.reiniciar();
// restore character to last non-collision position
personaje.x = personaje.px;
personaje.y = personaje.py;
}
// update position to restore to
if(!estChocando){
personaje.px = personaje.x;
personaje.py = personaje.y;
}
}
}
上面假设您要在字符类(从中实例出
px
)的py
和x
旁边添加y
和personaje
属性。这个特定的实现可能是防弹的,因为它没有考虑角色和游戏对象朝哪个方向移动。
另一种方法是开始using vectors,一开始可能会让人感到恐惧,但是它们真的很有趣,并且对于整个游戏开发超级有用。
如果要使用矢量,则可以轻松地以负速度(甚至是其倍数)增加角色的位置,以沿相反的行进方向踢角色(一定量):