疯狂ios讲义之创建cocos2d项目(3)

简介:

13.3.3 cocos2d项目结构和代码分析

这一节将向游戏开发者介绍HelloWorld项目的目录结构,以及各个部分是如何协同工作的。通过本节的学习,你会对各个部分之间的联系有个大致的了解。

13.22显示了HelloWorld项目的项目导航面板。

164919_6G44_262659.jpg

164945_DMil_262659.jpg

164955_P8CU_262659.jpg

13.22


cocos2d项目引用两类不同的文件:源码文件和资源文件(包括图像文件、声音文件和属性文件等)。Default.png文件是在iOS加载应用程序时显示的图像,Icon.png是应用程序部署在设备上的图标。不同设备上可能使用这些文件类型的不同版本。例如,Retina 设备上会加载带有@2x后缀的图像文件。关于应用程序图标、启动图像等图像尺寸和格式的完整列表,可以参考苹果公司的开发者文档中的Custom Icon and Image Creation Guidelines,具体网址是:http://developer.apple.com/library/ios/ documentation/userexperience/conceptual/ mobilehig/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW1

fps_images.png文件用于显示帧率,是不允许删除或修改的。

Info.plist文件包含了一些与项目相关的配置信息,同时也可以在这个文件中修改一些重要的设置,如项目图标、支持设备的方向等。

1. 主程序入口main.m

任何一个使用Xcode开发的应用程序或游戏都是从main.m开始的。在导航区域的“Supporting Files”组下面可以找到main.m文件。main.m的代码如下。

程序清单:codes/13/13.3/HelloWorld/HelloWorld/main.m

#import <UIKit/UIKit.h>

int mainint argcchar *argv[] {

@autoreleasepool {

int retVal = UIApplicationMain(argc,argv,nil,@"AppController");

return retVal;

}

}

简单来说,main函数创建了@autoreleasepool(自动释放池),然后调用UIApplicationMain来启动程序。其中,AppController是实现UIApplicationDelegate协议的类,AppController类的实现包含在AppDelegate文件中。在启用了ARCcocos2d应用程序中,Autorelease Pool(自动释放池)可以确保内存的对象最终被释放。

2. 预编译头文件Prefix.pch

该组中的另一个文件Prefix.pch是预编译头文件,用于加快编译速度。pch表示Pre-Compiled Header,游戏开发者应该把不常变化的框架(Frameworks)头文件添加到该文件中。这样做可以使框架的代码提前被编译,并对所有类可见。

不过,这样做要注意一个问题:如果pch前缀头文件中的一个头文件发生了变化,项目中的所有代码都将会重新编译。所以,pch前缀头文件中只应该添加那些极少或者从来都不发生变化的头文件。

游戏开发者可以将cocos2d.h头文件添加到pch前缀头文件中,因为它几乎不会改变。而且,一开始就将cocos2d.h添加到预编译头文件中是一个非常好的习惯,这样在其他源文件中就不必再写“#import "cocos2d.h"”了。在预编译头文件中加入cocos2d.h,代码如下。

程序清单:codes/13/13.3/HelloWorld/HelloWorld/Prefix.pch

#import <Availability.h>

#ifndef __IPHONE_3_0

#warning "This project uses features only available in iPhone SDK 3.0 and later."

#endif

#ifdef __OBJC__

#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>

#import "cocos2d.h"

#endif

3. AppDelegate

每个iOS程序都有一个AppDelegate类,用于实现UIApplicationDelegate协议。AppDelegate实现的方法用于处理iOS应用程序的状态改变。例如,可以通过它来处理用户来电或者系统内存不足时程序需要采取的措施。在查看AppDelegate方法的具体实现代码前,先要了解AppDelegate.h中的类定义。在AppDelegate.h中定义了AppController这个类,它直接继承自NSObject类,并且遵循UIApplicationDelegateCCDirectorDelegate两个协议。

程序加载完成后,立即执行的方法就是applicationDidFinishLaunchingWithOptions:,在该方法中,通常都是应用启动后需要执行的初始化代码。

Xcode中打开AppDelegate.m文件,找到applicationDidFinishLaunchingWithOptions方法,代码如下。

程序清单:codes/13/13.3/HelloWorld/HelloWorld/AppDelegate.m

-(BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 创建程序主窗口

window_ = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// 创建CCGLView对象,用于游戏中的渲染

// cocos2d v2.0之后,CCGLView替代了之前的EAGLView

// 使用CCGLViewOpenGL ES命令发送给OpenGL ES驱动

CCGLView *glView =[CCGLView viewWithFrame:[window_ bounds]

pixelFormat:kEAGLColorFormatRGB565depthFormat:0

preserveBackbuffer:NOsharegroup:nilmultiSampling:NO

numberOfSamples:0];

// ①创建导演对象

director_ =(CCDirectorIOS*) [CCDirector sharedDirector];

director_.wantsFullScreenLayout = YES;

// FPSFrames Per Second)和SPFSecond Per Frame)显示设置为开

// cocos2d会自动计算游戏的当前帧数,并显示在屏幕的左下角

// 在调试过程中FPS显示对我们调试会非常有用

// 在游戏正式上传到设备时可以将其设置为NO,则FPSSPF不会再显示在设备中

[director_ setDisplayStats:YES];

// 将动画间距设置为每秒60次,这也是cocos2d中的默认设置

// 在正常情况下,cocos2d每秒最高会刷新屏幕中的显示60

[director_ setAnimationInterval:1.0/60];

// openglView绑定到director_导演对象上

[director_ setView:glView];

// director_的代理对象设置为self(自身),用于获取屏幕信息

[director_ setDelegate:self];

// 设置2D3D投射

[director_ setProjection:kCCDirectorProjection2D];

// [director setProjection:kCCDirectorProjection3D];

// 启用Retina高清显示模式

if(! [director_ enableRetinaDisplay:YES] )

CCLOG(@"Retina Display Not supported");

// 设置cocos2d的纹理格式

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

// iPadRetina高清显示模式下,使用CCFileUtils自动添加图片的后缀

CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils];

[sharedFileUtils setEnableFallbackSuffixes:NO];

[sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"];

[sharedFileUtils setiPadSuffix:@"-ipad"];

[sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];

// 设置PVR图像具备多重透明度

[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];

// ②初始化IntroLayer场景,并使用pushScene方法切换到该场景

[director_ pushScene: [IntroLayer scene]];

// 使用director_创建NavigationController导航控制器

navController_ = [[UINavigationController alloc] initWithRootViewController:director_];

// 设置navigationBarHiddenYES

navController_.navigationBarHidden = YES;

// NavigationController导航控制器设置为根视图控制器

[window_ setRootViewController:navController_];

// 设置主窗口可见

[window_ makeKeyAndVisible];

return YES;

}

applicationDidFinishLaunchingWithOptions方法中,①号代码创建了一个CCDirector导演对象,在cocos2d中,CCDirector导演对象负责游戏的循环运行,并且在游戏中渲染所有的图像,它会掌控游戏的运行、暂停或停止。AppController中包括了CCDirector响应iOS操作系统在内的暂停或继续等各个事件。代码如下。

程序清单:codes/13.3/HelloWorld/HelloWorld/AppDelegate.m

// 当操作系统暂停应用时执行,调用此方法来暂停游戏和所有的计时器

// 当玩家在玩游戏的过程中锁定了iPadiPhone,或者有电话打进来

// 或者其他类似事件发生需要强迫游戏进入后台时,会调用此方法

-(void)applicationWillResignActive:(UIApplication *)application

{

if([navController_ visibleViewController] == director_ )

[director_ pause];

}

// 当玩家解锁iPadiPhone,或电话已接听完毕时,会调用此方法来继续游戏和所有的计时器

-(void)applicationDidBecomeActive: (UIApplication *application

{

if( [navController_ visibleViewController] == director_ )

[director_ resume];

}

// iOS 4.0及以后的版本中,开始支持应用在后台运行,此时会停止运行屏幕中的动画

-(void)applicationDidEnterBackground: (UIApplication*)application

{

if( [navController_ visibleViewController] == director_ )

[director_ stopAnimation];

}

// 当应用重新回到前台来运行时,重新启动屏幕中的动画

-(void)applicationWillEnterForeground: (UIApplication*)application

{

if( [navController_ visibleViewController] == director_ )

[director_ startAnimation];

}

// 应用程序即将中止时调用此方法

// 该方法会终止CCDirector的控制,并从应用程序的UIWindow中解除对CCGLView的绑定

// 同时还将结束游戏循环,从内存中清除所有的纹理和计时器

-(void)applicationWillTerminate: (UIApplication *)application

{

CC_DIRECTOR_END();

}

// 当系统收到内存不足的警告时,会调用此方法从内存中清除未在屏幕中显示的纹理图。

-(void)applicationDidReceiveMemoryWarning: (UIApplication *)application

{

[[CCDirector sharedDirector] purgeCachedData];

}

// 将上一次时间调用和当前事件调用间的增量时间设置为0

// 该方法的调用场景是:两次调用之间已经过了太长的时间。

// 这通常是由于iPhone重新调整了系统时间而导致。

-(void)applicationSignificantTimeChange: (UIApplication *)application

{

[[CCDirector sharedDirector] setNextDeltaTimeZero:YES];

}

applicationDidFinishLaunchingWithOptions方法中,编号②代码初始化IntroLayer场景,并使用pushScene方法切换到该场景。下面我们来看看IntroLayer类的实现。

4. IntroLayer

IntroLayer类继承自CCLayer,因为CCDirector只能运行CCScene对象,所以需要实现IntroLayerscene方法,它会把IntroLayer当作唯一的子节点添加进去,并返回一个CCScene。打开IntroLayer.m文件,找到scene方法,代码如下。

程序清单:codes/13/13.3/HelloWorld/HelloWorld/IntroLayer.m

+(CCScene *)scene

{

// 创建CCScene场景对象

CCScene *scene = [CCScene node];

// 创建IntroLayer层对象

IntroLayer *layer = [IntroLayer node];

// layer添加为scene的子节点

[scene addChild: layer];

// 返回scene对象

return scene;

}

以前的cocos2d版本中是不存在IntroLayer类的,这是cocos2d 2.0新加的类,它的主要目的就是在进入游戏之前,可以显示游戏制作公司的Logo等信息。显示Logo的实现代码在onEnter方法当中,代码如下(程序清单同上)。

-(void)onEnter

{

[super onEnter];

// 获得设备支持的窗口大小

CGSize size = [[CCDirector sharedDirector] winSize];

CCSprite *background;

// 判断设备是iPhone还是iPad,并据此来加载不同的背景资源图片

if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone ){

background = [CCSprite spriteWithFile:@"Default.png"];

background.rotation = 90;

} else {

background = [CCSprite spriteWithFile:@"Default-Landscape~ipad.png"];

}

// 设置背景图片的位置居中

background.position = ccp(size.width/2,size.height/2);

// 把背景图片添加到IntroLayer

[self addChild: background];

// 触发一个定时器方法调用,在1秒后会调用makeTransition函数

[self scheduleOnce:@selector(makeTransition:)delay:1];

}

接下来看看makeTransition方法的实现,代码如下(程序清单同上)。

-(void)makeTransition: (ccTime)delta

{

[[CCDirector sharedDirector] replaceScene:

[CCTransitionFade transitionWithDuration:1.0

scene:[HelloWorldLayer scene] withColor:ccWHITE]];

}

该方法只有一句代码调用,就是使用CCDirector配合CCTransitionFade场景切换特效类,把HelloWorldLayer类在1秒屏幕变白后展示出来。最后来看看HelloWordLayer类的实现。

5. HelloWorldLayer.m

HelloWorldLayer类继承自CCLayer。因为CCScene只是一个抽象的接口,而默认设置场景的方法通常是在类里使用一个静态初始化方法+(id)scene。此方法会创建一个CCScene对象,并且将HelloWorldLayer的对象添加为场景的子节点。代码如下。

程序清单:codes/13/13.3/HelloWorld/HelloWorld/HelloWorldLayer.m

+(CCScene *)scene

{

// 创建CCScene场景对象

CCScene *scene = [CCScene node];

// 创建HelloWorldLayer层对象

HelloWorldLayer *layer = [HelloWorldLayer node];

// layer添加为scene的子节点

[scene addChild: layer];

// 返回scene对象

return scene;

}

接下来再看看-(id)init初始化方法的实现,代码如下(程序清单同上)。

-(id) init

{

if((self=[super init])) {

// 创建和初始化一个标签对象

CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World"

fontName:@"Marker Felt" fontSize:64];

// 实例化得到一个CCDirector的单例,并获得窗口的尺寸

CGSize size = [[CCDirector sharedDirector] winSize];

// 将标签位置设置在屏幕中央,ccpcocos2d对于CGPointMake的宏定义

label.position = ccp(size.width /2,size.height/2);

// label添加为scene的子节点

[self addChild: label];

// 下面是初始化游戏中心的成就榜和高分榜的代码,此处先略去暂时不讨论

}

return self;

}

以上就是HelloWorld项目的详细实现过程。读者之前已经学习过iOS基础知识,所以这里并没有对所有类的所有实现代码进行逐行解释和分析。但通过以上详细代码分析,我们初步了解了一个cocos2d应用的启动和运行过程,这将为以后开发更复杂的游戏或应用程序打下扎实的基础。

HelloWorld项目中,使用了场景(CCScene)、层(CCLayer)、导演(CCDirector)等核心类,在cocos2d的开发中,几乎任何一款cocos2d游戏中都会用到这些类,所以了解它们的作用、属性和方法,以及如何将这些类组织在一起,是我们学习cocos2d游戏开发的必修课。掌握了这些基本知识之后,大家就会发现使用cocos2d开发游戏其实很简单。接下来重点介绍cocos2d中的核心类。


 

本文转自 fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/1394268 ,如需转载请自行联系原作者

相关文章
|
2月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
296 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
6月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
192 1
|
7月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
9月前
|
Java Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【7月更文挑战第8天】在移动应用开发的广阔天地中,Android与iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场覆盖等方面的根本差异,并分析这些差异如何影响项目的成功。通过比较和分析,旨在为开发者在选择平台时提供更全面的视角,帮助他们根据项目需求和目标市场做出更明智的决策。
|
9月前
|
Linux Android开发 iOS开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的广阔舞台上,安卓与iOS两大操作系统各自占据着举足轻重的地位。本文深入探讨了这两个平台在技术特性、市场覆盖、用户群体和开发成本等方面的差异,并分析了这些差异如何影响项目的最终成功。通过比较分析,旨在为开发者提供决策依据,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
10月前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
7月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
127 10
|
7月前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
94 2
|
7月前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
8月前
|
IDE 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚,引领着技术进步的潮流。本文旨在深入剖析这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计以及市场分布等方面。通过对比分析,我们不仅能更好地理解每个平台的独特优势,还能洞察这些差异如何影响项目决策和最终成果。无论你是开发者还是企业决策者,了解这些内容都将助你一臂之力,在选择适合自己项目的开发平台时做出更明智的决策。

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    122
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    68
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    113
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    145
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    45
  • 6
    iOS各个证书生成细节
    67
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    296
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    91
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    105
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    90