2016-10-02 32 views
0

所以我試圖做一個簡單的空間遊戲。你將會有一艘左右移動的船隻,隨機的X位置和尺寸將在帆布頂部以上產生小行星,並且它們會向船上移動。使相同的對象在Javascript Canvas中獨立移動

如何在獨立位置創建Asteroid對象?就像在畫布上同時存在多個對象一樣,而不是將它們創建爲具有獨立變量的完全獨立的對象?

這設置我想要創建小行星的變量。

var asteroids = { 
size: Math.floor((Math.random() * 40) + 15), 
startY: 100, 
startX: Math.floor((Math.random() * canvas.width-200) + 200), 
speed: 1 
} 

這是我用來畫小行星的東西。 (它使具有隨機尺寸的六邊形形狀,在一個隨機的x座標)

function drawasteroid() { 
this.x = asteroids.startX; 
this.y = 100; 
this.size = asteroids.size; 
ctx.fillStyle = "#FFFFFF"; 

ctx.beginPath(); 
ctx.moveTo(this.x,this.y-this.size*0.5); 
ctx.lineTo(this.x+this.size*0.9,this.y); 
ctx.lineTo(this.x+this.size*0.9,this.y+this.size*1); 
ctx.lineTo(this.x,this.y+this.size*1.5); 
ctx.lineTo(this.x-this.size*0.9,this.y+this.size*1); 
ctx.lineTo(this.x-this.size*0.9,this.y); 
ctx.fill(); 

}

我包括所有我的代碼在這個段中。一旦運行它,你會看到我目前有一艘移動的小船,小行星以隨機大小和隨機x座標繪製。我只需要知道如何去做小行星移動,同時創造其他新的小行星,也將下移。

謝謝你的一切幫助!我是新來的JavaScript。

// JavaScript Document 
 

 
////// Variables ////// 
 
var canvas = {width:300, height:500, fps:30}; 
 
var score = 0; 
 

 
var player = { 
 
\t x:canvas.width/2, 
 
\t y:canvas.height-100, 
 
\t defaultSpeed: 5, 
 
\t speed: 10 
 
\t }; 
 
\t 
 
var asteroids = { 
 
\t size: Math.floor((Math.random() * 40) + 15), 
 
\t startY: 100, 
 
\t startX: Math.floor((Math.random() * canvas.width-200) + 200), 
 
\t speed: 1 
 
} 
 

 
var left = false; 
 
var right = false; 
 

 

 

 
////// Arrow keys ////// 
 

 
function onkeydown(e) { 
 
\t \t if(e.keyCode === 37) { 
 
\t \t \t left = true; 
 
\t \t } 
 
\t \t 
 
\t \t if(e.keyCode === 39) { 
 
\t \t \t right = true; \t 
 
\t \t } 
 
} 
 

 
function onkeyup(e) { 
 
\t \t if (e.keyCode === 37) { 
 
\t \t \t left = false; 
 
\t \t } 
 
\t \t 
 
\t \t if(e.keyCode === 39) { 
 
\t \t \t right = false; \t 
 
\t \t } 
 
} 
 
\t 
 

 
////// other functions ////// 
 

 

 
//function to clear canvas 
 
function clearCanvas() { 
 
\t ctx.clearRect(0,0,canvas.width,canvas.height); 
 
} 
 

 
// draw the score in the upper left corner 
 
function drawscore(score) { 
 
\t var score = 0; 
 
\t ctx.fillStyle = "#FFFFFF"; 
 
\t ctx.fillText(score,50,50); 
 
} 
 

 
// Draw Player ship. 
 
function ship(x,y) { 
 
\t var x = player.x; 
 
\t var y = player.y; 
 
\t ctx.fillStyle = "#FFFFFF"; 
 

 
\t ctx.beginPath(); 
 
    ctx.moveTo(x,y); 
 
    ctx.lineTo(x+15,y+50); 
 
    ctx.lineTo(x-15,y+50); 
 
    ctx.fill(); 
 
} 
 

 
// move player ship. 
 
function moveShip() { 
 
\t document.onkeydown = onkeydown; 
 
\t document.onkeyup = onkeyup; 
 
\t if (left === true && player.x > 50) { 
 
\t \t player.x -= player.speed; 
 
\t } 
 
\t if (right === true && player.x < canvas.width - 50) { 
 
\t \t player.x += player.speed; 
 
\t } 
 
} 
 

 

 
// Draw Asteroid 
 
function drawasteroid() { 
 
\t this.x = asteroids.startX; 
 
\t this.y = 100; 
 
\t this.size = asteroids.size; 
 
\t ctx.fillStyle = "#FFFFFF"; 
 
\t 
 
\t ctx.beginPath(); 
 
    ctx.moveTo(this.x,this.y-this.size*0.5); 
 
    ctx.lineTo(this.x+this.size*0.9,this.y); 
 
    ctx.lineTo(this.x+this.size*0.9,this.y+this.size*1); 
 
\t ctx.lineTo(this.x,this.y+this.size*1.5); 
 
\t ctx.lineTo(this.x-this.size*0.9,this.y+this.size*1); 
 
\t ctx.lineTo(this.x-this.size*0.9,this.y); 
 
    ctx.fill(); 
 
\t \t 
 
} 
 

 
// move Asteroid 
 
function moveAsteroid() { 
 
\t //don't know how I should go about this. 
 
} 
 

 

 

 
// update 
 
setInterval (update, 1000/canvas.fps); 
 

 
function update() { 
 
\t 
 
// test collisions and key inputs 
 
\t moveShip(); 
 
\t 
 
// redraw the next frame of the animation 
 
\t clearCanvas(); 
 
\t drawasteroid(); 
 
\t drawscore(); 
 
\t ship(); 
 
}
<!doctype html> 
 
<html> 
 
<head> 
 
<meta charset="UTF-8"> 
 
<title>My Game</title> 
 

 
<script src="game-functions.js"></script> 
 

 
<!-- 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
 
--> 
 
     
 
</head> 
 

 
<body> 
 

 
<canvas id="ctx" width="300" height="500" style="border: thin solid black; background-color: black;"></canvas> 
 
<br> 
 

 

 
<script> 
 
////// Canvas setup ////// 
 
var ctx = document.getElementById("ctx").getContext("2d"); 
 

 

 
</script> 
 

 
</body> 
 
</html>

+0

爲什麼你不想把它們放在一個數組中?這樣你可以迭代你的小行星陣列,並且每次調用setainterval時都會移動它們。一旦離開畫布,您可以創建一個從陣列中移除小行星的條件。只有在數組長度特定時,纔可以通過添加一個小行星來指定最大的小行星。 –

+0

雖然這是一個正確的方法嗎? 我認爲這將最終得到許多與不同名稱下的變量相同的代碼。 (小行星1,小行星2,小行星3,小行星4,小行星5) –

+0

有沒有辦法做這樣的事情,其中​​變量名稱本身會改變爲單獨的小行星?如果是小行星#並且#會被每個新小行星的新編號替換?我知道它不會是#,但你明白我的意思嗎? –

回答

0

你想使小行星動態創建...那麼,爲什麼沒有設立,使程序在隨機時間間隔如下所謂的setInterval。對於您創建的每個Asteroids對象,您不需要單獨的聲明。你可以在setInterval函數中聲明一個臨時的。這將使用相同的聲明實例化多個不同的對象。當然,您需要將每個對象存儲在某個地方,這正是陣列的用途。

如果moveAsteroid函數在畫布外時被調用,您還必須確保小行星從數組中移除。下面的setInterval函數應該在窗口加載時調用,並與主渲染setInterval函數一起存在。

你也將不得不改變你的moveAsteroid函數,以便能夠指向數組中的一個特定的Asteroids對象。您可以通過添加Asteroids對象作爲函數的參數,或者通過使函數成爲Asteroids類的屬性並使用這個來做到這一點。我在下面的例子中做了後者。

var astArray = []; 
var manageAsteroidFrequency = 2000; 


var Asteroids { 
     X: //something 
     Y://something 
     speed:1 
     move: function() { 
      this.X -= speed; 
     } 

    } 


var mainRenderingFunction = setInterval(function() { 

     for (var i = astArray.length-1 ; i > -1; i --){ 
      if(astArray[i].Y < 0){ 
       astArray.splice(i, 1) 
      }else{ 
       astArray[i].move; 
       } 
     } 

    }, 40); 


var manageAsteroids = setInterval(function() { 

     if (astArray.length < 4){ 
      var tmpAst = new Asteroids(); 
      astArray.push(tmpAst); 
      } 

     manageAsteroidFrequency = Math.floor(Math.random()*10000); 
     }, manageAsteroidFrequency); 
相關問題