首次发布此处,并首次使用Javascript创建游戏。
我正在尝试在游戏中的两个物体,子弹和敌人之间创建碰撞,但就目前而言,当它到达屏幕顶部时,只是尝试用子弹发生事情。
当我按E时,会发生这种情况:
if (69 in keysDown && timer == 0) //E
{
var newbullet = Object.create(bullet);
newbullet.posx = ship.playerx;
newbullet.posy = ship.playery;
projectiles.push(newbullet);
ship.shoot = true;
}
然后子弹向上移动,如其更新功能中所述。
我在我的游戏循环中不断运行这个函数,它会检查碰撞,看起来像这样:
function Collision()
{
for (i = 0; i <= projectiles.length; i++)
{
if (bullet.posy < 0 )
{
ctx.fillText("HIT" , 160, 340);
ship.health -= 1;
}
}
}
但它不起作用。我想用“弹丸[i] .posy”代替“bullet.posy”,但它最终说射弹[i]未定义。
射弹是一个全球阵列。
var projectiles=[];
这是子弹:
var bullet =
{
posx:0,
posy:0,
speed: 10,
power: 2,
draw: function()
{
ctx.fillStyle = "rgb(200,100,0)";
ctx.beginPath();
ctx.rect(((this.posx - 5)), (this.posy - 30), 10, 25);
ctx.closePath();
ctx.fill();
},
setup: function(ax, ay)
{
this.posx = ax;
this.posy = ay;
},
update: function()
{
this.posy -= this.speed;
}
};
任何帮助或建议?
如果你想尝试一下,这是link E射击。
谢谢。
答案 0 :(得分:2)
第一部分似乎似乎很清楚:调用一个名为newbullet
的新子弹对象,其中.posx
和.posy
的值由{设置} {1}}和ship.playerx
。然后ship.playery
存储在newbullet
数组中。
其余的不太清楚。正如你所知,projectiles
中for循环的if条件似乎是引用Collision()
构造函数的.posy
,不是 {{1}刚刚创建的对象(new bullet()
)。您还希望迭代for循环.posy
次,因为数组是零索引的:所以在for循环中使用newbullet
运算符而不是projectiles.length - 1
运算符。
假设<
指定一个数字值,或者尝试为'projectiles'数组中的每个项目分配一个变量,因为它通过<=
的for循环...
ship.playery
编辑:根据更新的问题
由于您拥有用于存储项目符号的Collision()
数组,因此您可以轻松地将function Collision() {
var projLength = projectiles.length; // slight optimisation to for-loop
for (i = 0; i < projLength; i++) {
var thisBullet = projectiles[i]; // reassign variable each iteration
if (thisBullet.posy < 0 ) {
ctx.fillText("HIT" , 160, 340);
ship.health -= 1;
}
}
}
文字对象转换为构造函数,并根据您的喜好/需要/允许。然后,您的代码将遵循我的第一段中的描述,看起来像......
projectiles
...这也意味着您无需等待子弹到达bullet
,然后才能创建另一个。 RAPID FIRE yay !!!