cocos2d-iPhone 点滴
1. 说下iphone游戏的启动流程
答:
(1) 主程序入口 – main.m
Int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIApplicationMain(argc, argv, nil, @”T01AppDelegate”);
[pool drain];
return 0;
}
(2) 讲程序的控制权传递给了应用程序代理对象 – 代码中是: T01AppDelegate
类T01AppDelegate 对象通过实现iphone OS 系统定义的应用程序接口UIApplicationDelegate 来处理当前应用程序需要处理的各种系统事件:
l 放弃控制权: applicationWillResignActive
l 获得控制权:applicationDidBecomeActive
l 内存报警:applicationDidReceiveMemoryWarning
l 程序退出提示:applicationWillTerminate
l 系统时间变化:applicationSignificantTimeChange
当完成初始化之后,通过函数applicationDidFinishLaunching将程序的控制权传递给Cocos2d-iphone的类库.
(3) 当Cocos2d-iphone 接收到程序的控制权之后,开始准备启动游戏主画面的准备:
3.1 获得主窗口对象(句柄) 由window保存.
3.2 将Cocos2d-iphone的”导演”与之绑定
3.3 设置”导演”对象的基本属性
3.4 导演创造场景
3.5 将对象层加入到当前场景
3.6 由导演对象启动并运行场景
2.如何安装cocos2d-iphone引擎到xcode中?
答: 启动终端,然后定位到cocos2d-iphone所在的目录,然后打命令…
./install-templates.sh
但是,如果安装不成功,就需要你有更高的权限,命令如下
----------------------------
sudo –s 回车
password: 然后输入密码回车
----------------------------
就能切换到 bash-3.2# 用户了.
3. Xcode4 如何设置set Active Target?
答: 点击product -> Edit Schema.. 弹出的页面 最下面有一个 Manage Schemes… 双击你要运行的**.xcodeproj文件,即可.
4. 几乎所有游戏开发中的组成元素?
答: 场景 层 精灵 导演 .
这4个元素的复杂程度决定了游戏的复杂程度.
5. 层(Layer)是如何处理事件的?
答: 我个人称为 : 下沉处理. 即 从最上层开始接收事件,如果不处理,事件下沉到下面的层以此类推,直到有一层处理了事件为止事件就不在下沉.
6. 为了方便,Cocos2d-iphone从技术实现角度提供了一些公用层,例如,处理菜单用的菜单曾(Menu) ,处理颜色显示的颜色层(ColorLayer)等.
7. 精灵的本质是什么?
答: 精灵就是一张不断变化的图片.
8. 什么是游戏?
答: 游戏就是 玩家操作一个或多个人工控制的精灵与一个或者若干个系统控制的精灵进行互动: 近身搏斗, 远程射击, 贴近对话等等.
9. 导演的作用(Cocos2d-iphone)?
答: 导演是按照工作流程,控制场景之间切换的.
既然控制场景的,就有一系列操作场景的方法, 例如: 终止, 压栈, 激活当前场景, 引导下一个场景.
特别说明: 同一时间,只有一个Scene(场景)处于激活状态;
可以说Scene 是Layer的一个容器.
10. 问:Director对象是操作场景的,那它有哪些属性和方法与场景有关呢?
答:
属性:
(1) Scene *runningScene_;
(2) Scene *nextScene;
(3) NSMutableArray *sceneStack_;
方法:
(1) (void) runWithScene: (Scene *) scene; 主程序启动,显示第一个场景的方法.
(2) (void) pushScene: (Scene *) scene; 挂起当前场景,并且压栈到队列中. 将传入场景设置为当前执行场景.
(3) (void) popScene; 执行队列中的最后一个场景,当前场景被释放.若队列中没有场景,系统自动退出,调用end方法.
(4) (void) replaceScene: (Scene *) scene; 直接用一个场景取代当前场景,当前场景被释放.
(5) (void) end; 结束场景运行;
11. CCLayer的主要功能是什么?
(1) 接收Iphone上的屏幕触摸(touch)操作输入.
(2) 接收动力感应(Accelerometer)输入
12. 为了方便开发,Cocos2d-iphone提供了一些直接可用层,分别有什么?
答: 3个.
颜色层 - ColorLayer : 这是一个透明的丶可以按照RGB设置填充颜色的层.可以通过setContentSize设置层大小,改变颜色块的尺寸. 也支持动作,可以闪烁丶渐变.
菜单层 – Menu : 这是一个以Menu对象为集合类,MenuItem类实例组成各种各样按钮的菜单管理选择画面层.
注意: 该层中的实例必须是MenuItem类或者子类的实例.
Menu类是控制MenuItem类实例的横向,竖向或者多行列排序展示MenuItem类实例的.
复合层 - MultiplexLayer
13. MenuItem是否可以直接使用,他的主要任务是什么?
答: MenuItem是基类,不要直接使用.作为所有菜单项的父类,MenuItem主要完成以下两个任务:
(1) 设置按钮的状态
(2) 负责回调处理函数.
14. 我在看MenuItem的子类和实现的文件中,发现一种常用的写法. 就是把父类的定义和子类的定义写在一个文件里,然后分别在不同的文件,实现不同的子类.例如:
#import <Foundation/Foundation.h>
/// 父类 ///
@interface Person
@end
/////////// 子类1
@interface Boy
@end
/////////// 子类2
@interface Gril
@end
----------------------------------
实现Boy类
#import “Person.h”
@implementation Boy
@end
实现Girl类
#import “Person.h”
@implementation Gril
@end
15. 分别说明Scene, layer, sprite的作用?
答:
Scene :
(1) 作为某个场景的总容器对象,包括所有的内容对象(菜单, 状态, 游戏角色, NPC) 都属于该对象.层叠关系通过CocosNode的addChild的Z参数决定.
(2) 实现场景切换的特殊效果.因为所有的场景切换特效都是从Scene的子类TransitionScene派生的. (记住 Cocos2d-iphone中,都要在类前面加上CCScene)
Layer – 为了处理输入问题
(1) Touch事件处理
(2) 动力感应处理
Sprite
(1) 展示静态图片(例如背景图)
(2) 使用AtlasSprite,展示游戏角色和NPC角色
16. 场景(Scene)间是如何转换的?
答:
(1) 首先,new一个场景容器
(2) 把要变的层,加到新开辟的scene里面
(3) 用导演换层
例如:
-(void)nextGame(id) sender
{
Scene *sc = [Scene node];
[sc addChild:[NextGameLayer node]];
[[Director sharedDirector] replaceScene:sc];
}
若,切换层的时候,需要特效,比如,渐变,幻灯片等,则可用到CCTransition及其子类,例如:
[Director sharedDirector] replaceScene:[CCTransitionSlideInR transitionWithDuration:1.2f scene:sc]];
17. Iphone平台提供了几种会图库? 分别是?
答: 两种. 分别是quartz 2D 和 OpenGL ES
Quartz 2d 是 Core Graphics 绘图库的子集.
OpenGL ES 是跨平台绘图库OpenGL的子集.(Cocos2d-iphone是用的这个)
他们有什么不同吗? 他们的坐标系原点就不同.
18. 什么是锚点(anchorPoint)?
答: anchorPoint是定义在精灵,层等中的一个点,放置精灵层等到坐标系中是一此点位参考点的.
19. *.fnt是什么格式,什么时候用到?
答: .fnt是字体文件集.可以加载到系统,生成相应的字体. 如:
CCLabelBMFont *showFont = [CCLabelBMFont labelWithString:@”hello world” fntFile:@”font09.fnt”];
20. CCTextureCache 和 CCSpriteBatchNode 和 CCSpriteFrameCache类的作用分别是什么?
答:
CCTextureCache
通过系统的类CCTextureCache,Cocos2d-iphone库,按照文件名为主键索引全部运行时读取的图像文件.当文件名一样时,直接返回内存图片而不再读取文件.
所有与图像文件有关的实现在底层统一透明调用CCTextureCache类的单例对象,保证最少的系统IO操作,提高程序运行效率.
CCSpriteBatchNode
通过批量提交绘画,减少OpenGL函数调用次数.
通过系统类CCSpriteSheet,Cocos2d-iphone库将所有CCSpriteBatchNode类对象所属的子CCSprite对象一次提交OpenGL输出.
CCSpriteFrameCache
管理动画效果的全部帧数,该类直接提供针对一个简单的图像处理工具http://zwoptex.zwople.com/输出文件支持.该类的实现也调用了CCTextureCache.
21. Cocos2d-iphone中循环调用回调函数的方法是什么?
答:[self schedule:@selector(step:) interval:1];
22. 如何设置一组动画,并且运行呢?
答:用CCAnimation,例如:
CCSpriteBatchNode *mgr = [CCSpriteBatchNode batchNodeWithFile:@”fight.png” capacity:5];
CCAnimation *ans = [CCAnimation animationWithArray:nil delay:0.2f];
[ans addFrameWithTexture:mgr.texture rect:CGRectMake(0, 0, 31, 30)];
[ans addFrameWithTexture:mgr.texture rect:CGRectMake(5, 0, 31, 30)];
[ans addFrameWithTexture:mgr.texture rect:CGRectMake(10, 0, 31, 30)];
这样ans对象就保存了一组动画帧.
如何根据动画创建动作的?
fight = [CCSprite spriteWithTexture:mgr.texture rect:CGRectMake(0, 0, 31, 30)];
id action = [CCAnimate actionWithAnimation:ans];
[fight runAction:[CCRepeatForever actionWithAction:action];
23. CCLayer遵守了什么协议,以方便用户的触摸动作? 协议定义的方法是什么?
答: CCLayer遵守的与触摸相关的协议是<CCStandardTouchDelegate>
@protocol CCStandardTouchDelegate <NSObject>
@optional
- (void) ccTouchesBegan: (NSSet *) touches withEvent:(UIEvent *) event;
- (void) ccTouchesMoved: (NSSet *) touches withEvent: (UIEvent *) event;
- (void) ccTouchesEnded: (NSSet *) touches withEvent: (UIEvent *) event;
- (void) ccTouchesCancelled: (NSSet *) touches withEvent: (UIEvent *) event;
@end
24. 实现了 <CCStandardTouchDelegate>协议的ccTouchXX方法,为什么在运行程序是不进入方法呢?
答: 要想启动触发事件,首先你需要在layer的初始化方法里,加入以下代码:
self.isTouchEnabled = YES; // 默认是NO
25. 双点触控,如何判断是手势的合同,还是分开?
答:
(1) 判断是否是双点触控
(2) 计算两点间的距离
(3) 在移动的方法里,判断两点间的距离,与之前俩点间的距离比较.
示例代码如下:
-(void) ccTouchesBegan:(NSSet *) touches withEvent:(UIEvent *) event {
NSSet *allTouches = [event allTouches];
float distances;
float afterMovedDistances;
swith([allTouches count]) {
case 1: //单点
break;
case 2 : // 两点
UITouch *touchStartPoint = [[allTouches allObjects] objectAtIndex:0];
UITouch *touchToPoint = [[allTouches allObjects] objectAtIndex:1];
distance = [self distanceBetweenTwoPoints:(UITouch *) start toPoint:(UITouch *) to];
break;
default:
break;
}
}
-(float) distanceBetweenTwoPoints:(UITouch *) start toPoint: (UITouch *) to {
CGPoint startLocation = [start locationInView:[start view]] ;
CGPoint toLocation = [[to locationInView:[to view]];
float x = startLocation.x – toLocation.x;
float y = startLocation.y – toLocation.y;
return sqrt(x * x + y * y); // 求 直角三角形斜线长
}
-(void) ccTouchesMoved: (NSSet *) touches withEvent: (UIEvent *) event {
NSSet *allTouches = [event allTouches];
swich([allTouches count]) {
case 1 : break;
case 2:
UITouch *startTouch = [[allTouches allObjects] objectAtIndex : 0];
UITouch *toTouch = [[allTouches allObjects] objectAtIndex:1];
afterMovedDistances = [self distanceBetweenTwoPoints:startTouch toPoint: toTouch];
if( distances > afterMovedDistances ) {
// 合拢手势
} else if (distances < afterMovedDistances) {
// 分开手势
}
break;
default:
break;
}
}
26. 如何判断触电是单击,还是双击?
答: 代码如下:
-(void) touchesEne: (NSSet *)touches withEvent: (UIEvent *) event {
NSSet *allTouches = [event allTouches];
switch([allTouches count]) {
case 1:
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
switch([touch tapCount]) {
case 1:
//单机
break;
case 2:
//双击
break;
default:
break;
}
default:
break;
}
}
27. Coco2d的事件处理机制?
答: 看教程 没看懂. [预留].
28. 手机上的地图按照画面滚动方式,分为哪几类?
答: 3类;
(1) 纵向滚动
打飞机类游戏
(2) 横向滚动
超级玛丽
(3) 横纵向滚动
RPG类.
29. 制作场景地图时,主要考虑到哪些问题?
答:
(1) 移动位置控制 : 主角在地图中移动时必须考虑到地图中物体的障碍, 不能越过墙体, 必须通过木桥渡过河流.更加真实的模拟会要求主角在不同的地面上有不同的移动速度.
(2) 地图的动态变化 : 主角在游戏过程中的行为导致地图变化(永久变化,不是临时变化,如: 敌人尸体腐烂,慢慢消失, 这种效果不涉及到修改地图).摧毁敌方建筑,修建我方建筑等
30. 地图编程应该考虑哪些问题?
答:
(1) 如何展示一个较大的地图场景.
(2) 地图对精灵的移动限制.
(3) 如何动态的改变局部地图的显示内容
31. 如何设置Cocos2d-iphone程序的启动横竖屏?
答: 在RootViewController.m文件里.
找到如下代码:
#elif GAME_AUTOROTATION == kGameAutorotationUIViewController
…
return ( UIInterfaceOrientationIsLandscape( interfaceOrientation ));
//return ( UIInterfaceOrientationIsPortrait( interfaceOrientation ) );
32. Map Editor工具的作用是什么? (Tiled地图编辑器,下载地址http://mapeditor.org/)
答: Map Editor是绘制场景地图的.生成的地图是*.tmx格式的(本质是XML文件).
注意:生成的地图,要与地图组成元素的*.png图片放在一起.
33. Cocos2d-iphone对于Tiled地图绘制工具的支持表现在哪些方面?
(1) 地图类型
& orthogonal isometric完全支持
& hexagonal 部分支持
(2) “瓦片”图集
& 不支持将图形文件保存到*.tmx文件中的嵌入式”瓦片”图集. 仅支持外部”瓦片”图集. 也就是说,地图必须是一个tmx文件和一个图像文件组成.
(3) 层
& Cocos2d-iphone 支持任意数量的层
& 每个层对应的编程接口类是TMXLayer (AtlasSpriteManager的子类)
& 每个 “瓦片” 对应的编程接口类是AtlasSprite
34. Cocos2d-iphone实现地图显示的2个主要组件文件是什么?
答: & 负责整体地图的显示: CCTMXTiledMap.h CCTMXTiledMap.m
& 负责xml文件读取和解析: CCTMXXMLParser.h CCTMXXMLParser.m
35. 如何加载游戏地图呢?
答: CCTMXTiledMap *gameWorld = [CCTMXTiledMap tiledMapWithFile:@”Level1.tmx”];
[self addChild:gameWorld z:0 tag:9];
36. CCTMXLayer的作用是什么?
答:CCTMXLayer是CCSpriteBatchNode的子类,我们知道CCSpriteBatchNode是把所有的图像缓存起来,CCTMXLayer的作用就是把地图的图像缓存起来,这样我们就能以”瓦片”单位取得地图上不同的”瓦片”.
37. 30帧/秒是什么意思?
答: 图像引擎以每秒30次的频率不断将内存数据所描绘的虚拟世界画到IPHONE屏幕上.
38. 由3类独立的程序逻辑组成了游戏程序的主要编程模型,是哪3类?
答:
(1) 用户输入: “触摸”或重力感应时玩家精灵下达各种指令
(2) AI引擎指令: 由系统对非玩家精灵下达的各种指令
(3) 各类定时逻辑: 前两类指定直接修改游戏精灵状态.
各类定时逻辑根据各种精灵的相互位置信息判断可能触发的精灵或环境变化.