javascript - 我试图用箭头键移动我的角色,但它没有移动
问题描述
我想用箭头键让我的角色移动,但它不起作用,我不知道为什么。
这是我正在尝试制作的离线射击游戏。我试过不使用对象,但这很快就会变成多人游戏,所以我不想不断地制作新文件。
这是我的代码:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
var x = 0;
var y = 0;
var Keys = {
up: false,
down: false,
left: false,
right: false
};
img.src = "images/char1.png";
let player = function player(x, y) {
this.x = x;
this.y = y;
this.speed = 5;
this.health = 100;
};
window.onkeydown = function(e) {
var kc = e.keyCode;
e.preventDefault();
if (kc === 37) {
Keys.left = true;
} else if (kc === 38) {
Keys.up = true;
} else if (kc === 39) {
Keys.right = true;
} else if (kc === 40) {
Keys.down = true;
}
};
window.onkeyup = function(e) {
var kc = e.keyCode;
e.preventDefault();
if (kc === 37) {
Keys.left = false;
} else if (kc === 38) {
Keys.up = false;
} else if (kc === 39) {
Keys.right = false;
} else if (kc === 40) {
Keys.down = false;
}
};
function move() {
if (Keys.left) {
x -= player.speed;
}else if (Keys.right) {
x += player.speed;
}else if (Keys.up) {
y -= player.speed;
}else if (Keys.down) {
y += player.speed;
}
}
function renderObject() {
ctx.drawImage(img, 0, 0, 32, 48, 0, 0, 32, 48);
}
function draw() {
renderObject();
move();
}
setInterval(draw, 10);
我希望当我按下箭头键时角色会移动,但它根本不会移动。
解决方案
你有几个问题:
您需要创建一个播放器对象。目前,您的
player
功能只是您的player
. 相反,您需要创建此对象的一个实例。var player = new Player(x, y);
您需要在每次重绘后清除画布,否则您将获得角色图像的踪迹:
ctx.clearRect(0, 0, canvas.width, canvas.height);
在播放器的位置绘制你的播放器图像,而不是
0, 0
每次:ctx.drawImage(img, x, y, 32, 48);
请参阅下面的工作示例:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
var x = 0;
var y = 0;
var player = new Player(x, y);
var Keys = {
up: false,
down: false,
left: false,
right: false
};
img.src = "https://www.pinclipart.com/picdir/middle/366-3665375_deadpool-2d-video-game-characters-clipart.png";
function Player(x, y) {
this.x = x;
this.y = y;
this.speed = 5;
this.health = 100;
};
window.onkeydown = function(e) {
var kc = e.keyCode;
if (kc === 37) {
Keys.left = true;
} else if (kc === 38) {
Keys.up = true;
} else if (kc === 39) {
Keys.right = true;
} else if (kc === 40) {
Keys.down = true;
}
};
window.onkeyup = function(e) {
var kc = e.keyCode;
if (kc === 37) {
Keys.left = false;
} else if (kc === 38) {
Keys.up = false;
} else if (kc === 39) {
Keys.right = false;
} else if (kc === 40) {
Keys.down = false;
}
};
function move() {
if (Keys.left) {
x -= player.speed;
} else if (Keys.right) {
x += player.speed;
} else if (Keys.up) {
y -= player.speed;
} else if (Keys.down) {
y += player.speed;
}
}
function renderObject() {
ctx.drawImage(img, x, y, 32, 48);
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
renderObject();
move();
}
setInterval(draw, 10);
<canvas height="120" width="400" id="canvas" style="border: 1px solid black;"></canvas>
推荐阅读
- html - html中元素的排列
- laravel - Laravel:根据本地化更改 URL
- android - 改造 2 无法解析
到 JSON 对象 - javascript - 我在谷歌脚本中的 for 循环正在运行代码,但没有返回正确的响应
- java - 使用组合 PrimaryKey 更新 JPA 实体导致重复输入错误
- spring - Java 升级后 SpEL 表达式中断 - 有替代方案吗?
- docker - 如何生成 docker 镜像
- sql-server - 无法将有效非数字的 varchar 转换为十进制
- python-3.x - 在 python 3.7 中使用 wikipedia API 时出现证书错误
- angular - 我想动态更改数据表的语言而不重新加载页面,