2016-07-26 2 views
0

Je travaille sur un jeu de pong à 2 joueurs, et j'utilise les touches W, D, S, A pour le 2ème joueur. Cela fonctionne mais la direction Y de la pagaie du 2ème joueur est doublée. Si vous ne comprenez pas, voyez Demo. J'ai essayé de redessiner la palette après avoir appuyé sur une touche, mais cela n'a rien fait.Le clavier de JS ne fonctionne pas

JS

/* VARIABLES */ 

//Canvas and context 
var canvas, ctx; 

//Balls x and y 
var ballX, ballY; 
var ballSpeedX, ballSpeedY; //Balls x and y speed 

//Player1 x, y 
var player1X, player1Y; 

//Player2 x, y 
var player2X, player2Y; 

var playerSpeedY; //Players speed 

//Players w and h 
const PLAYER_WIDTH = 10; 
const PLAYER_HEIGHT = 100; 

const WIN_SCORE = 3; //Max score 

/* FUNCTIONS */ 

//Draw stuff 
function draw() { 

    //Clear canvas 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 

    //Draw player 1 
    drawPlayer1(player1X, player1Y, PLAYER_WIDTH, PLAYER_HEIGHT, "white"); 

    //Draw player 2 
    drawPlayer2(player2X, player2Y, PLAYER_WIDTH, PLAYER_HEIGHT, "white"); 

    //Draw ball 
    drawBall(ballX, ballY, 10, "white"); 

    //Draw score board 

} 

//Animate stuff 
function animate() { 

    ballX += ballSpeedX; 
    ballY += ballSpeedY; 

} 

//Detect collisiom 
function collision() { 

    //If ball hits x and y walls 
    //X walls 
    if (ballX >= canvas.width) { //Right wall 

     ballSpeedX = -ballSpeedX; 

    } 
    if (ballX <= 0) { //:Left wall 

     ballSpeedX = -ballSpeedX; 

    } 

    //Y walls 
    if (ballY >= canvas.height) { //Bottom wall 

     ballSpeedY = -ballSpeedY; 

    } 
    if (ballY <= 0) { //Top wall 

     ballSpeedY = -ballSpeedY; 

    } 

} 

//Reset ball 
function resetBall() {} 

//Player 1's control (W, S, D, A) 
function player1Control(e) {} 

//Player 2's control (Arrow keys) 
function player2Control(e) { 

    if (e.keyCode == "40") { 

     player2Y += 0.2; 
     drawPlayer2(player2X, player2Y, PLAYER_WIDTH, PLAYER_HEIGHT, "white"); 
     ctx.clearRect(0, 0, canvas.width, canvas.height); 

    } 

    if (e.keyCode == "38") { 

     player2Y -= 0.2; 
     drawPlayer2(player2X, player2Y, PLAYER_WIDTH, PLAYER_HEIGHT, "white"); 
     ctx.clearRect(0, 0, canvas.width, canvas.height); 

    } 

} 

//Detect if a player gets up to max score 
function scoreCheck() {} 

/* OBJECT FUNCTIONS */ 

//Draw ball 
function drawBall(x, y, r, color) { 

    ctx.fillStyle = color; 
    ctx.beginPath(); 
    ctx.arc(x, y, r, 0, Math.PI * 2); 
    ctx.fill(); 

} 

//Draw player 1's paddle 
function drawPlayer1(x, y, w, h, color) { 

    ctx.fillStyle = color; 
    ctx.fillRect(x, y, w, h); 

} 

//Draw player 2's paddle 
function drawPlayer2(x, y, w, h, color) { 

    ctx.fillStyle = color; 
    ctx.fillRect(x, y, w, h); 

} 

//Draw score board 
function drawScore(x, y, text, font, color) {} 

/* WHEN DOCUMENT IS READY */ 
$(document).ready(function() { 

    //Call canvas 
    canvas = $("#canvas")[0]; 
    //Get context 
    ctx = canvas.getContext("2d"); 

    //Set values to object variables 
    //ball x and y 
    ballX = 200; 
    ballY = 200; 
    ballSpeedX = 2; 
    ballSpeedY = 2; 

    //Player 1 
    player1X = 0; 
    player1Y = canvas.height/2 - PLAYER_HEIGHT/2; 

    player2X = canvas.width - PLAYER_WIDTH; 
    player2Y = canvas.height/2 - PLAYER_HEIGHT/2; 

    playerSpeedY = 2; 

    var fps = 60; 
    setInterval(function() { 

     draw(); 
     animate(); 
     collision(); 

     $(window).bind("keydown", player1Control); 
     $(window).bind("keydown", player2Control); 

    }, fps/1000); 

}); 

HTML

<!DOCTYPE html> 
<html> 

<head> 
    <title>Pong - 2 Player</title> 

    <link rel="stylesheet" href="style.css"> 
</head> 

<body> 
    <center> 
     <canvas id="canvas" width="800" height="600" style="background-color: #000"></canvas> 
    </center> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
    <script src="main.JS"></script> 
</body> 

</html> 

Répondre

2

Vous ajoutez un écouteur d'événement à l'intérieur d'un setInterval

setInterval(function() { 

    draw(); 
    animate(); 
    collision(); 

    $(window).bind("keydown", player1Control); 
    $(window).bind("keydown", player2Control); 

}, fps/1000); 

donc chaque fois que cet intervalle court l'événement est enregistré à nouveau. Il en résulte que player1Control et player2Control s'exécutent plusieurs fois.

il suffit de déplacer ces deux lignes de l'intervalle

setInterval(function() { 

    draw(); 
    animate(); 
    collision(); 

}, fps/1000); 
$(window).bind("keydown", player1Control); 
$(window).bind("keydown", player2Control); 
+0

Merci le code travaillé –