gpt4 book ai didi

javascript - JS keydown 不起作用

转载 作者:行者123 更新时间:2023-12-02 14:21:43 25 4
gpt4 key购买 nike

我正在开发 2 人乒乓球游戏,我为第二名玩家使用 W、D、S、A 键。它有效,但第二个玩家的桨 Y 方向加倍。

如果你不明白,请看这个 Demo 。我尝试在按下某个键后重新绘制桨,但没有任何作用。

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>

最佳答案

您正在 setInterval 内添加事件监听器

setInterval(function () {

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

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

}, fps / 1000);

因此,每次该间隔运行时,都会再次注册事件。这会导致player1Control和player2Control运行多次。

只需将这两行移出区间即可

setInterval(function () {

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

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

关于javascript - JS keydown 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com