나는 첫 번째 자바 스크립트 캔버스 게임을 작업 중이며 두 배열의 객체 간 충돌을 비교하는 더 좋은 방법이 있는지 궁금합니다. 예를 들어 로켓 배열과 적 배열이 있으면 코드가 작동하지만 배열 길이가 훨씬 커지면 성능에 영향을 미칠 것이라고 생각합니다. 100 개의 적을 통과하는 100 개의 로켓은 프레임 당 10000 번의 반복입니다.
for (i in rockets){
rockets[i].x+=projectile_speed;
for (j in enemies){
if(collision(rockets[i], enemies[j])){
enemies[j].health-=5;
sound_hit[hit_counter-1].play();
hit_counter--;
if (hit_counter==0){
hit_counter=5;
}
rockets.splice(i,1);
if (enemies[j].health <= 0) {
score += enemies[j].score;
sound_explode[Math.floor(Math.random()*25)].play();
enemies[j].isDead = true;
}
} else if(rockets[i].x >= width){
rockets.splice(i,1);
}
}
}
모든 플레이어의 모든 로켓을 테스트하고 싶다면 플레이어와 로켓의 위치에 대해 더 많이 알지 못하면 실제로 다르게 할 수는 없습니다.
collision
함수를 빠르게 유지한다면 전혀 문제가되지 않습니다.
나는 이것에 대해 두 가지 쉬운 개선을 생각할 수 있습니다.
continue
되면 나머지 플레이어를 반복 할 필요가 없어야합니다 (플레이어가 충돌하도록 허용되지 않는 한).또한 사용을 고려해야합니다 forEach
, map
및 filter
코드 A가 쉽게 읽을 비트 만들기 위해 :
rockets = rockets.filter(function(rocket) {
rocket.x+=projectile_speed;
if(rocket.x >= width) {
return false;
}
var enemy = enemies.find(function(enemy) { return collision(rocket, enemy) });
if(enemy) {
enemy.health-=5;
sound_hit[--hit_counter].play();
if (hit_counter==0){
hit_counter=5;
}
if (enemy.health <= 0) {
score += enemy.score;
sound_explode[Math.floor(Math.random()*25)].play();
enemy.isDead = true;
}
return false;
}
return true;
});
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다