2017-01-04 6 views
0

私は多くの記事を読んで、HTML5とキャンバスに関するいくつかのチュートリアルを具体的に行ってきましたが、これまで私は正確な問題を再現することができませんでした。すでにそこに答えがある場合は、私に正しい方向を教えてください。HTML5移動オブジェクト

私の究極の目標は、簡単なポンゲームを作ることです。私はJavaScriptを使って基本オブジェクトを描きましたが、今はプレイヤー(左)のパドルを動かそうとしています。現在のコードで実行している問題は、パドルを動かす代わりに、パドルが移動する領域を埋めることです。パドルが長く伸びているとは思わないが(高さにピクセルを追加する)、新しいパドルオブジェクトが移動されているのではなく作成されているようだ。

私は何度も何度も見てきましたが(皆さんは最初の苦労ではありません)、何が起きているのか分かりません。どんな助けでも大歓迎です。

// Requests a callback 60 times per second from browser 
var animate = window.requestAnimationFrame || 
     window.webkitRequestAnimationFrame || 
     window.mozRequestAnimationFrame || 
     window.oRequestAnimationFrame  || 
     window.msRequestAnimationFrame  || 
    function(callback) { window.setTimeout(callback, 1000/60) }; 

// Get canvas and set context 
var canvas = document.getElementById("canvas"); 
var context = canvas.getContext("2d"); 

context.fillStyle = "white"; 

// Settle variables for canvas width and height 
var canvas_width = 500; 
var canvas_height = 400; 

// Set varaibles for paddle width and height 
var paddle_width = 15; 
var paddle_height = 75; 

// Initializes variables 
var playerScore = 0; 
var computerScore = 0; 
var player = new Player(); 
var computer = new Computer(); 
var ball = new Ball((canvas_width/2),(canvas_height/2)); 

// Renders the pong table 
var render = function() { 
    player.render(); 
    computer.render(); 
    ball.render(); 
}; 

var update = function() { 
    player.update(); 
}; 

// Callback for animate function 
var step = function() { 
    update(); 
    render(); 
    animate(step); 
}; 

// Creates paddle object to build player and computer objects 
function Paddle(x, y, width, height) { 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 
    this.x_speed = 0; 
    this.y_speed = 0; 
}; 

function Player() { 
    this.paddle = new Paddle(1, ((canvas_height/2) - (paddle_height/2)), paddle_width, paddle_height); 
}; 

function Computer() { 
    this.paddle = new Paddle((canvas_width - paddle_width - 1), ((canvas_height/2) - (paddle_height/2)), paddle_width, paddle_height); 
}; 

// Creates ball object 
function Ball(x, y) { 
    this.x = x; 
    this.y = y; 
    this.radius = 10; 
}; 

// Adds render functions to objects allowing them to be drawn on canvas 
Ball.prototype.render = function() { 
    context.beginPath(); 
    context.arc(this.x, this.y, this.radius, Math.PI * 2, false); 
    context.fillStyle = "white"; 
    context.fill(); 
    context.closePath(); 
}; 

Paddle.prototype.render = function() { 
    context.fillStyle = "white"; 
    context.fillRect(this.x, this.y, this.width, this.height); 
}; 

Player.prototype.render = function() { 
    this.paddle.render(); 
}; 

// Appends a move method to Paddle prototype 
Paddle.prototype.move = function(x, y) { 
    this.y += y; 
    this.y_speed = y; 
}; 

// Updates the location of the player paddle 
Player.prototype.update = function() { 
    for(var key in keysDown) { 
    var value = Number(key); 
    if(value == 38) { 
     this.paddle.move(0, -4); 
    } else if (value == 40) { 
     this.paddle.move(0, 4); 
    } else { 
     this.paddle.move(0, 0); 
    } 
    } 
}; 

Computer.prototype.render = function() { 
    this.paddle.render(); 
}; 

// Draws center diving line 
context.strokeStyle = "white"; 
context.setLineDash([5, 3]); 
context.beginPath(); 
context.moveTo((canvas_width/2), 0); 
context.lineTo((canvas_width/2), canvas_height); 
context.stroke(); 
context.closePath(); 

// Draws score on canvas 
context.font = "40px Arial"; 
context.fillText('0', (canvas_width * .23), 50); 
context.fillText('0', (canvas_width * .73), 50); 

window.onload = function() { 
    animate(step); 
}; 

var keysDown = {}; 

window.addEventListener("keydown", function(event) { 
    keysDown[event.keyCode] = true; 
}); 

window.addEventListener("keyup", function(event) { 
    delete keysDown[event.keyCode]; 
}); 

私の謝罪:私はhtml/cssコードをカットして貼り付けようとしましたが、忘れてしまいました。

pong.html:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>Pong</title> 
    <link rel="stylesheet" href="style.css"> 
    </head> 
    <body> 
    <canvas id="canvas" width="500" height="400"></canvas> 

    <script src="main.js"></script> 
    </body> 
</html> 

のstyle.css:

#canvas { 
    background-color: black; 
} 
+0

[mcve]を入力してください。 –

答えて

2

キャンバス自体はそれだけでビットマップだ、何の "オブジェクト" を持っていない、とあなたはそれを描くものは、単に色を変更しますあるピクセルのうち、既にそこにあるものの上に描かれているように見えるが、それはそれをしない。それは単にピクセルカラーを反転させます。

次のフレームのキャンバスを「リセット」するコードは表示されないので、元のピクセルの色を変えずに異なるピクセルをパドルの色で塗りつぶすだけで、異なる高さの値で同じパドルを文字通り描画します背景色を使用します。これはまた、あなたのスコアとセンターラインのすべてのフレームを描画する必要が明らかになったことを

var render = function() { 
    // clear the canvas so we can draw a new frame 
    context.clearRect(0,0,canvas.width,canvas.height); 
    // draw the frame content to the bitmap 
    player.render(); 
    computer.render(); 
    ball.render(); 
}; 

注:ここ

最も簡単な解決策はrender()の開始時にcontext.clearRect(0, 0, canvas.width, canvas.height);を追加することです。それか、パドル(とボール)が新しい位置に描画する前に、パドル(とボール)が最初に元の位置にバックグラウンドカラーを復元していることを確認する必要があります。

+1

ああ、ありがとう!それは確かにそれでした。あらかじめ説明をいただき、誠にありがとうございます。それは私が持っていたいくつかの質問をクリアし、実際に私にキャンバスをよりよく理解させました。私はセンターとテキストを分割することについて尋ねるつもりでしたが、あなたは既にそれに答えました!ありがとうございます! =) –

関連する問題