HTML5技术

canvas 制作flappy bird(像素小鸟)全流程 - 熊猫呵呵哒(2)

字号+ 作者:H5之家 来源:博客园 2016-08-26 11:01 我要评论( )

var Bird = function (img,x,y,speed,a,ctx){ this .img = img; this .x = x; this .y = y; this .speed = speed; this .a = a ; this .ctx = ctx; this .index = 0; // 用于制作小鸟扇翅膀的动作 }Bird.prototype.

var Bird = function (img,x,y,speed,a,ctx){ this.img = img; this.x = x; this.y = y; this.speed = speed; this.a =a ; this.ctx = ctx; this.index = 0; //用于制作小鸟扇翅膀的动作 } Bird.prototype.draw = function (){ this.ctx.drawImage( this.img,52*this.index,0,52,45, this.x,this.y,52,45 ) } var durgather=0; Bird.prototype.update = function(dur){ //小鸟翅膀扇动每100ms切换一张图片 durgather+=dur; if(durgather>100){ this.index++; if(this.index===2){ this.index=0; } durgather -= 100; } .speed = this.speed + this.a *dur; this.y = this.y + this.speed * dur; }

小鸟的构造函数及动作控制

  构造一个小鸟,并且将其动作刷新函数和绘制函数放置在我们上面提到的绘制区域,此后构造出的类似对象都是这样的操作步骤:

  这里需要注意的一点是,如何让小鸟顺畅的向上飞翔,其实还是物理知识,由于加速度的作用,我们给小鸟一个向上的顺时速度就可以了。

load(imglist ,function(imgEls){ bird = new Bird(imgEls["birds"],150,100,0.0003,0.0006,ctx); preTime= Date.now(); function run(){ var now = Date.now(); dt = now - preTime; preTime = now; ctx.clearRect(0,0,800,600); //--------图片绘制区域------- bird.update(dt) bird.draw(); //------------------------- requestAnimationFrame(run); } requestAnimationFrame(run); //设置点击事件。给小鸟一个瞬时的向上速度 cvs.addEventListener("click",function(){ bird.speed = -0.3; } ) })

绘制小鸟,点击小鸟上飞

效果如下:

2.2天空的绘制:

  天空的绘制比较简单了,只要使用canvas drawImage的三参数模式就可以(图源,画布上的坐标)。

  这里唯一注意的一点是,无缝滚动的实现,对于800*600分辨率这种情况我们创建两个天空对象就可以了,但是为了适配更多的情况,我们将这个功能写活

  在天空的构造函数上加一个count属性设置几个天空图片,count属性让实例通过原形中的方法访问。后面涉及到重复出现的地面和管道,都给它们添加这种考虑。

var Sky = function(img,x,speed,ctx) { this.img = img ; this.ctx = ctx; this.x = x; this.speed = speed; } Sky.prototype.draw = function(){ this.ctx.drawImage( this.img ,this.x,0 ) } Sky.prototype.setCount = function(count){ Sky.count = count; } Sky.prototype.update = function(dur){ this.x = this.x+ this.speed * dur; .x = Sky.count * 800 + this.x; //当向左移动了一整张图片后立刻切回第一张图片 } }

天空构造函数及运动函数

  同理在主函数中创建2个天空对象,并将更新函数和绘制函数放置在主循环的绘制区域;

  setcount是用来设置无缝滚动的

  注意一点:绘制上的图片是有一个层级关系的,不能把鸟画到天空的下面,那当然最后画鸟了,下面涉及到的覆盖问题不再专门提到。

  这里仅插入部分相关代码

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 正确制作一个iframe,认识iframe - 33xyx

    正确制作一个iframe,认识iframe - 33xyx

    2016-08-23 17:00

  • html5 canvas首屏自适应背景动画循环效果代码 - 上善如水211

    html5 canvas首屏自适应背景动画循环效果代码 - 上善如水211

    2016-08-23 16:00

  • CSS3制作动画的三个属性 - 木昜

    CSS3制作动画的三个属性 - 木昜

    2016-08-12 13:00

  • css3制作旋转立方体相册 - 不会飞的麻雀

    css3制作旋转立方体相册 - 不会飞的麻雀

    2016-08-11 14:00

网友点评
.