2013-03-22 6 views
1

나는 나의 캔버스 (단지 연습)에서 kineticJS로 간단한 게임을 만들려고 노력 중이며 내 플레이어가 총알을 쏘도록했다. 산란 된 원수도 마찬가지입니다. 그들은 마지막 총탄이 무대를 떠날 때마다 총알을 쏜다.각 적으로부터 정해진 시간에 총알 세 개를 쏴라.

그러나 : 모든 적 (가변 수)이 2 초 간격으로 3 개의 총알을 쏘고 싶습니다. 하지만 난 완전히 붙어있어 어떻게 할 수있는 방법을 이해할 수 없다.

아무도 내 피들을보고 무슨 일이 일어나는지 보지 않겠습니까? http://jsfiddle.net/eRQ3P/6/

참고 : (바이올린에 선 406)

function Enemybullet(destinationX, destinationY, enemySprite) { 

    this.id = 'bullet'; 
    this.x = enemySprite.getX()+(enemySprite.getWidth()/2); 
    this.y = enemySprite.getY()+(enemySprite.getHeight()/2); 

    var targetX = destinationX - this.x, 
     targetY = destinationY - this.y, 
     distance = Math.sqrt(targetX * targetX + targetY * targetY); 

    this.velX = (targetX/distance) * 5; 
    this.velY = (targetY/distance) * 5; 

    this.finished = false; 

    this.sprite = new Kinetic.Circle({ 
     x: this.x, 
     y: this.y, 
     radius: 3, 
     fill: 'black', 
     name: 'enemyProjectile' 
    }); 

    this.draw = function(index) { 

     var mayDelete = false; 

     this.x += this.velX; 
     this.y += this.velY; 

     this.sprite.setAbsolutePosition(this.x, this.y); 
     //console.log(this.sprite.getX()); 

/* 
     if(enemyCollision(this) == true) { 
      mayDelete = true; 
     }*/ 

     if (bulletLeftField(this.sprite) == true) { 
      mayDelete = true; 
     } 

     if (mayDelete == true) { 
      this.sprite.remove(); 
      enemies[index].bullets.splice(0, 1); 
      createEnemyBullet(enemies[index]); 
     } 



     ammoLayer.draw(); 
    } 
} 
: 라인 573 루프 (그리고 글 머리 기호 및 같은 모든 30FPS 무)

여기 내가 새로운 총알 객체를 생성 코드의를하는 기능입니다

그리고 함수는 새로운 총알 제공 : (바이올린 라인 247)

function createEnemyBullet(enemy) { 
    var blt = new Enemybullet(player.sprite.getX(), player.sprite.getY(), enemy.sprite); 
    ammoLayer.add(blt.sprite); 
    enemy.bullets.push(blt); 
} 

답변

1

은 아마이 문제의 가장 어려운 부분이다 각 탄환을 그릴시기를 알아내어 매 3 초마다 3 발을 발사합니다. 총알이 고르게 발사되도록하려면 간격의 프레임 수를 해당 간격으로 발사 할 총알 수로 나눕니다.

초당 30 프레임으로 게임을 실행하기 때문에 2 초는 60 프레임과 동일합니다. 그래서

60 frames/3 bullets = 20 frames/bullet

, 우리는 매 20 프레임 또는 매 20 시간 refreshLoop()가 호출 될 때마다 적을위한 새로운 총알을 만들려고하고, refreshLoop() 내부, 이제 총알 각각의 모든을 통해 루프가 적이 이제는 하나 이상일 수 있기 때문에 적이 bullets 배열에 있습니다.

bullets 배열에 둘 이상의 글 머리 기호가있을 수 있다는 사실은 글 머리 기호가 배열에서 제거되는 방식에 새로운 문제를 초래합니다. 이전에는 한 번에 하나의 글 머리가 항상 배열의 첫 번째 글 머리임을 의미하므로 코드는 bullets.splice(0, 1);입니다. 그러나 플레이어가 움직이고 있고 다른 위치에서 적을 공격하면 총알을 화면에서 나오고 그 전에 발사 된 것보다 빨리 제거 할 수 있습니다. 이로 인해 정확한 글 머리 기호 스프라이트가 제거되지만 배열의 첫 번째 글 머리 기호는 bullets에서 제거되므로 더 이상 refreshLoop()에 업데이트되지 않으며 아무 것도하지 않는 채 화면에 표시됩니다.

이것을 피하려면, 총알 'draw()에 총알이 그려지는 bullets의 색인 기능을 전달해야합니다. 어쨌든 배열을 반복해야하기 때문에 색인은 이미 refreshLoop()에 있으므로 draw()으로 전달하십시오. 이제 총알을 제거해야 할 때마다 전화 할 수 있습니다. bullets.splice(bulletIndex, 1);

괜찮 았으면 좋겠어요. fiddle을 아래에 나열된 변경 사항으로 업데이트했습니다.

편집 : 대신 지속적인 화재 폭발 화재에 대한 새로운 fiddle.

// Inside your Enemybullet definition 
// One simple change to draw(), pass in the index of the bullet in the array 
this.draw = function(indexEnemy, indexBullet) { 

    var mayDelete = false; 

    ... 

    if (bulletLeftField(this.sprite) == true) { 
     mayDelete = true; 
    } 

    if (mayDelete == true) { 
     this.sprite.remove(); 

     // Since you now have multiple bullets, you'll have to make 
     // sure you're removing the correct one from the array 
     enemies[indexEnemy].bullets.splice(indexBullet, 1); 
    } 

    ammoLayer.draw(); 
} 

... 

// Inside your refreshLoop function 
// If there are enemies they should be checked 
if (enemies.length > 0) { 
    for (var i = 0; i < enemies.length; i++) { 
     enemies[i].draw(); 

     // At 30 frames per second, 3 bullets in 2 seconds would be 
     // one bullet for every 20 frames. So, every 20 frames, 
     // create a new bullet for each enemy 
     if ((enemyShootTimer % 20) == 0) { 
      createEnemyBullet(enemies[i]); 
     } 

     // The same way you draw all of the player's bullets, 
     // loop through the array of bullets for this enemy, 
     // and draw each one, passing in the new parameters 
     if (enemies[i].bullets.length > 0) { 
      for (var j = 0; j < enemies[i].bullets.length; j++) { 
       enemies[i].bullets[j].draw(i, j); 
      } 
     } 
    } 
} 

// Update loop for burst-fire instead of sustained fire 
var burstTime = 10; // 10 frames between bullets, 3 per second 
var needToShoot = ((enemyShootTimer % burstTime) == 0); 
if (enemies.length > 0) { 
    for (var i = 0; i < enemies.length; i++) { 
     enemies[i].draw(); 

     // if the enemies still have bullets to shoot this burst 
     // and if 10 frames have passed since the last shot 
     // (enemyBurstCounter is declared outside refreshLoop()) 
     if (enemyBurstCounter < 3 && needToShoot) { 
      createEnemyBullet(enemies[i]); 
     } 
     if (enemies[i].bullets.length > 0) { 
      for (var j = 0; j < enemies[i].bullets.length; j++) { 
       enemies[i].bullets[j].draw(i, j); 
      } 
     } 
    } 
    if ((enemyShootTimer % 60) == 0) { 
     enemyBurstCounter = 0; // if 2 seconds have passed, reset burst counter 
    } else if (needToShoot) { 
     enemyBurstCounter++; // if the enemies shot, update burst counter 
    } 
} 
+0

이 경우 나를 거의 실패시킨 타이밍 논리였습니다. 그러나 총알은 일정한 간격으로 촬영되지만 3 (팝, 팝, 팝 ... 기다림 ... 팝, 팝, 팝 ... 등)의 쌍이 아닌 것 같습니다. – CaptainCarl

+1

나는 실제로 당신이 원했던 것일 수도 있습니다 ... 대신 그걸로 업데이트하겠습니다. – jonhopkins

+0

새로운 피들로 답을 수정하고 하단에 변경된 코드를 추가했습니다. – jonhopkins

관련 문제