什么是游戏引擎
游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。
Cocos2d家族
cocos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员
- Cocos2d-x
- Cocos2d-iphone
- Cocos2d-android
本质区别:开发的语言不一样:Cocos2d-x使用c++、Cocos2d-iphone使用Object-C;共同点:api名字基本一致
我们为什么要使用cocos2d
- 一款开源的,跨平台,轻量级的2D游戏引擎。
- 性能良好
- 广泛的社区支持
- 拥护很多成功案例。比如捕鱼达人,三国塔防等
- 使用MIT授权协议。可以自由使用,修改源码,不需要像GPL一样公开源码,可以商用
架构
- 图形引擎Cocos2D Graphic
- 声音引擎CocosDenshion
- 物理引擎:Box2d、Chipmunk
架构说明
- Cocos2D Graphic图形引擎
- CocosDenshion Audio声音引擎
- 物理引擎
- Box2d
- Chipmunk
- Lua脚本库
Box2D是一个用于模拟2D刚体物体的C++引擎。作者为Erin Catto。
chipmunk本是一个独立的开源项目,用纯c编写
Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
图形引擎Cocos2D Graphic
CCDirector界面的统一管理者
图形引擎说明
- CCDirector(导演):引擎的控制者,控制场景的切换,游戏引擎属性的设置
- CCScene (场景):场景类,例如游戏的闪屏,主菜单,游戏主界面等。
- CCLayer(布景):图层类,每个图层都有自己的触发事件,该事件只能对其拥有的元素有效,而图层之上的元素所包含的元素,是不受其事件管理的
- CCSprite(人物):精灵类,界面上显示的最小单元
- CCNode:引擎中最重要的元素,所有可以被绘制的东西都是派生于此。它可以包含其它CCNode,可以执行定时器操作,可以执行CCAction。
- CCAction(动作):动作类,如平移、缩放、旋转等动作
CCDirector
CCGLSurfaceView
引擎中SurfaceView的子类,实现了SurfaceHolder.Callback接口,但并未实现Runnable接口。
存在问题:
1、绘制界面的线程是谁?
2、该线程是如何启动的?
CCDirector的作用
界面的绘制工作是由GLThread来完成,而GLThread的开启是在CCDirector的attachInView方法中完成的。
管理场景CCScene
CCDirector,导演类,负责管理和切换场景。还负责初始化openGL各项参数。
CCDirector引擎的控制者,控制场景的切换,游戏引擎属性的设置
单例模式,sharedDirector()取得对象
方法 | 功能描述 |
---|---|
sharedDirector() | 获取CCDirector对象,单例模式 |
attachInView() | 连接OpenGL的SurfaceView |
runWithScene() | 运行场景 |
replaceScene() | 替换场景 |
setDeviceOrientation() | 设置横屏竖屏 |
setDisplayFPS(true) | 显示fps帧率 |
setAnimationInterval(1.0f / 60) | 设置帧率,每秒刷新60次 |
setScreenSize(480, 320) | 设置屏幕分辨率,高于设置的分辨率时,引擎会自动适配 |
resume() | 进入运行状态 |
pause() | 暂停 |
end() | 结束 |
public class MainActivity extends Activity {
private CCDirector director;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CCGLSurfaceView surfaceView=new CCGLSurfaceView(this);
setContentView(surfaceView);
// 程序只能有一个导演
director = CCDirector.sharedDirector();
director.attachInView(surfaceView);// 开启线程
director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);// 设置游戏方向 水平
director.setDisplayFPS(true);//是否展示帧率
// director.setAnimationInterval(1.0f/30);// 锁定帧率 指定一个帧率 向下锁定
director.setScreenSize(480, 320);//设置屏幕的大小 可以自动屏幕适配
CCScene ccScene=CCScene.node();// 为了api 和cocos-iphone 一致
ccScene.addChild(new ActionLayer());//场景添加了图层
director.runWithScene(ccScene);// 运行场景
}
@Override
protected void onResume() {
super.onResume();
director.resume();
}
@Override
protected void onPause() {
super.onPause();
director.onPause();
//director.pause();
}
@Override
protected void onDestroy() {
super.onDestroy();
director.end();// 游戏结束了
}
}
FirstLayer
public class FirstLayer extends CCLayer {
private CCSprite ccSprite;
public FirstLayer() {
setIsTouchEnabled(true);// 打开触摸事件开关
init();
}
// 按下的事件
@Override
public boolean ccTouchesBegan(MotionEvent event) {
// 先把android坐标系中的点 转换成 cocos2d坐标系中的点
CGPoint convertTouchToNodeSpace = this.convertTouchToNodeSpace(event);
System.out.println("我被按下了");
CGRect boundingBox = ccSprite.getBoundingBox(); // 获取精灵的矩形
// 判断点是否在矩形之中
// 参数1 矩形 参数2 点
boolean containsPoint = CGRect.containsPoint(boundingBox, convertTouchToNodeSpace);
if(containsPoint){
ccSprite.setScale(ccSprite.getScale()+0.2);
}else{
ccSprite.setScale(ccSprite.getScale()-0.2);
}
//this.getChildByTag(10); 根据Tag标签 找对应的孩子
return super.ccTouchesBegan(event);
}
private void init() {
CCSprite bg = CCSprite.sprite("bbg_arena.jpg");
bg.setAnchorPoint(0, 0);
this.addChild(bg,0); // 如果第二个参数越大 默认显示的越靠上面, 如果一样大 谁先添加谁显示在下面
ccSprite = CCSprite.sprite("z_1_attack_01.png");
ccSprite.setAnchorPoint(