【发布时间】:2017-09-29 03:17:33
【问题描述】:
我正在 CSS 和 JS 中创建一个简单的类似小行星的游戏,使用画布上的 DOM 用于...实验目的。
在这个例子中,我的代码非常小,可以很容易地看到下面发生了什么。最终目标:让箭头键在窗口周围平滑旋转和平移飞船,而不会产生无限量的变换。 我想我已经完成了 90%:
使用方向键控制下面的sn-p。
'use strict';
function defineDistances() {
var distance = {};
distance.up = -1;
distance.right = 1;
distance.down = 1;
distance.left = -1;
return distance;
}
function defineKeys() {
var keys = {};
keys.up = 38;
keys.right = 39;
keys.down = 40;
keys.left = 37;
return keys;
}
function checkKeys( e ) {
var triBx = document.getElementById( 'v-wrp' ),
keys = defineKeys(),
distance = defineDistances();
switch( e.keyCode ) {
case keys.up:
triBx.style.transform += 'translateY(' + distance.up + 'px)';
break;
case keys.right:
triBx.style.transform += 'rotate(' + distance.right + 'deg)';
break;
case keys.down:
triBx.style.transform += 'translateY(' + distance.down + 'px)';
break;
case keys.left:
triBx.style.transform += 'rotate(' + distance.left + 'deg)';
break;
}
}
function detectMovement( e ) {
setInterval (
function() {
checkKeys( e );
},
1000/24
);
}
function start() {
window.addEventListener( 'keydown', detectMovement );
preventBrowserWindowScroll()
}
start();
@import url( "https://fonts.googleapis.com/css?family=Nunito" );
html {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
font-family: "Nunito", sans-serif;
font-size: 2rem;
}
.v {
display: block;
transform: rotate( 180deg );
}
<div id="v-wrp" class="v-wrp">
<b class="v">V</b>
</div>
<script>
function preventBrowserWindowScroll() {
window.addEventListener( 'keydown', function( e ) {
// space and arrow keys
if([32, 37, 38, 39, 40].indexOf( e.keyCode ) > -1 ) {
e.preventDefault();
}
}, false )
}
</script>
如果您在浏览器中检查 v-wrp 元素,您会看到不断添加变换。
我使用+=添加转换的原因是为了避免这个问题:Reset CSS transform origin after translation / rotation
(transform-origin 在移动时不会随元素一起移动,这会导致不希望的效果,除非所有变换都添加到之前的变换中...)
那么我该如何克服这些挑战呢?我怀疑 sn-p 是如此不稳定,因为添加了无尽的变换。在没有所有记忆丢失/断断续续/错误/无休止的变换的情况下,我如何才能使其工作方式类似于现在的方式?
编辑:另一个主要问题是,一旦按键被按下,飞船将如何连续沿相同的方向行驶,如果您按下正确的按键,甚至会以类似圆形的方式行驶。我希望它像在太空中一样漂移,但一旦松开钥匙就不会转动。轨迹应该在“浮动”时保持笔直我做错了什么?
【问题讨论】:
-
我已经发布了一个快速的答案。对不起,我现在时间不多了,我不能完全完成它。希望你能明白。
标签: javascript css animation game-physics css-transforms