- 浏览: 972520 次
- 性别:
- 来自: 山西
文章分类
最新评论
-
白小默:
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel ...
jxls 使用模板文件导出生成excel -
zkzqzzz:
博主威武!
让微信二维码扫描您的APK -
zkzqzzz:
感谢博主 原来那些类都不是必须的 或者自己写!!博主真棒 ...
抢红包插件实现原理浅析 -
zkzqzzz:
博主 请问你的其他类在哪里呢?
抢红包插件实现原理浅析 -
zkzqzzz:
其他类在哪呢?
抢红包插件实现原理浅析
在前面已经实现了利用外力将小鸟弹飞出去,并且实现了镜头的跟随。本次来研究一下小鸟与其他物体之间发生碰撞时的冲力,以及由碰撞而使物体发生变形,进而消失.
其实在box2d中,只要我们设定了物体的密度,摩擦,以及弹力等属性之后,他们之间会模拟真实的世界进行碰撞,如果想要根据这些碰撞来做一些特殊的处理的话,就需要取得它们之间碰撞的冲力,从而根据冲力的大小来做自己想要做的事情,在lufylegend库件中使用下面一行代码来检测碰撞。
- LGlobal.box2d.setEvent(LEvent.POST_SOLVE,postSolve);
LGlobal.box2d.setEvent(LEvent.POST_SOLVE,postSolve);碰撞函数如下,接受两个参数
- function postSolve(contact, impulse){
- }
function postSolve(contact, impulse){ }然后用impulse.normalImpulses[0]来取得碰撞产生的冲力大小。
下面,我们来根据碰撞的冲力来控制猪头的状态,首先准备下面两张图
然后,建立Pig类如下
- function Pig(){
- base(this,LSprite,[]);
- var self = this;
- self.hp = 200;
- self.name = "pig";
- self.list = ["pig01","pig02"];
- self.bitmap = new LBitmap(new LBitmapData(imglist[self.list[0]]));
- self.addChild(self.bitmap);
- self.addBodyCircle(24,self.bitmap.getHeight()*0.5,self.bitmap.getWidth()*0.5,1,5,.4,.13);
- }
- Pig.prototype.hit = function(value){
- var self = this;
- if(value < 10)return;
- if(self.hp == 200)self.bitmap.bitmapData = new LBitmapData(imglist[self.list[1]]);
- self.hp -= value;
- }
function Pig(){ base(this,LSprite,[]); var self = this; self.hp = 200; self.name = "pig"; self.list = ["pig01","pig02"]; self.bitmap = new LBitmap(new LBitmapData(imglist[self.list[0]])); self.addChild(self.bitmap); self.addBodyCircle(24,self.bitmap.getHeight()*0.5,self.bitmap.getWidth()*0.5,1,5,.4,.13); } Pig.prototype.hit = function(value){ var self = this; if(value < 10)return; if(self.hp == 200)self.bitmap.bitmapData = new LBitmapData(imglist[self.list[1]]); self.hp -= value; }上面代码,在构造器里首先给猪头设置了一张健康的状态图片,然后在hit函数里,将猪头的图片变成了一张受伤的图片。
有了上面的Pig类,只要在猪头和其他物体之间发生碰撞的时候,将碰撞的冲力传入hit函数,就能控制猪头的状态和hp的值,当然你也可以为猪头准备多种状态的图片,比如轻伤,重伤等,然后在hit函数中根据它的hp值的大小,来给他设定不同的显示图片。
另外,在愤怒的小鸟这个游戏中,每个物体也都是有它的不同的状态的,比如下面的两张图,表示木条的两个状态
为了便于操作这些物体,我们和上面的猪头一样,建立一个Stage类,如下
- function Stage(list,rotate,m,ctrl){
- base(this,LSprite,[]);
- var self = this;
- self.name = "stage";
- self.ctrl = ctrl;
- self.list = list;
- self.bitmap = new LBitmap(new LBitmapData(imglist[self.list[0]]));
- self.hp = 200;
- self.addChild(self.bitmap);
- self.addBodyPolygon(self.bitmap.getWidth(),self.bitmap.getHeight(),1,m,.4,.2);
- if(rotate != 0)self.setRotate(rotate*Math.PI/180);
- }
- Stage.prototype.hit = function(value){
- var self = this;
- if(!self.ctrl)return;
- if(value < 1)return;
- if(self.hp == 200)self.bitmap.bitmapData = new LBitmapData(imglist[self.list[1]]);
- self.hp -= value;
- }
function Stage(list,rotate,m,ctrl){ base(this,LSprite,[]); var self = this; self.name = "stage"; self.ctrl = ctrl; self.list = list; self.bitmap = new LBitmap(new LBitmapData(imglist[self.list[0]])); self.hp = 200; self.addChild(self.bitmap); self.addBodyPolygon(self.bitmap.getWidth(),self.bitmap.getHeight(),1,m,.4,.2); if(rotate != 0)self.setRotate(rotate*Math.PI/180); } Stage.prototype.hit = function(value){ var self = this; if(!self.ctrl)return; if(value < 1)return; if(self.hp == 200)self.bitmap.bitmapData = new LBitmapData(imglist[self.list[1]]); self.hp -= value; }原理和Pig类相同,就不多做解释了。
然后,在主函数中加入一些物体,如下
- setStage(["desk"],800,430,0,10,false);
- setStage(["desk"],970,430,0,10,false);
- setStage(["st11","st12"],935,410,0,1,true);
- setStage(["st01","st02"],905,370,90,1,true);
- setStage(["st01","st02"],965,370,90,1,true);
- setStage(["st11","st12"],935,310,0,1,true);
- setStage(["st31","st32"],817,370,90,1,true);
- setStage(["st31","st32"],970,370,90,1,true);
- setStage(["st31","st32"],895,250,0,1,true);
- setStage(["st21","st22"],955,230,0,1,true);
- setStage(["st31","st32"],858,150,90,1,true);
- setStage(["st31","st32"],925,150,90,1,true);
- setStage(["st11","st12"],935,50,0,1,true);
- setStage(["st21","st22"],950,30,90,1,true);
- setStage(["st21","st22"],800,430,90,1,true);
- setStage(["st21","st22"],1100,430,90,1,true);
- var pig = new Pig();
- pig.x = 950;
- pig.y = 173;
- backLayer.addChild(pig);
setStage(["desk"],800,430,0,10,false); setStage(["desk"],970,430,0,10,false); setStage(["st11","st12"],935,410,0,1,true); setStage(["st01","st02"],905,370,90,1,true); setStage(["st01","st02"],965,370,90,1,true); setStage(["st11","st12"],935,310,0,1,true); setStage(["st31","st32"],817,370,90,1,true); setStage(["st31","st32"],970,370,90,1,true); setStage(["st31","st32"],895,250,0,1,true); setStage(["st21","st22"],955,230,0,1,true); setStage(["st31","st32"],858,150,90,1,true); setStage(["st31","st32"],925,150,90,1,true); setStage(["st11","st12"],935,50,0,1,true); setStage(["st21","st22"],950,30,90,1,true); setStage(["st21","st22"],800,430,90,1,true); setStage(["st21","st22"],1100,430,90,1,true); var pig = new Pig(); pig.x = 950; pig.y = 173; backLayer.addChild(pig);setStage函数如下,是为了实例化一个物体
- function setStage(list,x,y,rotate,m,ctrl){
- var stageLayer = new Stage(list,rotate,m,ctrl);
- stageLayer.x = x;
- stageLayer.y = y;
- backLayer.addChild(stageLayer);
- return stageLayer;
- }
function setStage(list,x,y,rotate,m,ctrl){ var stageLayer = new Stage(list,rotate,m,ctrl); stageLayer.x = x; stageLayer.y = y; backLayer.addChild(stageLayer); return stageLayer; }上面的代码生成的画面如下
如果你玩过愤怒的小鸟这个游戏的话,对上面的画面应该不陌生吧,它就是愤怒的小鸟第一关的画面。
接下来,修改碰撞检测函数,因为我在lufylegend库件中将body的UserData设置成了LSprite对象本身,所以这里通过GetUserData来得到LSprite对象
- function postSolve(contact, impulse){
- if(contact.GetFixtureA().GetBody().GetUserData().hit)contact.GetFixtureA().GetBody().GetUserData().hit(impulse.normalImpulses[0]);
- if(contact.GetFixtureB().GetBody().GetUserData().hit)contact.GetFixtureB().GetBody().GetUserData().hit(impulse.normalImpulses[0]);
- }
function postSolve(contact, impulse){ if(contact.GetFixtureA().GetBody().GetUserData().hit)contact.GetFixtureA().GetBody().GetUserData().hit(impulse.normalImpulses[0]); if(contact.GetFixtureB().GetBody().GetUserData().hit)contact.GetFixtureB().GetBody().GetUserData().hit(impulse.normalImpulses[0]); }有了上面的碰撞,现在运行游戏的话,可以得到下面的效果
可以看到,画面中的猪头和一些木条的状态都已经发生了变化了,这样我们就完成了根据碰撞来改变物体的状态了,下面当猪头的hp变为0的时候,将它移除游戏画面。
一般猪头在消失的时候,会有一个类似爆炸的效果,如下图
下面建立一个RemoveObject类来实现这一效果
- function RemoveObject(){
- base(this,LSprite,[]);
- var self = this;
- self.name = "remove";
- self.index = 0;
- self.bitmap = new LBitmap(new LBitmapData(imglist["remove"]));
- self.addChild(self.bitmap);
- }
- RemoveObject.prototype.run = function(){
- var self = this;
- if(self.index++ > 20){
- self.parent.removeChild(self);
- }
- }
function RemoveObject(){ base(this,LSprite,[]); var self = this; self.name = "remove"; self.index = 0; self.bitmap = new LBitmap(new LBitmapData(imglist["remove"])); self.addChild(self.bitmap); } RemoveObject.prototype.run = function(){ var self = this; if(self.index++ > 20){ self.parent.removeChild(self); } }上面的run函数中,之所以要在运行20次循环之后才将其移除,是为了让上面的爆炸状态稍微持续一小段时间,然后才消失。
剩下最后一个处理,就是在循环函数中,监视这些物体的状态,来控制它们什么时候消失
- function onframe(){
- if(bird){
- backLayer.x = LGlobal.width*0.5 - (bird.x + bird.getWidth()*0.5);
- if(backLayer.x > 0){
- backLayer.x=0;
- }else if(backLayer.x < LGlobal.width - 1600){
- backLayer.x = LGlobal.width - 1600;
- }
- LGlobal.box2d.synchronous();
- }
- var child;
- for(var key in backLayer.childList){
- child = backLayer.childList[key];
- if(child.name == null)continue;
- if(child.x < -child.getWidth() || child.x > backLayer.getWidth()){
- backLayer.removeChild(child);
- if(child.name == "bird01"){
- bird = null;
- backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,moveStart);
- backLayer.addEventListener(LMouseEvent.MOUSE_MOVE,moveRun);
- backLayer.addEventListener(LMouseEvent.MOUSE_UP,moveEnd);
- }
- }else if((child.name == "stage" || child.name == "pig") && child.hp <= 0){
- if(child.name == "pig"){
- var removeObj = new RemoveObject();
- removeObj.x = child.x;
- removeObj.y = child.y;
- backLayer.addChild(removeObj);
- }
- backLayer.removeChild(child);
- }else if(child.name == "remove"){
- child.run();
- }
- }
- }
function onframe(){ if(bird){ backLayer.x = LGlobal.width*0.5 - (bird.x + bird.getWidth()*0.5); if(backLayer.x > 0){ backLayer.x=0; }else if(backLayer.x < LGlobal.width - 1600){ backLayer.x = LGlobal.width - 1600; } LGlobal.box2d.synchronous(); } var child; for(var key in backLayer.childList){ child = backLayer.childList[key]; if(child.name == null)continue; if(child.x < -child.getWidth() || child.x > backLayer.getWidth()){ backLayer.removeChild(child); if(child.name == "bird01"){ bird = null; backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,moveStart); backLayer.addEventListener(LMouseEvent.MOUSE_MOVE,moveRun); backLayer.addEventListener(LMouseEvent.MOUSE_UP,moveEnd); } }else if((child.name == "stage" || child.name == "pig") && child.hp <= 0){ if(child.name == "pig"){ var removeObj = new RemoveObject(); removeObj.x = child.x; removeObj.y = child.y; backLayer.addChild(removeObj); } backLayer.removeChild(child); }else if(child.name == "remove"){ child.run(); } } }上面代码都很简单,就不解释了,其中小鸟消失之后,我加入了三个事件,用来移动屏幕,最后会给出完整代码,大家可以看一下
- backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,moveStart);
- backLayer.addEventListener(LMouseEvent.MOUSE_MOVE,moveRun);
- backLayer.addEventListener(LMouseEvent.MOUSE_UP,moveEnd);
backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,moveStart); backLayer.addEventListener(LMouseEvent.MOUSE_MOVE,moveRun); backLayer.addEventListener(LMouseEvent.MOUSE_UP,moveEnd);
好了,下面是效果图和测试连接,试试看吧
http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample04/index.html
大家可以看到,上面的小鸟已经把猪头给撞爆了!
下面给出本次教程的源码,lufylegend库件和box2dweb需要自己下载配置一下,库件1.4.1的扩展部分请到第一讲中下载。
http://fsanguo.comoj.com/download.php?i=AngryBirds3.rar
本系列讲座到此为止了,愤怒的小鸟的基本功能已经都实现了,剩下的就是将元素多样化了,大家可以尽情发挥自己的想象力,制作自己喜欢的物理游戏了。
发表评论
-
IOS-HTML5-Video标签不能播放
2019-05-06 12:04 1602h5的video标签 在UIwebview ... -
七步配置phonegap+cordova+ionic开发环境
2016-12-19 16:21 727本文讲的是Android混合 ... -
iOS企业应用发布教程
2016-11-01 08:51 424iOS企业应用可以不经过app store发布,而可以直接在 ... -
IOS在自己网站发布APP(企业版$299上线流程)
2016-11-01 08:49 487最近刚上线一个企业内 ... -
xcode Run Script Command /bin/sh failed with exit code 1
2016-09-09 17:38 1295Xcode编译库报错:Command /bin/sh fai ... -
(二十三):Objective-C代码混淆扩展----安全攻防之代码混淆的一个小工具iOS安全攻防
2016-09-09 15:10 1221http://blog.csdn.net/yiyaaixu ... -
iOS安全–浅谈关于iOS加固的几种方法,代码混淆,类名方法名混淆等
2016-09-09 15:00 822转自:http://www.blogfshare ... -
Request获取用户真实IP
2016-09-05 11:26 601在Servlet里,获取客户端的IP地址的方法是:reque ... -
IOS UIAlertView(警告框)方法总结
2016-09-02 16:17 413摘要 在IOS8之后,UIAle ... -
iOS控件AlertView的使用
2016-09-13 10:46 471http://www.idev101.com/code/U ... -
iOS安全攻防(二十三):Objective-C代码混淆
2016-09-02 16:10 488iOS安全攻防(二十三):Objective-C ... -
iOS安全攻防(二十):越狱检测的攻与防
2016-09-02 15:23 659越狱检测的攻与防 在应用开发过程中,我们希望 ... -
iOS安全–IOS应用调试检测以及反调试
2016-09-02 15:05 1735一、检测调试 当一个应用被调试的时候,会给进程设置一个标识 ... -
iOS程序 防止动态调试和代码注入
2016-09-02 15:02 2398iPhone真实的运行环境是没有sys/ptrace.h抛出。 ... -
IOS 程序禁止被调试
2016-08-31 10:33 552IOS程序发布后,禁止被调试设置: 4.3.3开发环境 ... -
iOS设备是否越狱的判断代码
2016-08-31 10:36 551苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全 ... -
苹果 App Store账号申请和证书申请发布app等知识
2016-07-21 15:27 915app store为开发者提供四种类型的申请: 个人i ... -
xcode 中生成和打包 ipa文件的方法和步骤
2016-07-21 15:15 541第一步:这里需要注意,要选择真机,否则Archive ... -
Xcode如何打包ipa安装包
2016-07-21 15:02 1305右键工程,选择“打开方式”->“X ... -
ios打包ipa的四种实用方法(.app转.ipa)
2016-07-21 15:01 4总结一下,目前.app包转为.ipa包的方法有以下几种: ...
相关推荐
本项目“MATLAB 2010a 游戏开发----愤怒的小鸟”就为我们展示了一个独特的应用场景,即使用MATLAB来构建一个游戏,模拟经典手机游戏“愤怒的小鸟”的玩法。 MATLAB 2010a是MATLAB的一个较早版本,虽然其功能相对于...
好东西一定得分享,自己现阶段需要好好学习一下QT。C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF。好东西而且分数不贵!解压密码qt。
基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket 开源的Java AIO框架.zip 基于java的开发源码-smart-socket ...
《Python游戏开发:愤怒的小鸟》 Python是一种广泛应用于各个领域的编程语言,其简洁明了的语法使得初学者也能快速上手。在游戏开发领域,Python搭配pygame库,可以轻松创建2D游戏,如我们今天要探讨的"愤怒的小鸟...
《C++设计模式--基于Qt4开源跨平台开发框架》涉及到qt的基础知识和容器语法的使用,qt中的设计模式,是很好的资料。现与大家一起分享。免费下载。 由于上传大小有限制,所以分为两部分。 第一部分下载地址: ...
《Java版 愤怒的小鸟开源游戏》是一款基于Java平台开发的开源游戏,它以经典游戏《愤怒的小鸟》为原型,为开发者提供了一种学习和实践Java游戏编程的机会。这款游戏的源代码开放,允许程序员深入理解游戏的内部机制...
《大恒双相机开发-C#-多线程项目开源解析》 在当今信息化时代,高效、稳定的图像处理系统成为许多领域不可或缺的技术支持。本项目"大恒-双相机开发-C#-多线程"正是这样的一个实例,它利用C#语言进行编程,实现了对...
基于java的开发源码-Solo Java开源博客.zip 基于java的开发源码-Solo Java开源博客.zip 基于java的开发源码-Solo Java开源博客.zip 基于java的开发源码-Solo Java开源博客.zip 基于java的开发源码-Solo Java开源博客...
打地鼠游戏设计c 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发...
基于java的开发源码-belog博客程序(Java开源博客系统).zip 基于java的开发源码-belog博客程序(Java开源博客系统).zip 基于java的开发源码-belog博客程序(Java开源博客系统).zip 基于java的开发源码-belog博客程序...
总结,基于JBox2D开发的Android高仿愤怒的小鸟游戏,需要深入理解物理引擎的工作原理,熟练运用碰撞检测、物理模拟和图形渲染等技术。通过精心设计的游戏逻辑和关卡,可以让玩家在享受游戏乐趣的同时,也能感受到...
C#源码系列7---一个开源ERP源码(C#)
【标题】"cocos-2d愤怒的小鸟2" 是一款基于Cocos2D游戏引擎开发的移动游戏,是著名游戏“愤怒的小鸟”的续作。Cocos2D是一款广泛应用于2D游戏开发的开源框架,它提供了丰富的功能,如场景管理、动画支持、物理引擎...
《Python Pygame游戏开发:愤怒的小鸟》 Python Pygame是一个强大的开源库,它为开发者提供了在Python中创建游戏和多媒体应用的能力。本项目“愤怒的小鸟”是基于Pygame模块构建的一个小型游戏,旨在展示如何利用...
基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的...
基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java...
总结,这个基于Cocos2dx和Box2d的“愤怒的小鸟”Demo展示了游戏开发中的物理模拟和跨平台技术的运用,为初学者提供了宝贵的实践案例,也为有经验的开发者提供了新的灵感和思路。通过学习和分析这个Demo,我们可以...
在《愤怒的小鸟》这样的游戏中,C++可以用来创建游戏的核心逻辑,包括角色的移动、碰撞检测以及游戏循环等关键部分。由于游戏需要实时运行,C++的性能优势在此显得尤为重要。 DirectX是微软推出的一组API,主要用于...
《愤怒的小鸟》是一款备受欢迎的休闲游戏,其Java版小游戏源码为我们提供了一次深入理解游戏开发的机会。本文将围绕这个主题,详细介绍Java编程语言在游戏开发中的应用,以及如何利用这些源码进行学习。 首先,让...
Java版 愤怒的小鸟开源游戏1