第一次在这里发布,并且第一次使用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;
}
}
}
但这不起作用。我曾想用“ bullets.posy”替换为“ projectiles [i] .posy”,但最终说到“ projectiles [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射击。
谢谢。
最佳答案
第一部分似乎很清楚:调用了一个名为newbullet
的新项目符号对象,并由.posx
和.posy
设置了键ship.playerx
和ship.playery
的值。然后,将newbullet
存储在projectiles
数组中。
其余的不清楚。如您所知,Collision()
中for循环的if条件似乎是在引用.posy
构造函数的new bullet()
,而不是刚创建的对象(.posy
)的newbullet
。您还需要迭代for-loop projectiles.length - 1
时间,因为数组的索引为零:因此请在for-loop中使用<
运算符,而不要使用<=
运算符。
假设ship.playery
分配了一个数字值,也许尝试为变量通过“ cc”的for循环时为“射弹”数组中的每个项目分配一个变量...
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;
}
}
}
编辑:根据更新的问题
由于具有存储子弹的
Collision()
数组,因此可以轻松地将projectiles
文字对象转换为构造函数,并根据需要/需要/允许数量进行创建。然后,您的代码将按照我在第一段中的描述进行操作,如下所示:var projectiles = [];
var Bullet = function(x, y) {
this.posx: x,
this posy: y,
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;
}
};
/* --- */
if (69 in keysDown && timer == 0) { // E
var bullet = new Bullet(ship.playerx, ship.playery);
projectiles.push(bullet);
ship.shoot = true;
}
/* --- */
function Collision() {
// as above ....
}
...这也意味着您无需等待子弹到达
bullet
即可创建另一个。快速起火耶!!!