热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

html5游戏开发-愤怒的小鸟-开源讲座(一)-跳入弹出的小鸟

愤怒的小鸟是一款人气火爆的益智游戏,现在我试着用lufylegend库件和Box2dWeb物理引擎来看看在html5中如何制作此类经典的物理游戏。准备工作一首先,你需要下载lufylegend库件1.4.1版关于lufylegend库件的使用...SyntaxHighlighte

愤怒的小鸟是一款人气火爆的益智游戏,现在我试着用lufylegend库件和Box2dWeb物理引擎来看看在html5中如何制作此类经典的物理游戏。

准备工作一

首先,你需要下载lufylegend库件1.4.1版

  关于lufylegend库件的使用方法,大家可以看一下我以前的一些文章和教程,或者看下面的api说明。

准备工作二

由于笔者的失误,没有将Box2dWeb的功能封转完,要制作物理游戏的话,不得不对lufylegend-1.4.1做一些扩展,大家可以下载这个扩展文件,等下次库件的1.5版发布的时候会将这些扩展加进去的。

 

做好了了上面的准备工作,现在就来跟着笔者来一步步的试一下吧。

一,旋转飞起的小鸟

首先来建一个小鸟

[Javascript]
function Bird(){ 
    base(this,LSprite,[]); 
    var self = this; 
    var bitmap = new LBitmap(new LBitmapData(imglist["bird1"])); 
    self.addChild(bitmap); 

有了这个类,我们把它显示到画面上就很简单了
[Javascript] 
backLayer = new LSprite();   
addChild(backLayer); 
bird = new Bird(); 
bird.rotate = 0; 
bird.x = 200; 
bird.y = 430; 
bird.yspeed = -5; 
backLayer.addChild(bird); 
玩过愤怒的小鸟的朋友们都知道,游戏开始时,小鸟跳上弹弓的时候有一个旋转动作,我现在通过lufylegend库件的LTweenLite缓动类来实现这一功能。
[Javascript]
LTweenLite.to(bird,1, 
    {  
        x:100, 
        yspeed:5, 
        delay:1, 
        rotate:-360, 
        onUpdate:function(){ 
            bird.y += bird.yspeed; 
        }, 
        onComplete:function(){ 
            start(); 
        }, 
        ease:Sine.easeIn 
    } 
); 
通过上面的代码可以看到,LTweenLite类不但可以改变一些LSprite对象的常用属性,其实可以改变任意自定义的属性,上面就是通过LTweenLite将yspeed由-5变到了,然后通过onUpdate来改变小鸟的y坐标。
二,弹出的小鸟

接下来在小鸟弹起后的位置加上一个弹弓

[Javascript] 
bitmap = new LBitmap(new LBitmapData(imglist["slingshot1"])); 
bitmap.x = 215; 
bitmap.y = 290; 
backLayer.addChild(bitmap); 
 
bird = new LSprite(); 
bird.name = "bird01"; 
backLayer.addChild(bird); 
bitmap = new LBitmap(new LBitmapData(imglist["bird1"])); 
bird.addChild(bitmap); 
 
bitmap = new LBitmap(new LBitmapData(imglist["slingshot2"])); 
bitmap.x = 190; 
bitmap.y = 290; 
backLayer.addChild(bitmap); 
效果如图

 

上面代码将弹弓的前后两个分叉加到了画面上。
接着通过鼠标来拖拽小鸟,首先加入鼠标按下事件
[Javascript]
backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,downStart); 
startX = bird.x + bird.getWidth()*0.5; 
startY = bird.y + bird.getHeight()*0.5; 
上面代码加上了鼠标事件,并记录下了小鸟中心的位置作为弹弓的中心位置。
然后当鼠标按下的时候,判断下鼠标是否点击到了小鸟,然后移除鼠标按下事件,并加入鼠标移动事件和鼠标弹起事件。
[Javascript] 
function downStart(event){ 
    if(event.offsetX > bird.x && event.offsetX         event.offsetY > bird.y && event.offsetY         backLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,downStart); 
        backLayer.addEventListener(LMouseEvent.MOUSE_MOVE,downMove); 
        backLayer.addEventListener(LMouseEvent.MOUSE_UP,downOver); 
    } 

先来实现下鼠标移动时候的,让小鸟跟随鼠标
[Javascript] 
unction downMove(event){ 
    var r = Math.sqrt(Math.pow((startX - event.selfX),2)+Math.pow((startY - event.selfY),2)); 
    if(r > 100)r = 100; 
    var angle = Math.atan2(event.selfY - startY,event.selfX - startX); 
    bird.x = Math.cos(angle) * r + startX - bird.getWidth()*0.5; 
    bird.y = Math.sin(angle) * r + startY - bird.getHeight()*0.5; 

解释下上面的代码,首先,计算鼠标位置和弹弓的中心位置之间的距离,当距离大于100的时候,使其等于100。接着计算鼠标拖拽的角度,然后通过这个角度来计算并设置小鸟的坐标。
接着,看一下鼠标弹起后的功能,上面的代码里并没有用到box2dweb,我通过将小鸟变为box2d刚体,然后给小鸟加上一个力,来让小鸟弹飞出去。

[Javascript]
function downOver(event){ 
    backLayer.removeEventListener(LMouseEvent.MOUSE_UP,downOver); 
    backLayer.removeEventListener(LMouseEvent.MOUSE_MOVE,downMove); 
     
    var startX2 = bird.x + bird.getWidth()*0.5; 
    var startY2 = bird.y + bird.getHeight()*0.5; 
    var r = Math.sqrt(Math.pow((startX - startX2),2)+Math.pow((startY - startY2),2)); 
    var angle = Math.atan2(startY2 - startY,startX2 - startX); 
     
    bird.addBodyCircle(bird.getWidth()*0.5,bird.getHeight()*0.5,bird.getWidth()*0.5,1,.5,.4,.5); 
    var force = 7; 
    var vec = new LGlobal.box2d.b2Vec2(-force*r*Math.cos(angle),-force*r*Math.sin(angle)); 
    bird.box2dBody.ApplyForce(vec, bird.box2dBody.GetWorldCenter()); 

上面代码首先计算了一下小鸟的被拖拽的距离,以及被拖拽的角度。
addBodyCircle给小鸟加入body,让其变为一个刚体。

ApplyForce给刚体加上一个力。

好了,点开下面链接进行测试,通过拖拽小鸟,将小鸟弹飞出去吧。

 

下面给出本次教程的源码,当然,lufylegend库件和box2dweb需要自己下载配置一下
作者:lufy_Legend


推荐阅读
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • 前言对于从事技术的人员来说ajax是这好东西,都会使用,而且乐于使用。但对于新手,开发一个ajax实例,还有是难度的,必竟对于他们这是新东西。leo开发一个简单的ajax实例,用的是 ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • Itwasworkingcorrectly,butyesterdayitstartedgiving401.IhavetriedwithGooglecontactsAPI ... [详细]
  • Iwouldliketobeabletohaveasidebarthatcanbetoggledinandoutonabuttonpress.However ... [详细]
  • 但有时候,需要当某事件触发时,我们先做一些操作,然后再跳转,这时,就要用JAVASCRIPT来实现这一跳转功能。下面是具体的做法:一:跳转到新页面,并且是在新窗口中打开时:复制代码代码如下:fu ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 该对象中的属性方法和数学有关.abs(x)返回数的绝对值。exp(x)返回e的指数。floor(x)对数进行下舍入。log(x)返回数的自然对数(底为e)。 ... [详细]
  • get()方法用于拦截某个属性的读取操作,如果没有该属性的时候会报一个undefined的,如果结果get处理会返回对应的错误信息varperson{name:张三 ... [详细]
  • [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑
    [JavaScript]多数前端工程师都没注意到的一个关于console.log()的坑请阅读以下代码并猜测结果:functiontest(){le ... [详细]
  • JavaScript - let和var区别
    前提ES5只有函数作用域和全局作用域,var属于ES5。let属于ES6,新增块级作用域。目的是可以写更安全的代码。Theletstatementdeclaresablocks ... [详细]
  • 用JavaScript实现的太空人手表
    用JavaScript实现的太空人手表-JS写的太空人手表,没有用canvas、svg。主要用几个大的函数来动态显示时间、天气这些。天气的获取用到了AJAX请求。代码中有详细的注释 ... [详细]
  • javascript如何判断值是否为undefined
    这篇文章主要介绍“javascript如何判断值是否为undefined”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ja ... [详细]
  • Whyusingstringsaskeysofarray,consoleisshowingthatarraywithoutthesedeclaredvaluesand ... [详细]
author-avatar
澳洲开奥拓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有