javascript - 画布对象更新位置并重绘对象
问题描述
我有一个画布,在初始化页面时绘制了两个矩形对象。
我有一个 X 和 Y 的变量,当按下键盘按钮时它会发生变化,这可以正常工作。
我想在新的 X 和 Y 值发生变化时将其中一个对象方块“playerCar”移动,但我无法改变框。
我在不使用对象的情况下使用它,但想使用对象,以便我可以添加更多(当我学习它时)。
我试过playercar.draw(keyX, KeyY);
了,但这不是更新。
var canvas = document.getElementById('plot');
var context;
var keyX = 100;
var keyY = 100;
playerCar = new car(100, 100, 'red');
playerCar2 = new car(350, 100, 'blue');
init()
playerCar.draw();
playerCar2.draw();
document.addEventListener('keydown', function(event){
var keyPressed = event.keyCode;
switch(keyPressed){
case 104:
keyY = keyY -1;
break;
case 98:
keyY = keyY +1;
break;
case 100:
keyX = keyX -1;
break;
case 102:
keyX = keyX +1;
break;
}
playerCar.draw();
console.log('key Y = ' + keyY);
console.log('key X = ' + keyX);
});
function init(){
context = canvas.getContext('2d');
context.fillStyle = "green";
var plot = {height: 800, width: 800};
context.fillRect(1, 1, plot.width, plot.height);
}
function car (keyX, keyY, color){
carwidth = 150;
carHeight = 100;
this.x = keyX;
this.y = keyY;
this.color = color;
this.draw = function (){
context.fillStyle = this.color;
context.fillRect(this.x, this.y, carwidth, carHeight);
}
}
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<canvas id="plot" width="800" height="800"></canvas>
<script src="index.js"></script>
</body>
</html>
解决方案
您遇到的问题是您指望 KeyX 和 KeyY 的初始值,而不是存储在汽车对象中的那些。你需要增加playerCar.y
所以我换成keyY = keyY +1;
了playerCar.y += 1;
.
如您所见,我使用了 += 这只是编写相同内容的一种更短的方式,请参阅:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Assignment_Operators
你也可以使用playerCar.y++
,但你不能再调整它添加的数量。
除了这个问题之外,您还遇到了一个问题,即您没有重新绘制画布。这是一个稍微大一点的问题,在大多数游戏中,您将拥有一个负责所有绘图的绘图函数(循环)和一个负责逻辑(循环)的单独函数。
现在我添加了一个重绘函数,它可以重绘屏幕上的所有对象。
var canvas = document.getElementById('plot');
var context;
var keyX = 100;
var keyY = 100;
playerCar = new car(100, 100, 'red');
playerCar2 = new car(350, 100, 'blue');
init()
document.addEventListener('keydown', function(event){
var keyPressed = event.keyCode;
switch(keyPressed){
case 104:
playerCar.y += 1;
break;
case 98:
playerCar.y -= 1;
break;
case 100:
playerCar.x += 1;
break;
case 102:
playerCar.x -= 1;
break;
}
redraw()
console.log('key Y = ' + playerCar.y);
console.log('key X = ' + playerCar.x);
});
function init(){
context = canvas.getContext('2d');
redraw();
}
function redraw() {
context.fillStyle = "green";
var plot = {height: 800, width: 800};
context.fillRect(1, 1, plot.width, plot.height);
playerCar.draw();
playerCar2.draw();
}
function car (keyX, keyY, color){
carwidth = 150;
carHeight = 100;
this.x = keyX;
this.y = keyY;
this.color = color;
this.draw = function (){
context.fillStyle = this.color;
context.fillRect(this.x, this.y, carwidth, carHeight);
}
}
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<canvas id="plot" width="800" height="800"></canvas>
<script src="index.js"></script>
</body>
</html>
推荐阅读
- java - HTTP 状态 500 - 实例化 servlet 类时出错,在本地主机上运行,但不在 AWS Tomcat 上
- html - 仅在 chrome (android) 和 safari (iphone) 上堆叠的 div 之间有额外的空白
- reactjs - componentWillReceiveProps 已重命名
- c# - 字符串运算符 + 源代码在哪里?
- java - 即使输入数字出现在随机给定数字中,是什么导致该程序返回 false ?
- node.js - 使用 docker 部署 https Node.js 服务器的最佳方式是什么?
- grpc - 无法使用 bazel 构建项目。没有方法 new_http_archive()
- mysql - 1行表之间的MySQL连接非常慢
- ssl - 安全 RSocket 抛出 java.lang.IllegalArgumentException:既未指定 SslContextBuilder 也未指定 SslContext
- r - 在 gam mgcv 中使用线性泛函进行平滑预测