canvas 按键时无法更改图像
Can't get image to change on keypress on canvas
我想做的是,当我向左按时,它会显示为向左移动设置的图像。 (我正在制作 RPG 游戏。)我不知道如何使用 spritesheet,所以我最终单独加载每个图像以使事情变得更容易。
这是我目前的情况:
<script>
function initCanvas(){
var canvas = document.getElementById('my_canvas')
var ctx = canvas.getContext('2d');
//Variables
var cw = canvas.width;
var ch = canvas.height;
var x = 20;
var y = 20;
var width = 40;
var height = 40;
//----------------
//Char (Spritesheet soon)
//----------------
var charup = new Image();
charup.src = "up.png";
var chardown = new Image();
chardown.src = "down.png";
var charleft = new Image();
charleft.src = "left.png";
var charright = new Image();
charright.src = "right.png";
//
draw(); //Executes the Draw Function
//
//-------------
//WASD Controls
//-------------
document.addEventListener("keydown", move, false);
function move(event){
if(event.keyCode == 87){ //w
ctx.drawImage(charup, x, y, width, height);
if(y >= 20){
y-=20;
}
else if(y < 20){
y = 460;
}
}
if(event.keyCode == 65){ //a
ctx.drawImage(charleft, x, y, width, height);
if(x >= 20){
x-=20;
}
else if(x < 20){
x = 460;
}
}
if(event.keyCode == 83){ //s
ctx.drawImage(chardown, x, y, width, height);
if(y+height <= 490){
y+=20;
}
else if(y+height > 460){
y = 0;
}
}
if(event.keyCode == 68){ //d
ctx.drawImage(charright, x, y, width, height);
if(x+width <= 490){
x+=20;
}
else if(x+width > 490){
x = 0;
}
}
draw();
//Idea for sprite: If press right it goes right and loads a gif while going right...
//And when "keyup" or keyrelease or whatever, it stops the animation
//Or loads a neutral one facing the same direction.
}
//--------------
//Draw Function
//--------------
function draw(){
//Clears rect for animation purposes
ctx.clearRect(0, 0, cw, ch);
ctx.fillStyle = "green";
//ctx.fillRect(x, y, 20, 20);
ctx.drawImage(chardown, x, y, width, height);
}
}
//------------
//Game Loop
//------------
window.addEventListener('load', function(event){
initCanvas();
});
</script>
问题出在每次绘制时都会重新插入字符图像的绘制函数。
解决方案是声明一个新变量来存放角色的当前图片:
var imgPlayer = new Image();
imgPlayer.src = "down.png"; //This is your default image.
下一步是更改您的按键侦听器函数,以便更改玩家图像的来源(同时删除此函数中您角色的所有绘图)。像这样:
if(event.keyCode == 87){ //w
imgPlayer.src = charup.src;
//the rest of your code...
}
最后,在你的绘制函数中:
ctx.drawImage(imgPlayer, x, y, width, height);
-----答案到此结束,以下内容仅供娱乐------
为了好玩,这是我不久前开始玩的一个未完成的游戏。
http://home.niddro.com/HTML5/supergoose/SuperGoose.html
角色的脚有 3 个图像,随着玩家移动他而循环。我的想法基于超级马里奥兄弟的概念。
有趣的事实 2:
在 another game 中,我通过循环 2 张模糊脚的图像,非常快速地制作了一只兔子 运行:
我想做的是,当我向左按时,它会显示为向左移动设置的图像。 (我正在制作 RPG 游戏。)我不知道如何使用 spritesheet,所以我最终单独加载每个图像以使事情变得更容易。
这是我目前的情况:
<script>
function initCanvas(){
var canvas = document.getElementById('my_canvas')
var ctx = canvas.getContext('2d');
//Variables
var cw = canvas.width;
var ch = canvas.height;
var x = 20;
var y = 20;
var width = 40;
var height = 40;
//----------------
//Char (Spritesheet soon)
//----------------
var charup = new Image();
charup.src = "up.png";
var chardown = new Image();
chardown.src = "down.png";
var charleft = new Image();
charleft.src = "left.png";
var charright = new Image();
charright.src = "right.png";
//
draw(); //Executes the Draw Function
//
//-------------
//WASD Controls
//-------------
document.addEventListener("keydown", move, false);
function move(event){
if(event.keyCode == 87){ //w
ctx.drawImage(charup, x, y, width, height);
if(y >= 20){
y-=20;
}
else if(y < 20){
y = 460;
}
}
if(event.keyCode == 65){ //a
ctx.drawImage(charleft, x, y, width, height);
if(x >= 20){
x-=20;
}
else if(x < 20){
x = 460;
}
}
if(event.keyCode == 83){ //s
ctx.drawImage(chardown, x, y, width, height);
if(y+height <= 490){
y+=20;
}
else if(y+height > 460){
y = 0;
}
}
if(event.keyCode == 68){ //d
ctx.drawImage(charright, x, y, width, height);
if(x+width <= 490){
x+=20;
}
else if(x+width > 490){
x = 0;
}
}
draw();
//Idea for sprite: If press right it goes right and loads a gif while going right...
//And when "keyup" or keyrelease or whatever, it stops the animation
//Or loads a neutral one facing the same direction.
}
//--------------
//Draw Function
//--------------
function draw(){
//Clears rect for animation purposes
ctx.clearRect(0, 0, cw, ch);
ctx.fillStyle = "green";
//ctx.fillRect(x, y, 20, 20);
ctx.drawImage(chardown, x, y, width, height);
}
}
//------------
//Game Loop
//------------
window.addEventListener('load', function(event){
initCanvas();
});
</script>
问题出在每次绘制时都会重新插入字符图像的绘制函数。
解决方案是声明一个新变量来存放角色的当前图片:
var imgPlayer = new Image();
imgPlayer.src = "down.png"; //This is your default image.
下一步是更改您的按键侦听器函数,以便更改玩家图像的来源(同时删除此函数中您角色的所有绘图)。像这样:
if(event.keyCode == 87){ //w
imgPlayer.src = charup.src;
//the rest of your code...
}
最后,在你的绘制函数中:
ctx.drawImage(imgPlayer, x, y, width, height);
-----答案到此结束,以下内容仅供娱乐------
为了好玩,这是我不久前开始玩的一个未完成的游戏。
http://home.niddro.com/HTML5/supergoose/SuperGoose.html
角色的脚有 3 个图像,随着玩家移动他而循环。我的想法基于超级马里奥兄弟的概念。
有趣的事实 2:
在 another game 中,我通过循环 2 张模糊脚的图像,非常快速地制作了一只兔子 运行: