javascript - 使用 CSS 变换使用箭头键输入来平移/旋转 Sprite 。更新位置时出现问题

标签 javascript html css css-transforms

我正在尝试使用箭头键控制 Sprite(向上/向下用于平移,向左/向右用于旋转)。

我需要 Sprite 按照其旋转的方向进行平移。 问题是,当 Sprite 平移后旋转 Sprite 时, Sprite 的位置会重置到原来的位置。我尝试过使用一个 div 进行旋转,使用一个 div 进行平移,但没有成功。

我面临的问题与通常的“在屏幕上移动 div”问题有点不同,因为我需要以一定 Angular 移动 div 并继续以该 Angular 移动。

我觉得我忽略了一个简单的解决方案,如果有人能指出我正确的方向,我将非常感激!有没有比我尝试做的事情更简单的替代方案,有人可以让我意识到?

我创建了一个 JSFiddle 来演示正在发生的事情:

CSS transform sprite fiddle

var r = document.getElementById("image2");

document.addEventListener("keyup", checkKeyUp);
document.addEventListener("keydown", checkKey);

var trany = 0;
var rotate = 0;

function checkKey(e) {
    e = e || window.event;
    if (e.keyCode == '38') {
        // up arrow
        trany = trany-1;
        r.style.transform = 'rotate('+rotate+'deg)translateY('+trany+'vmin)';
    }
    else if (e.keyCode == '40') {
        // down arrow
        trany = trany+1;
        r.style.transform = 'rotate('+rotate+'deg)translateY('+trany+'vmin)';
    }
    else if (e.keyCode == '37') {
       // left arrow
        rotate = rotate-.8;
        r.style.transform = 'translateY('+trany+'vmin)rotate('+rotate+'deg)';
    }
    else if (e.keyCode == '39') {
      // right arrow
        rotate = rotate+.8;
        r.style.transform = 'translateY('+trany+'vmin)rotate('+rotate+'deg)';
    }
}

function checkKeyUp(e) {
    e = e || window.event;
    if (e.keyCode == '38') {
        // up arrow
    }
    else if (e.keyCode == '40') {
        // down arrow
    }
    else if (e.keyCode == '37') {
       // left arrow
       r.style.transform = 'translateY('+trany+'vmin)rotate('+rotate+'deg)';
    }
    else if (e.keyCode == '39') {
      // right arrow
      r.style.transform = 'translateY('+trany+'vmin)rotate('+rotate+'deg)';
    }
}
#myAnimation {
  top:250px;
  left:250px;
  position: absolute;
}
#image2 {
  width:40%
}

img {
  width: 30%;
}
<!DOCTYPE html>
<html>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<body>

<div id ="myContainer">
  <div id="image1" style="height:300px;width:500px; background- 
    color:red;"></div>
</div>

<div id ="myAnimation">
    <image id="image2" src="https://banner2.kisspng.com/20180415/pge/kisspng-arrow-desktop-wallpaper-symbol-clip-art-up-arrow-5ad37ddc82f384.4572004515238097565364.jpg" style="bottom:0px;width:10%"></image>
</div>

</body>
</html>

最佳答案

您想要实现的是将元素从之前的状态独立移动,而仅使用变换无法实现这一点,因为变换总是考虑初始状态来移动元素。

一个想法是考虑使用 bottom/left 移动元素并仅使用变换来旋转元素。旋转 Angular 将定义如何调整底部和左侧属性:

var r = document.getElementById("image2");

document.addEventListener("keydown", checkKey);

var rotate = 0;
var left=0;
var bottom= 0;

function checkKey(e) {
  e = e || window.event;
  if (e.keyCode == '38') {
    // up arrow
    r.style.left = left + Math.sin(rotate*Math.PI/180)  + 'px';
    r.style.bottom = bottom + Math.cos(rotate*Math.PI/180) + 'px';
  } else if (e.keyCode == '40') {
    // down arrow
    r.style.left = left - Math.sin(rotate*Math.PI/180)  + 'px';
    r.style.bottom = bottom -  Math.cos(rotate*Math.PI/180) + 'px';
  } else if (e.keyCode == '37') {
    // left arrow
    rotate = rotate - .8;
    r.style.transform = 'rotate(' + rotate + 'deg)';
  } else if (e.keyCode == '39') {
    // right arrow
    rotate = rotate + .8;
    r.style.transform = 'rotate(' + rotate + 'deg)';
  }
  left = parseFloat(r.style.left);
  bottom = parseFloat(r.style.bottom);
}
#image2 {
  width: 40px;
  position: absolute;
}
<img id="image2" src="https://banner2.kisspng.com/20180415/pge/kisspng-arrow-desktop-wallpaper-symbol-clip-art-up-arrow-5ad37ddc82f384.4572004515238097565364.jpg" style="left:0;bottom:0;">

关于javascript - 使用 CSS 变换使用箭头键输入来平移/旋转 Sprite 。更新位置时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53261116/

相关文章:

html - 如何摆脱标签和输入字段之间的大空白?

javascript - 在AngularJS中,如何将span中的文本 "bind"发送到文本框,并在单击span时更新它?

javascript - jsFiddle 工作,网站 JS 不工作

html - 同一部分的两个 div

javascript - typescript + Angular : factory with dependencies error

javascript - 脚本中的 Angular Scope

javascript - 使用 javascript/jquery 从现有数组创建一个新数组,该数组保存某个项目存在的次数

javascript - 延迟 sweetalert2 中按钮的出现

javascript - 带有 Javascript 的 HTML5 视频播放/停止按钮

css - 浏览器有时会使用错误的字体来渲染图标,导致文本出现乱码