2017-12-07 4 views
1

Canvas API 게임에서 작업 중이고 적의 새 인스턴스를 만들 때마다 새로운 위치를 만들 때마다 적을 만들고 싶습니다. .이 공의 Y 위치, 임의 인 X 위치와 속도 인수로 새로운 적을 만들어매번 무작위 인수를 취하는 JavaScript 함수

var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256); 

:하지 무작위가 아니라 3 특정 위치

를 그래서 나는이 기능을 가정 해 봅시다 그것도 무작위입니다.

이것은 잘 작동하지만 나는 원수를 원합니다. 3 개의 특정 위치에서만 만들어지며 새로운 적의 인스턴스가 생성 될 때마다 속도가 10 씩 증가합니다.

더 많은 정보를 원하시면 : 내가 원하는 것은 다른 인수 때마다 새로운 적을 만드는 방법이

var increaseDifficulty = function(numEnemies) { 
    // remove all previous enemies on canvas 
    allEnemies.length = 0; 

    // load new set of enemies 
    for (var i = 0; i <= numEnemies; i++) { 
     var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256); 

     allEnemies.push(enemy); 
    } 
}; 

입니다 : 플레이어가과 같이, 승리의 최종 위치에의를 일단 새 원수가 호출되고있다 . 위치와 속도에 대해서만.

뭔가 같은 :

var enemy = new Enemy(0, 1, 1); 

가이 다를 수 있습니다 호출되는 두 번째 시간이 너무 : 물론

var enemy = new Enemy(0, 3, 2); 

는 값은 2, 1 일 3하지만하지 않습니다 아이디어를 얻으십시오.

UPDATE :이시
새로운 적 통화 :

var Enemy = function(x, y, speed) { 
    this.x = x; 
    this.y = y; 
    this.speed = speed; 
    this.sprite = 'images/enemy-bug.png'; 
}; 

Enemy.prototype.update = function(dt) { 
    this.x += this.speed * dt; 
    if (this.x >= 505) { 
     this.x = 0; 
    } 

    checkCollision(this); 
}; 
Enemy.prototype.render = function() { 
    ctx.drawImage(Resources.get(this.sprite), this.x, this.y); 
}; 
+0

'다른 표현식'이란 무엇입니까? – MUT

+0

나는 "논쟁"을 말하려고했다. 죄송합니다. 질문을 수정했습니다. – Sparrky

+0

달성하고자하는 것이 명확하지 않습니다. 어려움이 증가 할 때 얼마나 많은 적을 창조하고 있습니까? 좀 더 구체적으로'for' 루프는 몇 번 반복합니까? 얼마나 많은 사람들을 실제로 만들고 싶습니까? 삼? 또는 1,하지만 무작위로 어딘가에 처음에 (당신이 모든 것을 초기화 할 때) 생성 3 위치에서 임의로 선택하려면? 첫 번째 적을 어떻게 만듭니 까? – Adelin

답변

1

Y은 항상 0이므로 생성자에 전달하는 포인트가 없으므로 speed에는 시작 값이 있으며 항상 전달되는 포인트가 없도록 항상 10 씩 증가됩니다. X은 무작위 적으로 생성자에게 전달할 때가 있지만, 그렇게하지는 않습니다. 나는 X의 가능한 값의 배열을 만들고 무작위로 생성자 내부에서 그 중 하나를 선택합니다.

const xValues = [20, 60, 100]; 
 

 
//The Enemy "class": 
 
function Enemy() { 
 
    this.y = 0; 
 
    this.x = xValues[Math.floor(Math.random() * xValues.length)]; 
 
    Enemy.speed = (Enemy.speed += 10) || 10; 
 
    this.speed = Enemy.speed; 
 
    this.sprite = 'images/enemy-bug.png'; 
 
} 
 

 
let e1 = new Enemy; 
 
console.log(e1); 
 
let e2 = new Enemy; 
 
console.log(e2); 
 
let e3 = new Enemy; 
 
console.log(e3);

주 1

:Math.floor(Math.random() * xValues.length)는 랜덤 정수 합니다 (Math.floor 덕분) 번호 0 내지 제 xValues 어레이의 길이를 생성한다. 이 숫자는 xValues 배열에서 임의 값을 선택하는 데 사용됩니다.

주 2 : NaN는 평가가 10 계속 falsy 때문에이 라인에 나는, 그래서 Enemy.speed += 10NaN로 평가 존재하지 않는 첫 번째 Enemy.speed에서 (10)의 시작 값과 변수 클래스 같은 Enemy.speed을 만들;

Enemy.speed = (Enemy.speed += 10) || 10; 

그런 다음이 값을 인스턴스에 복사합니다.

this.speed = Enemy.speed; 
0

나는 전체 프로젝트를 모르는, 그래서 이것은 단지 예/초안 :

const createEnemiesFactory = pos => { 
    let lastPos = -1; 
    let lastSpeed = 0; 
    return() => { 
     lastPos = (lastPos + 1) % pos.length; 
     lastSpeed += 10; 
     return new Enemy(pos[lastPos].x, pos[lastPos].y, lastSpeed); 
    }; 
}; 

let enemiesFactory = createEnemiesFactory([ 
    {x: 0, y: 0}, 
    {x: 10, y: 10}, 
    {x: 20, y: 20} 
]); 

var increaseDifficulty = function(numEnemies) { 
    // remove all previous enemies on canvas 
    allEnemies.length = 0; 

    // load new set of enemies 
    for (var i = 0; i <= numEnemies; i++) { 
     allEnemies.push(enemiesFactory()); 
    } 
}; 

작은주의 사항 : lastSpeed을 다시 설정할 수있는 방법이 없기 때문에 어려움을 다시 시작해야하는 경우 (다시 시작할 때) 적의 공장을 재현하는 것보다 분명히 재현하십시오.

관련 문제