首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript canvas对象在使用ctx.Rotate()旋转后卡住

Javascript canvas对象在使用ctx.Rotate()旋转后卡住
EN

Stack Overflow用户
提问于 2020-04-27 04:35:46
回答 1查看 80关注 0票数 0

我正在试着做一个汽车游戏,每次你按一个箭头键,它就会旋转汽车。我已经创建了汽车,但每次我尝试使用ctx.Rotate旋转它时,汽车在将其移动到特定点后被卡住。这就好像整个画布是随着汽车旋转的。

车不能再向右移动了。

下面是我的代码,用于旋转然后绘制汽车:

代码语言:javascript
复制
    ctx.translate((canvas.width/2) - 50, (canvas.height/2) - 50);
    ctx.rotate(90*Math.PI/180);
    ctx.translate((-canvas.height.width/2) + 50, (-canvas.height/2) + 50);
    drawCircle(ctx, x, y);
    drawRect(ctx, x, y);
    drawWheels(ctx, x, y);

下面是我清空汽车的代码(用于刷新):

代码语言:javascript
复制
function clear(obj) {
    obj.save();
    obj.setTransform(1, 0, 0, 1, 0, 0);
    obj.clearRect(0, 0, canvas.width, canvas.height);
    obj.restore();
}

检查汽车是否到达画布边缘的逻辑:

变量x和y是汽车的x和y坐标

代码语言:javascript
复制
var map = {}; // You could also use an array
    onkeydown = onkeyup = function(e) {
      e = e || event; // to deal with IE
      map[e.keyCode] = e.type == 'keydown';

    if (y < canvas.height && y > 0 && x < canvas.width && x > 0) {

      /* CODE FOR MOVING THE CAR GOES HERE */

      } else {

    if (y == canvas.height) {

    y = canvas.height -10
    }
        if (y == 0) {

    y = 10
}
else if (x >= canvas.width) {

x = canvas.width - 10

} 
else if (x == 0) {

x = 10
}
    }
    }

如果您需要的话,下面是整个代码的链接:https://jsfiddle.net/GautamGXTV/g8v31t4r/215/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-27 04:50:08

你实际上是对的,当汽车旋转时,整个画布都会旋转。快速的解决方案是在旋转之前保存画布的状态,然后在绘制汽车后加载它。它应该是这样的:

代码语言:javascript
复制
ctx.save();
ctx.translate((canvas.width/2) - 50, (canvas.height/2) - 50);
ctx.rotate(90*Math.PI/180);
ctx.translate((-canvas.height.width/2) + 50, (-canvas.height/2) + 50);
drawCircle(ctx, x, y);
drawRect(ctx, x, y);
drawWheels(ctx, x, y);
ctx.restore();

另外需要注意的是,使用一个画布上下文进行所有渲染是一个好主意,因为你目前似乎得到了3个独立的上下文。如果您有任何进一步的问题,请随时提问!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61447725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档