我目前正在开发一个侧滚动器,我的玩家可以射击,敌人也可以。如果我击中敌人,它就会消失。不幸的是,它并不总是有效的。有时是,有时不是。有时,它的工作原理非常像这里:
Ennemi 30 =eX:37 - eY:51
Shot 12=sX:37 - sY:52
====
BOUM
由于某些原因,我的子弹正好穿过敌人,就像它不存在一样。
以下是我检测碰撞的方法:
void checkCollisionShot(ListShot* list,ListEnnemy* listE){
if (list == NULL || listE == NULL){
exit(EXIT_FAILURE);
}
Shot *getSh=list->first;
Ennemy *getEn=listE->first;
if (list->first!= NULL && listE->first!=NULL)
{
int i,j;
for(i=0;i<list->nbr;i++){
int sX=getSh->obj.posi.x;
int sY=getSh->obj.posi.y;
for(j=0;i<listE->nbr;i++){
int eX=getEn->obj.posi.x;
int eY=getEn->obj.posi.y;
if(getEn->obj.friend!=getSh->obj.friend){
if(sX<eX+3 && sX>=eX){
if(sY<eY+3 && sY>=eY){
printf("Boumn");
deleteEnnemy(listE,eX,eY);
deleteShot(list,sX,sY);
}
}
}
getEn=getEn->next;
}
getSh=getSh->next;
}
}
}
我使用的是简单的链表:一个用于射击,另一个用于敌人。我一个接一个地浏览每个元素,并将列表中的每个元素与另一个列表的位置进行比较。
错误是来自这个函数,还是来自某个GLut函数(类似于刷新函数(?
好的,我找到了!每个循环都应该重置getEn的声明。代码现在看起来是这样的:
void checkCollisionShot(ListShot* list,ListEnnemy* listE){
if (list == NULL || listE == NULL)
{
exit(EXIT_FAILURE);
}
Shot *getSh=list->first;
//GETEN IS NOT HERE ANYMORE<-----------------------------
if (list->first!= NULL && listE->first!=NULL)
{
while(getSh!=NULL){
int sX=getSh->obj.posi.x;
int sY=getSh->obj.posi.y;
Ennemy *getEn=listE->first;//<------------------THE DIFFERENCE IS HERE
while(getEn!=NULL){
int eX=getEn->obj.posi.x;
int eY=getEn->obj.posi.y;
if(getEn->obj.friend!=getSh->obj.friend){
if(sX<eX+3 && sX>=eX){
if(sY<eY+3 && sY>=eY){
//exit(0);
printf("nnBOUMn");
deleteEnnemy(listE,eX,eY);
deleteShot(list,sX,sY);
break;
}
}
}
getEn=getEn->next;
}
getSh=getSh->next;
}
}
}
记录中,只有ListShot的第一个元素与ListEnnemy的每个元素进行了比较。现在,每个物体都被相互比较。