Zrobiłem sobie minigierkę w js i nie mogę sobie poradzić z jednym bugiem. Efekt jest taki, że jak ma się usunąć kilka obiektów na mapie niektóre z nich się freezują.
Funkcja odpowiadająca za obsługę tych obiektów wygląda nastepująco:
function updateBullets() {
//PLAYER 1 BULLETS
var bulletsToRemove1 = new Array();
bullets1.forEach(function(el,i){
if(el.x<=0) {
bulletsToRemove1.push({
index : i,
id : el.id
});
} else {
el.x-=50;
$(el.id).css('right',el.x+'px');
//COLLISION
if(
el.x<=x2+90&&
el.x+50>=x2-10&&
el.y+20>=y2-10&&
el.y<=y2+90
) {
bulletsToRemove1.push({
index : i,
id : el.id
});
hp2-=10;
if(hp2<=0) end(1);
}
}
});
bulletsToRemove1.forEach(function(el){
bullets1.splice(el.index,1);
$(el.id).remove();
});
//PLAYER 2 BULLETS
var bulletsToRemove2 = new Array();
bullets2.forEach(function(el,i){
if(el.x<=0) {
bulletsToRemove2.push({
index : i,
id : el.id
});
} else {
el.x-=50;
$(el.id).css('left',el.x+'px');
//COLLISION
if(
el.x<=x1+90&&
el.x+50>=x1-10&&
el.y+20>=y1-10&&
el.y<=y1+90
) {
bulletsToRemove2.push({
index : i,
id : el.id
});
hp1-=10;
if(hp1<=0) end(2);
}
}
});
bulletsToRemove2.forEach(function(el){
bullets2.splice(el.index,1);
$(el.id).remove();
});
}
Mam dwie tablice i dwie pętle na każdego gracza. Jedna tablica przechowuje identyfikatory i współrzędne obiektu a druga przechowuje identyfikator i index elementu z pierwszej tablicy do usunięcia. Pierwsza pętla aktualizuje pozycje obiektu oraz wykrywa kolizje oraz wykrywa które obiekty usunąć i zapisuje je do drugiej tablicy. Druga petla po prostu usuwa wskazane elementy tylko tu jest problem bo czasami usuwa nie te elementy co trzeba albo wogóle nie usuwa. Napewno to ma związek z tym że przy każdym usunięciu elementy się przesuwają i nie trafia w ten element ale nie mam pojęcia jak zrobić by wskazało właściwy element do usunięcia.
Tu link do mojej gry, można zobaczyć cały kod wszystko działa po stronie klienta.
http://marcin-kalinowski.pl/games/StarDuel/index.html