`
shuai1234
  • 浏览: 972579 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

游戏开发-愤怒的小鸟-开源讲座(二)-跟随小鸟的镜头

 
阅读更多

上一讲中介绍了如何让小鸟旋转跳上弹弓,以及利用外部力使小鸟弹飞出去,但是如果不做任何处理的话,小鸟就这么直冲冲的飞出屏幕了,本次我们就要让镜头时刻跟随小鸟来移动。下面是上一讲的连接,没有看过上一讲的朋友们请先了解一下。

 

关于如何让镜头跟随某一物体,我一开始的想法就是循环所有物理世界里的物体,以小鸟作为参照物,然后来计算其他物体的相对坐标,从而实现镜头跟随。但是觉得每次循环所有物体有些麻烦,于是我专门请教了box2djs的作者technohippy(因为box2dweb和box2djs的原理相同),得出的结论和我的想法一样,需要循环所有物体,technohippy表示坐标计算在游戏中很平常,不用太过在意。于是我将坐标计算封装为synchronous函数,加到了1.4.1的扩展js中,下面说一下这个函数的用法。

在上一讲中,当鼠标弹起的时候,在弹起事件的侦听函数downOver里给小鸟加了一个力,使得小鸟弹飞了出去。下面给downOver函数加一行代码

 

[javascript] view plaincopyprint?
  1. backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);  
backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
然后,循环播放函数如下

 

 

[javascript] view plaincopyprint?
  1. function onframe(){  
  2.     backLayer.x = LGlobal.width*0.5 - (bird.x + bird.getWidth()*0.5);     
  3.     if(backLayer.x > 0){  
  4.         backLayer.x=0;  
  5.     }else if(backLayer.x < LGlobal.width - 1600){  
  6.         backLayer.x = LGlobal.width - 1600;  
  7.     }  
  8.     LGlobal.box2d.synchronous();  
  9.     if(bird && bird.x > backLayer.getWidth()){  
  10.         backLayer.removeChild(bird);  
  11.         bird = null;  
  12.     }  
  13. }  
function onframe(){
	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();
	if(bird && bird.x > backLayer.getWidth()){
		backLayer.removeChild(bird);
		bird = null;
	}
}
解释一下代码,首先通过小鸟的坐标,来计算backLayer层的相对坐标,下面的if是为了不让backLayer的坐标移出游戏的屏幕。

 

然后关键就是下面一行代码

[javascript] view plaincopyprint?
  1. LGlobal.box2d.synchronous();  
LGlobal.box2d.synchronous();
它实现了物理世界里所有物体的坐标的重新计算
最后,当小鸟移出屏幕之后,将小鸟消除。

 

上面的1600是为了看出效果所以将游戏世界设置的长了一点。

 

下面是效果图和测试连接,你可以将小鸟射出,看看镜头是不是跟着小鸟一起移动起来了?

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample03/index.html

 

为了让效果更明显一些,下面来加入一个猪和几个物体

首先新建一个Pig类

 

[javascript] view plaincopyprint?
  1. function Pig(){  
  2.     base(this,LSprite,[]);  
  3.     var self = this;  
  4.     var bitmap = new LBitmap(new LBitmapData(imglist["pig1"]));  
  5.     self.addChild(bitmap);  
  6.     self.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);  
  7. }  
function Pig(){
	base(this,LSprite,[]);
	var self = this;
	var bitmap = new LBitmap(new LBitmapData(imglist["pig1"]));
	self.addChild(bitmap);
	self.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
}
再新建一个setStage函数,来创建物体

 

 

[javascript] view plaincopyprint?
  1. function setStage(img,x,y,rotate,m){  
  2.     var stageLayer = new LSprite();  
  3.     backLayer.addChild(stageLayer);  
  4.     var bitmap = new LBitmap(new LBitmapData(imglist[img]));  
  5.     stageLayer.addChild(bitmap);  
  6.     stageLayer.x = x;  
  7.     stageLayer.y = y;  
  8.     stageLayer.addBodyPolygon(bitmap.getWidth(),bitmap.getHeight(),1,m,.4,.2);  
  9.     if(rotate != 0)stageLayer.setRotate(rotate*Math.PI/180);  
  10. }  
function setStage(img,x,y,rotate,m){
	var stageLayer = new LSprite();
	backLayer.addChild(stageLayer);
	var bitmap = new LBitmap(new LBitmapData(imglist[img]));
	stageLayer.addChild(bitmap);
	stageLayer.x = x;
	stageLayer.y = y;
	stageLayer.addBodyPolygon(bitmap.getWidth(),bitmap.getHeight(),1,m,.4,.2);
	if(rotate != 0)stageLayer.setRotate(rotate*Math.PI/180);
}
有了上面的准备,下面给游戏加入几个物体就很简单了,在游戏开始时的gameInit函数里加入下面代码

 

[javascript] view plaincopyprint?
  1. setStage("stage03",1070,430,0,10);  
  2. setStage("stage01",995,300,90,1);  
  3. setStage("stage01",1140,300,90,1);  
  4. setStage("stage02",1070,200,0,1.5);  
  5. setStage("stage04",1090,200,0,2);  
  6. var pig = new Pig();  
  7. pig.x = 1150;  
  8. pig.y = 400;  
  9. backLayer.addChild(pig);  
	setStage("stage03",1070,430,0,10);
	setStage("stage01",995,300,90,1);
	setStage("stage01",1140,300,90,1);
	setStage("stage02",1070,200,0,1.5);
	setStage("stage04",1090,200,0,2);
	var pig = new Pig();
	pig.x = 1150;
	pig.y = 400;
	backLayer.addChild(pig);
表示加入5个物体和一个猪,效果如图

 

但是,只是这样的话,上面这张图其实是看不到的,因为我把这些物体都加到了游戏屏幕的右边,而游戏开始时坐标是(0,0),我们看到的画面是游戏屏幕左边的部分,所以我一开始首先将镜头移动到游戏屏幕的右边。

 

[javascript] view plaincopyprint?
  1. backLayer.x = LGlobal.width - 1600;  
  2. LGlobal.box2d.synchronous();  
backLayer.x = LGlobal.width - 1600;
LGlobal.box2d.synchronous();
改动backLayer的坐标就不用说了,调用synchronous函数的作用依然是将物理世界的坐标重新计算。

 

然后,当画面出现后,稍作停顿后,就将镜头拉回到小鸟坐在位置,实现方法如下

 

[javascript] view plaincopyprint?
  1. LTweenLite.to(backLayer,1,  
  2.         {   
  3.             x:0,  
  4.             delay:2,  
  5.             onUpdate:function(){  
  6.                 LGlobal.box2d.synchronous();  
  7.             },  
  8.             onComplete:run,  
  9.             ease:Sine.easeIn  
  10.         }  
  11.     );  
LTweenLite.to(backLayer,1,
		{ 
			x:0,
			delay:2,
			onUpdate:function(){
				LGlobal.box2d.synchronous();
			},
			onComplete:run,
			ease:Sine.easeIn
		}
	);
大家可以看到,我还是用了LTweenLite缓动,参数delay:2表示,缓动延时2秒后执行,然后通过缓动将backLayer的x坐标变回0,在缓动的过程中调用synchronous,计算物理世界的坐标,这样就实现了镜头一开始显示的是屏幕右边,然后再快速移动到左边,废话不多说,现在看看效果吧。

 

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample03/index02.html



大家可以看到,用lufylegend库件结合box2dweb制作物理游戏竟然如此简单,还不快尝试一下大笑

下面给出本次教程的源码,老规矩,lufylegend库件和box2dweb需要自己下载配置一下,库件1.4.1的扩展部分请到第一讲中下载。

http://fsanguo.comoj.com/download.php?i=AngryBirds2.rar


本次就写到这里,碰撞检测还是留到下一讲吧,在第三讲中会让小鸟展示自己的威力,将屏幕上的猪猪撞得脑袋开花,敬请期待。

分享到:
评论

相关推荐

    MATLAB 2010a 游戏开发----愤怒的小鸟

    本项目“MATLAB 2010a 游戏开发----愤怒的小鸟”就为我们展示了一个独特的应用场景,即使用MATLAB来构建一个游戏,模拟经典手机游戏“愤怒的小鸟”的玩法。 MATLAB 2010a是MATLAB的一个较早版本,虽然其功能相对于...

    5C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF.zip

    好东西一定得分享,自己现阶段需要好好学习一下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 开源的Java AIO框架.zip 基于java的开发源码-smart-socket ...

    Python-愤怒的小鸟.zip

    《Python游戏开发:愤怒的小鸟》 Python是一种广泛应用于各个领域的编程语言,其简洁明了的语法使得初学者也能快速上手。在游戏开发领域,Python搭配pygame库,可以轻松创建2D游戏,如我们今天要探讨的"愤怒的小鸟...

    《C++设计模式--基于Qt4开源跨平台开发框架》part2

    《C++设计模式--基于Qt4开源跨平台开发框架》涉及到qt的基础知识和容器语法的使用,qt中的设计模式,是很好的资料。现与大家一起分享。免费下载。 由于上传大小有限制,所以分为两部分。 第一部分下载地址: ...

    Java版 愤怒的小鸟开源游戏

    《Java版 愤怒的小鸟开源游戏》是一款基于Java平台开发的开源游戏,它以经典游戏《愤怒的小鸟》为原型,为开发者提供了一种学习和实践Java游戏编程的机会。这款游戏的源代码开放,允许程序员深入理解游戏的内部机制...

    大恒-双相机开发-C#-多线程-项目开源

    《大恒双相机开发-C#-多线程项目开源解析》 在当今信息化时代,高效、稳定的图像处理系统成为许多领域不可或缺的技术支持。本项目"大恒-双相机开发-C#-多线程"正是这样的一个实例,它利用C#语言进行编程,实现了对...

    基于java的开发源码-md blockchain 开源java区块链平台.zip

    打地鼠游戏设计c 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发源码-md blockchain 开源java区块链平台.zip 基于java的开发...

    android基于开源游戏引擎jbox2d开发的高仿愤怒的小鸟游戏源码.rar

    本篇将详细介绍如何使用JBox2D来开发一个高仿愤怒的小鸟的游戏。 一、JBox2D简介 JBox2D是Java版本的Box2D物理引擎,它基于C++的Box2D,提供了一个强大的2D物理模拟环境,能够处理碰撞检测、刚体动力学以及关节...

    Python pygame 愤怒小鸟.rar

    《Python Pygame游戏开发:愤怒的小鸟》 Python Pygame是一个强大的开源库,它为开发者提供了在Python中创建游戏和多媒体应用的能力。本项目“愤怒的小鸟”是基于Pygame模块构建的一个小型游戏,旨在展示如何利用...

    cocos-2d愤怒的小鸟2

    【标题】"cocos-2d愤怒的小鸟2" 是一款基于Cocos2D游戏引擎开发的移动游戏,是著名游戏“愤怒的小鸟”的续作。Cocos2D是一款广泛应用于2D游戏开发的开源框架,它提供了丰富的功能,如场景管理、动画支持、物理引擎...

    愤怒的小鸟java版小游戏源码

    《愤怒的小鸟》是一款备受欢迎的休闲游戏,其Java版小游戏源码为我们提供了一次深入理解游戏开发的机会。本文将围绕这个主题,详细介绍Java编程语言在游戏开发中的应用,以及如何利用这些源码进行学习。 首先,让...

    C#源码系列7---一个开源ERP源码(C#)

    C#源码系列7---一个开源ERP源码(C#)

    基于Cocos2dx + box2d 实现的愤怒的小鸟Demo

    总结,这个基于Cocos2dx和Box2d的“愤怒的小鸟”Demo展示了游戏开发中的物理模拟和跨平台技术的运用,为初学者提供了宝贵的实践案例,也为有经验的开发者提供了新的灵感和思路。通过学习和分析这个Demo,我们可以...

    H5游戏源码分享-像素小鸟游戏(类似深海潜艇)

    开发者可能使用了如Phaser这样的开源游戏框架,该框架内置了物理引擎,能简化这类游戏的开发。 在与深海潜艇的比较中,我们可以看到两者都是基于垂直方向的移动和障碍物躲避。在深海潜艇游戏中,玩家控制潜艇在海底...

    Python小游戏-像素小鸟(Fallppybird)

    pygame是Python中一个广泛使用的开源游戏开发库,它提供了丰富的功能,包括窗口管理器、图形绘制、事件处理、音频播放等,使得开发者能够轻松构建2D游戏。在这个像素小鸟游戏中,我们主要会涉及到以下知识点: 1. *...

    愤怒的小鸟(VS2005)

    《愤怒的小鸟》是一款备受欢迎的休闲游戏,其在移动平台上的成功激发了许多开发者尝试将其移植到个人计算机(PC)上。在这个项目中,我们看到一个使用C++、DirectX(DX)和Box2D物理引擎实现的版本,特别针对Visual ...

    基于java的开发源码-开源LDAP浏览器 JXplorer.zip

    基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的开发源码-开源LDAP浏览器 JXplorer.zip 基于java的...

    Java版 愤怒的小鸟开源游戏1.zip

    Java版 愤怒的小鸟开源游戏1

    基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip

    基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java开源论坛系统 jeebbs v7.0 源码包.zip 基于java的开发源码-java...

Global site tag (gtag.js) - Google Analytics