Cocos2d-XNA主要文件作用:install-template-mscs.msi:模板安装程序cocos2d-xna:主项目CocosDenshion:声音音效Cocos2d.Framework、Cocos2d.Content.Pipeline.Importers:支持文本类型资源(*.fnt、*.tmx、*.plist)HelloCocos2d:示例工程Tests :功能演示安装模板Next Next ..完成安装中间如果有出现用户账户控制提示选择是然后继续Next..完成安装接下来就能够创建cocos2d-xna工程了。Hello, Cocos2D-XNA!启动cocos2d-xna.sln 添加新项目选择XNA Game Studio 4.0节点底下的 Cocos2d-xna Application给项目起个名字叫TweeJump。Ok后这里会弹出一个对话框我们确认就好了选择ok OpenXLive是Windows Phone 7上的游戏竞技和社交网络SNS平台允许开发者以最小的工作量为自己的游戏增加游戏竞技服务和社交网络SNS功能。OpenXLive是由Fulcrum Mobile Networks, Inc.开发运营的。同类的应用还有iPhone上的OpenFeint和Plus等。www.openxlive.com我们将创建好的工程设置为启动项如下图F5运行,Cocos2D-XNA的HelloWorld程序启动模拟器程序运行界面如下默认工程里面只有一个场景HelloWorldScene,除了多了大厅、积分榜、成就和示例代码HelloCocos2d没有什么不同。cocos2d是按照scene的概念组织的游戏是由多个scene切换完成的。游戏场景一般是指在某个时刻能独立运行的部分其中包括可见的游戏角色地形和不可见的逻辑脚本等。例如一个游戏的某个特定关卡游戏菜单和过场动画等都是一个独立的场景。cocos2d中的场景又由不同的层(CCLayer)组成。 TweeJump需要主菜单(MainMenu)、游戏画面(Game)、游戏结束画面(GameOver)三个scene来完成我们的游戏逻辑游戏的流程如下进入游戏主菜单选单play游戏画面开始游戏游戏结束呼出GameOver画面 again游戏画面。Cocos2d-XNA基础介绍下面介绍一下TweeJump中主要用到的Cocos2d-XNA的类。CCDirector负责管理场景和切换场景游戏暂停等。CCNode是Cocos2d-XNA中最重要的对象。CCNode的addChild()方法我个人认为是最重要的方法。它充当了一个容器的角色可以addChild进去无数个节点但每个节点只有一个父节点同时他可以执行回调函数和CCAction有postion,scale,rotation等等属性。CCLayer它是CCNode的子类,层是一个可以绘制的区域.可以将ui,sprite等对象添加到其中。CCMenu从CClayer派生而来,可以处理输入消息,CCMenu包含多个CCMenuItem对象,在接收到输入消息之后,根据触摸位置,将输入消息分发到相应MenuItem,执行回调函数CCMenu还提供一个对齐菜单项的功能CCSprite 可以看成是某一时刻,一个2D的图片的一个剪辑部分添加我们游戏的背景TweeJump游戏中的背景都是蓝天白云为了重用我们把它提取成父类Main主菜单MainMenu、游戏画面Game、结束画面GameOver只要继承它就蓝天白云了。在Main中涂写画画出萌萌的蓝天白云为了方便管理游戏中用到的类都尽量建到Classes文件夹中新建类Main让Main继承CCLayer并重写init()方法public class Main : CCLayer{//调整素材比例public const float sy 1.666666666666667f;public const float sx 1.5f;public static void Scale(CCNode sprite){sprite.scaleY sy;sprite.scaleX sx;}public override bool init(){if (!base.init()){return false;}//todoreturn true;}}先把蓝天贴到todo哪里CCSpriteBatchNodespriteManagerCCSpriteBatchNode.batchNodeWithFile(Images/sprites,10);addChild(spriteManager,-1, (int)tags.kSpriteManager);CCSpritebackgroundCCSprite.spriteWithTexture(spriteManager.Texture,newCCRect(0,0,320,480));spriteManager.addChild(background);Scale(background);background.positionnewCCPoint(240,400);//this.initClouds();初始化云//this.schedule(step);让云变得可爱点把tags枚举放到类的外面public enum tags{kSpriteManager 0,kBird,kScoreLabel,kCloudsStartTag 100,//数值的意义是分出段来kPlatformsStartTag 200,kBonusStartTag 300}虽然只是添加了蓝天但还是先来看下效果吧运行前需要修改下Scene的入口点。在AppDelegate.cs中的applicationDidFinishLaunching()方法里找到下面代码并修改它// create a scene. its an autorelease objectCCScene pScene TweeJumpScene.scene();//runpDirector.runWithScene(pScene);现在需要把pScene实例化为我们的Main但是不好的事情是我们的Main.cs是一个CCLayer并不是CCScene实现代码如下CCScene pScene CCScene.node();pScene.addChild(Tweejump.Classes.MainMenu.node());在Main.cs里还需要添加node()方法用来调用init()方法完成初始化工作publicstaticnewCCLayernode(){MainretnewMain();if(ret.init()){returnret;}returnnull;}F5运行这也太丑了吧。因为在游戏中默认是横屏所以需要在applicationDidFinishLaunching()里加上这句话将屏幕设置为竖屏pDirector.deviceOrientation ccDeviceOrientation.CCDeviceOrientationPortrait;蓝天贴图ok解开我们的注释、去掉文字说明、再把云画上去Main我们的背景就ok了。直接贴代码有点长了为了显得有技术含量少贴详细查看源代码(cocos2d简单性很容易上手)。privatevoidinitClouds(){currentCloudTag(int)tags.kCloudsStartTag;while(currentCloudTag(int)tags.kCloudsStartTagkNumClouds){this.initCloud();currentCloudTag;}this.resetClouds();}initClouds()方法他完成了云朵的初始化工作initClouds里面调用了KNumClouds 12次initCloud该方法从3块云中随机出块之后又调用resetClouds完成云位置初始化具体方法看源文件。Main.cs注册了spriteManager并把它添加到了Main这个CCLayer中(addChild()方法)在需要的地方取出spriteManager.Texture的某一部分保存到CCSprite里形成一个新的CCSprite对象再spriteManager.addChild(CCSprite:) 交给spriteManage统一管理。在使用的时候通过spriteManager.getChildByTag(tag:)取出相应的sprite进行position的赋值等达到我们需要的贴图或者移动、action等等position的位置是图片中心点的位置;所以给每个Sprite指定一个唯一而有规则的tag是很重要很方便的(枚举tags的作用)。通过getChildByTag在spriteManager中遍历需要的sprite进行赋值的操作查看源代码resetXXXX()方法。不光是Main.cs的在Game中你也能找到initXXXX() resetXXXX()方法。源代码Solution Explorer截图主菜单和结束画面跳过。。。略过。。。Main.cs总算是水完了下面来一起学习下Menu和Label的使用你可以使用它们轻松的完成Tweejump或者你自己游戏的主菜单和GameOver(如果你的游戏不十分复杂的话)。MainMenu.cs和GameOver.cs都继承自Main.cs因为老爸是李刚的优势已经有了蓝天和白云作为背景。再加上Menu、Labe、Sprite不废话了下面看下是如何的简单就行了。重复上面的步骤重写init()添加node()方法在init()里面贴上下面的代码CCMenuItem button1 CCMenuItemImage.itemFromNormalImage(Images\loginButton, Images\loginButton, this, loginCallback);Scale(button1);CCMenuItem button2 CCMenuItemImage.itemFromNormalImage(Images\playButton, Images\playButton, this, playCallback);Scale(button2);CCMenuItem button3 CCMenuItemImage.itemFromNormalImage(Images\aboutButton, Images\aboutButton, this, aboutCallback);Scale(button3);CCMenu menu CCMenu.menuWithItems(button1, button2, button3);menu.alignItemsVerticallyWithPadding(15f);menu.position new CCPoint(240, 257);this.addChild(menu);CCMenuItemImage.itemFromNormalImage()前两个参数分别是按下前和按下时的图片资源 (CCSprite),最后一个参数为按下后的回调函数,格式: void Callback(CCObject sender){}。画上我们游戏的Logo补全回调函数的响应把runWithScene()替换成MainMenu,效果图如下。GameOver.cs中最终得分的显示是由CCLabelBMFont来实现的它可以让你的字很个性很酷贴代码CCLabelBMFont scoreLabel CCLabelBMFont.labelWithString(currentScore.ToString(),Fonts/bitmapFont);scoreLabel.scaleX sx * 1.5f;scoreLabel.scaleY sy * 1.5f;//素材太小了忽略忽略addChild(scoreLabel, 5, (int)tags.kScoreLabel);scoreLabel.position new CCPoint(240, 450);游戏效果图Label3961还不错的分数吧。bitmapFont是资源文件bitmapFont.fnt如果没有在属性里设置Content Impoter为Text Importer, Content Processor为TextProcessor将会出现编译错误。打开这个文件可以看到它是由等号连接的key value对。把目光放在char id上32 48 …分别代表空格0123456789每个char id后的属性描述了这个char在bitmapFont.png上空格0123456789的位置。.fnt文件和相应的.png文件有相应的位置关系必须遵循不能改变。.fnt文件同级目录下必须有一个Images文件盛放与之对应的.png文件。游戏控制-重力感应这个版本的cocos2d-xna是没有封装重力感应的我用的是XNA中自带的重力感应因为Accelerometer它也是事件驱动所以很搭不会出现不兼容的现象应该在以后版本中也不会对它封装了吧。1添加Microsoft.Devices.Sensors引用