2017-01-29 58 views
0

这是我第一次尝试JavaScript游戏。 我正在试图做一个黄色块的JavaScript游戏,你可以使用wasd键来控制。蓝色方块应该是一个敌人,如果你击中了它,就会让你松动。稍后我会添加更多功能。问题:游戏工作正常,直到你释放其中一个按钮。如何在释放控制器按钮时防止播放器飞走?Javascript游戏控件

我也不能让按钮工作时,我让wasd按键控制器,但我不认为,因为在这一点上的一个重大问题。即便如此,如果有人知道如何解决这个问题,我会很开心。

var myGamePiece; 
 
var myFi; 
 

 
function startGame() { 
 
    myGameArea.start(); 
 
    myGamePiece = new component(30, 30, "rgba(200,200,0,0.5)", 10, 175); 
 
    //blueGamePiece = new component(20, 20, "blue", 300, 110); 
 
    myFi = new component(15, 15, "blue", 300, 120); 
 
} 
 
var myGameArea = { 
 
    canvas: document.createElement("canvas"), 
 
    start: function() { 
 
    this.canvas.width = 680; 
 
    this.canvas.height = 420; 
 
    this.context = this.canvas.getContext("2d"); 
 
    document.body.insertBefore(this.canvas, document.body.childNodes[0]); 
 
    this.interval = setInterval(updateGameArea, 20); 
 
    window.addEventListener('keydown', function(e) { 
 
     myGameArea.keys = (myGameArea.keys || []); 
 
     myGameArea.keys[e.keyCode] = (e.type == "keydown"); 
 
    }) 
 
    window.addEventListener('keyup', function(e) { 
 
     myGameArea.keys[e.keyCode] = (e.type == "keydown"); 
 
    }) 
 
    }, // I don't get why the comma is so important and what it does! 
 

 
    clear: function() { 
 
    this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); 
 
    }, 
 

 
    stop: function() { 
 
    clearInterval(this.interval); 
 
    } 
 
} 
 

 
function component(width, height, color, x, y) { 
 
    this.gamearea = myGameArea; 
 
    this.width = width; 
 
    this.height = height; 
 
    this.speedX = 0; 
 
    this.speedY = 0; 
 
    this.x = x; 
 
    this.y = y; 
 
    this.update = function() { 
 
    ctx = myGameArea.context; 
 
    ctx.fillStyle = color; 
 
    ctx.fillRect(this.x, this.y, this.width, this.height); 
 
    } 
 
    this.newPos = function() { 
 
     this.x += this.speedX; 
 
     this.y += this.speedY; 
 
    }, 
 
    this.crashWith = function(enemy) { 
 
     var myleft = this.x; 
 
     var myright = this.x + (this.width); 
 
     var mytop = this.y; 
 
     var mybottom = this.y + (this.height); 
 
     var fileft = enemy.x; 
 
     var firight = enemy.x + (enemy.width); 
 
     var fitop = enemy.y; 
 
     var fibottom = enemy.y + (enemy.height); 
 
     var crash = true; 
 
     if ((mybottom < fitop) || (mytop > fibottom) || (myright < fileft) || (myleft > firight)) { 
 
     crash = false; 
 
     } 
 
     return crash; 
 
    } 
 
} 
 

 
function updateGameArea() { 
 
    if (myGamePiece.crashWith(myFi)) { 
 
    myGameArea.stop(); 
 
    } else { 
 
    myGameArea.clear(); 
 
    myGamePiece.speedX += myGamePiece.speedX; 
 
    myGamePiece.speedY += myGamePiece.speedY; 
 
    if (myGameArea.keys && myGameArea.keys[65]) { 
 
     myGamePiece.speedX = -1; 
 
    } 
 
    if (myGameArea.keys && myGameArea.keys[68]) { 
 
     myGamePiece.speedX = 1; 
 
    } 
 
    if (myGameArea.keys && myGameArea.keys[87]) { 
 
     myGamePiece.speedY = -1; 
 
    } 
 
    if (myGameArea.keys && myGameArea.keys[83]) { 
 
     myGamePiece.speedY = 1; 
 
    } 
 
    myGamePiece.newPos(); 
 
    //blueGamePiece.x -=1; 
 
    //blueGamePiece.y +=2; 
 
    //blueGamePiece.update(); 
 
    myGamePiece.update(); 
 
    myFi.update(); 
 
    } 
 
} 
 

 
function moveup() { 
 
    myGamePiece.speedY = 1; 
 
} 
 

 
function movedown() { 
 
    myGamePiece.speedY = 1; 
 
} 
 

 
function moveleft() { 
 
    myGamePiece.speedX = 1; 
 
} 
 

 
function moveright() { 
 
    myGamePiece.speedX = 1; 
 
} 
 

 
function clearmove() { 
 
    myGamePiece.speedX = 0; 
 
    myGamePiece.speedY = 0; 
 
}
body { 
 
    text-align: center; 
 
} 
 
canvas { 
 
    border: 1px solid #d3d3d3; 
 
    background-color: #f4f4f4; 
 
} 
 
div { 
 
    text-align: center; 
 
    width: 300px; 
 
    height: 100px; 
 
} 
 
button { 
 
    background-color: black; 
 
    color: yellow; 
 
}
<div> 
 
    <button onmousedown="moveup()" onmouseup="clearmove()">UP</button> 
 
    <br> 
 
    <br> 
 
    <button onmousedown="moveleft()" onmouseup="clearmove()">LEFT</button> 
 
    <button onmousedown="moveright()" onmouseup="clearmove()">RIGHT</button> 
 
    <br> 
 
    <br> 
 
    <button onmousedown="movedown()" onmouseup="clearmove()">DOWN</button> 
 
</div> 
 

 
<p>I have created a game area!</p> 
 
<p>Then I created a component to my game! I is a yellow square!</p> 
 
<p>I continued to add frames and movement</p> 
 
<p>After I had added movement, I could finally add controllers</p> 
 
<p>First I added the buttons that was controlled by the mouse, 
 
    <br>then I added the keystroke controllers for the w,s,a,d keys.</p>

回答

0

TLDR:一个的jsfiddle证明https://jsfiddle.net/tty7y1gr/3/

你问的第一件事是如何让玩家停止移动。尝试改变这些行:

myGamePiece.speedY = 1; 

这样:

myGamePiece.speedY += 1; 

而且,你不设置运动下,左,右正确:没有负值。试试这个:

function moveup() { 
    myGamePiece.speedY -= 1; 
} 

function movedown() { 
    myGamePiece.speedY += 1; 
} 

function moveleft() { 
    myGamePiece.speedX -= 1; 
} 

function moveright() { 
    myGamePiece.speedX += 1; 
} 

而另一件事是你必须在这里这段代码:

myGamePiece.speedX += myGamePiece.speedX; 
myGamePiece.speedY += myGamePiece.speedY; 

这将使得该游戏人物已经交错,零星的运动,因为速度将继续增加在它自直到游戏片段的速度几乎呈指数级增长。除非这是故意的,为了消除这种运动,摆脱这两条线。

我在那里看到的下一个问题是wasd键。尝试是这样的: 将此放在您的GameArea():

window.addEventListener('keydown', function (e) {    
     myGameArea.keys = (myGameArea.keys || []); 
     myGameArea.keys[e.keyCode] = true; 
}); 

window.addEventListener('keyup', function (e) { 
     myGameArea.keys[e.keyCode] = false; 
}); 

,这要在其中创建您的播放器“控制器”(或运动)

myGamePiece.speedX = 0; 
myGamePiece.speedY = 0; 
if (myGameArea.keys && (myGameArea.keys[37] || myGameArea.keys[65])) { 
    myGamePiece.speedX = -1; 
    } 
    if (myGameArea.keys && (myGameArea.keys[39] || myGameArea.keys[68])) { 
    myGamePiece.speedX = 1; 
    } 
    if (myGameArea.keys && (myGameArea.keys[38] || myGameArea.keys[87])) { 
    myGamePiece.speedY = -1; 
    } 
    if (myGameArea.keys && (myGameArea.keys[40] || myGameArea.keys[83])) { 
    myGamePiece.speedY = 1; 
    } 
} 

(这是方向键)

但是这会让你的按钮移动停止工作。为了防止这种情况发生,你必须让gameupdate()并不总是把你的游戏片段的速度设置为0.所以,在那里放置一个支票,它将设置一个变量来释放游戏片段的速度,当你点击屏幕,然后在停止按下这些按钮时将其设回。类似这样的:

在myGameArea之外。更新():

var buttonMove = false; 

裹棋子的速度的设置:

if (!buttonMove) { 
     myGamePiece.speedX = 0; 
     myGamePiece.speedY = 0; 
} 

内myGameArea.update()的:

function moveup() { 
    buttonMove = true; 
    myGamePiece.speedY -= 1; 
} 

function movedown() { 
buttonMove = true; 
    myGamePiece.speedY += 1; 
} 

function moveleft() { 
buttonMove = true; 
    myGamePiece.speedX -= 1; 
} 

function moveright() { 
buttonMove = true; 
    myGamePiece.speedX += 1; 
} 

function clearmove() { 
buttonMove = false; 
    myGamePiece.speedX = 0; 
    myGamePiece.speedY = 0; 
} 

我看见你为什么代码中的注释你需要一个逗号。您需要它,因为您正在创建一个JavaScript对象,其属性用逗号分隔。所以myGameArea看起来是这样的:

var myGameArea = { 
    canvas: "value", 
    start: "value",  
    clear: "value",  
    stop: "value" 
} 

除非它在的地方看中“价值观”,有些是功能,有些元素等

而最后一件事,以“钳”您的播放器下来,他们就不能去画布之外,你需要与你的后“控制器”是这样设定的界限,但在更新位置之前:

Number.prototype.clamp = function(min, max) { 
    return Math.min(Math.max(this, min), max); 
    }; 

    myGamePiece.x = myGamePiece.x.clamp(0, myGameArea.canvas.width - myGamePiece.width); 
    myGamePiece.y = myGamePiece.y.clamp(0, myGameArea.canvas.height - myGamePiece.height); 

一个的jsfiddle证明:

https://jsfiddle.net/tty7y1gr/3/