现场演示(使用鼠标点击发射子弹)
zch 的回答很好,但问题是 HTML5画布坐标系和三角循环与平常不同,我们需要做一些数学技巧来计算与速度更新和子弹绘制相匹配的角度。
下面遵循我用于项目符号的代码:
// Bullet class
function Bullet(x, y, speed, angle, width, height, colors){
this.x = x;
this.y = y;
this.speed = speed;
this.angle = angle;
this.width = width;
this.height = height;
this.colors = colors;
this.frameCounter = 0;
}
Bullet.prototype.update = function(){
// (!) here we calculate the vector (vx, vy) that represents the velocity
var vx = this.speed * Math.cos(this.angle-(Math.PI/2));
var vy = this.speed * Math.sin(this.angle-(Math.PI/2));
// move the bullet
this.x += vx;
this.y += vy;
}
Bullet.prototype.draw = function(context, xScroll, yScroll){
context.save();
if(this.angle != 0) {
// translate to the orign of system
context.translate(this.x-xScroll, this.y-yScroll);
// rotate
context.rotate(this.angle);
// translate back to actual position
context.translate(xScroll-this.x, yScroll-this.y);
}
// animate the bullets (changing colors)
context.fillStyle = this.colors[this.frameCounter % this.colors.length];
this.frameCounter++;
// draw the bullet
context.fillRect((this.x-this.width/2) - xScroll, (this.y-this.height/2) - yScroll, this.width, this.height);
context.restore();
}
update
和draw
方法应该在每个子弹的每一帧都被调用。
现在比较更新函数中的这段代码
var vx = this.speed * Math.cos(this.angle-(Math.PI/2));
var vy = this.speed * Math.sin(this.angle-(Math.PI/2));
使用下面的代码,由 zch 回答。
var vx = speed * Math.cos(angle);
var vy = speed * Math.sin(angle);
这只是将我们的角度系统与画布旋转方法相匹配的数学转换。这是通过将第一个系统旋转 90 度来完成的。
请注意,您也可以这样做:
var vx = this.speed * Math.sin(this.angle);
var vy = this.speed * -Math.cos(this.angle);
三角函数是您制作有趣游戏的盟友!
记得为你的老板创建开火函数:
Boss.prototype.fire = function(){
var nBullets = 3; // number of bullets to fire
for(var x = 0; x < nBullets; ++x){
// angle between PI/2 and 3PI/2 (in radians)
var angle = (1 + 2 * Math.random()) * Math.PI / 2;
// create a new bullet
this.bullets.push(new Bullet(this.x, this.y, 10, angle, 2, 15, this.bulletsColors));
}
}
上面的代码假设你的老板有一个bullets
.
查看完整代码并播放演示