javascript - 无法在 Canvas 上按键时更改图像

标签 javascript html 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>

最佳答案

问题在于每次绘制时都会重新设置 Angular 色图像的绘制函数。

解决方案是声明一个新变量来托管 Angular 色的当前图片:

var imgPlayer = new Image();
imgPlayer.src = "down.png"; //This is your default image.

下一步是更改您的按键监听器函数,以便更改玩家图像的源(同时删除此函数中 Angular 色的所有绘图)。就像这样:

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 Angular 色的脚上有 3 个图像,随着玩家移动他而循环播放。我的这个想法是基于 super 马里奥兄弟的概念。 Mario 3-part sprite

有趣的事实 2: 在 another game我通过循环两张模糊脚的图像让兔子跑得非常快: bunny bunnyfeet1 bunnyfeet2

关于javascript - 无法在 Canvas 上按键时更改图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387012/

相关文章:

javascript - 在Promise.all()中编写多个map函数

Javascript Map 返回未定义,尽管(键,值)对已定义

javascript - Node 的控制台没有显示所有对象属性...这是预期的行为吗?

javascript - 动态调整复杂 Canvas 路径 HTML5

javascript - Typescript (3.8+),#private 字段的缺点是什么?

html - 如果使用 DOCTYPE,则 Css 样式应用不正确

html - CSS float 导致布局问题

javascript - 我不能使用 Angularjs 在我的 index.html 中包含另一个 html 页面

javascript - WebGL 或 Canvas 是获得 SVG 关键帧动画硬件加速的唯一方法吗?

javascript - KineticJS .toImage() 从区域/组创建图像的正确方法