【问题标题】:HTML5 Canvas Game - Controls relative to directionHTML5 Canvas Game - 相对于方向的控制
【发布时间】:2013-06-13 04:00:38
【问题描述】:

我怎样才能使播放器的控件像左和右只是改变方向并且向上前进,以及向下回到当前方向,而不是我目前在我的代码中拥有的控件:

<style>
.canvas {
border: 0px;
background-color: #FFF;
width: 1000px;
height: 500px;
position: fixed;
left: 0;
top: 0;
}
</style>

<center>    
<canvas id="canvas" class="canvas" width="1000" height="500"></canvas>
</center>

<script language="javascript">
var canvas = document.getElementById("canvas")
var ctx = canvas.getContext("2d")


canvas.width = canvas.style.width = window.innerWidth
canvas.height = canvas.style.height = window.innerHeight
var w = canvas.width
var h = canvas.height

var player = {
x: w / 2,
y: h / 2,
speed: 5,
radius: 8,
vx: 0,
vy: 0,
}

var keys = []
var friction = 0.9

setInterval(draw, 1000/60)
function draw() {
canvas.width = canvas.style.width = window.innerWidth
canvas.height = canvas.style.height = window.innerHeight
w = canvas.width
h = canvas.height

ctx.clearRect(0, 0, w, h)

if (keys[40]) {
    if (player.vy < player.speed) {
        player.vy++;
    }
}
if (keys[38]) {
    if (player.vy > -player.speed) {
        player.vy--;
    }
}
if (keys[39]) {
    if (player.vx < player.speed) {
        player.vx++;
    }
}
if (keys[37]) {
    if (player.vx > -player.speed) {
        player.vx--;
    }
}

player.vx *= friction;
player.vy *= friction;
player.x += player.vx;
player.y += player.vy;

ctx.beginPath()
ctx.arc(player.x, player.y, player.radius, 0, Math.PI * 2, false)
ctx.fillStyle = "black"
ctx.fill()
ctx.closePath()
}

document.body.addEventListener("keydown", function(e) {
keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function(e) {
keys[e.keyCode] = false;
});
</script>

【问题讨论】:

  • 您需要在使用左右键时应用旋转,然后在旋转后使用向上和向下箭头时需要一些数学来锻炼新轨迹
  • 是的,没错,这正是我要找的东西
  • 是的,但是玩家的 vx 和 vy 应该是相对于角度的,我没有得到关于那个问题的答案,但是谢谢
  • stackoverflow.com/a/16599606/2252829 在这个问题中,我将 vx 和 vy 应用于子弹,但你可以为玩家计算出来,因为数学几乎相同。

标签: javascript html canvas controls


【解决方案1】:

这样的东西有用吗?

player.angle = 0; //Changes depending on the radians the ship is in - currently faces right, defined outside of this.

然后在你获得钥匙的地方使用它:

if (keys[40]) {
    player.vy += Math.sin(player.angle); //Reversed because y goes down as the screen goes up
    player.vx -= Math.cos(player.angle);
}
if (keys[38]) {
    player.vy -= Math.sin(player.angle); //Reversed because y goes up as the screen goes down
    player.vx += Math.cos(player.angle);
}
if (keys[39]) {
    player.angle -= Math.PI / 128;
    if(player.angle < 0) {
        player.angle += Math.PI * 2;
    }
}
if (keys[37]) {
    player.angle += Math.PI / 128;
    if(player.angle >= Math.PI * 2) {
        player.angle -= Math.PI * 2;
    }
}

【讨论】:

  • 另外,我想补充一点,当你开发这个游戏时,在本地存储东西会更有效,比如 Math.PI,并在其中创建包含 cos/sin 值的查找表而不是总是调用 Math.sin/Math.cos.
  • 好吧,我刚刚发现了一些东西,如果播放器使用此代码,我无法更改速度...
  • 对如何做到这一点有任何想法?
  • X射击方向键移动
  • 如果您有 vx 和 vy,在这种情况下您还需要一个速度变量吗?我的假设是,您将根据游戏(以及问题和我的答案 - 显然)进行小行星风格的控制。如果我自己这么说的话,这看起来很不错。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 2014-11-06
  • 2013-04-15
  • 2018-11-16
  • 1970-01-01
  • 2012-06-08
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多