cocos2d-xna-TweeJump学习笔记2(都是自己看别人代码后所感所想,希望有懂的人指出我的错误或者大家交流交流)

知识点一:

“在使用的时候通过spriteManager.getChildByTag(tag:)取出相应的sprite进行position的赋值等达到我们需要的贴图或者移动、”

在看到原博客里的这句话时,很不解。后来又看了一下代码,终于懂了。

首先,在Main.cs里实例化里一个子节点spriteManager,然后将它addchild进去,addchild里的第三个参数tags,我觉得作用类似于ID,我们通过这个ID用getChildByTag可以找到一个对应的子节点spriteManager。

CCSpriteBatchNode spriteManager = (CCSpriteBatchNode)getChildByTag((int)tags.kSpriteManager);

CCSpriteBatchNode spriteManager = CCSpriteBatchNode.batchNodeWithFile("Images/sprites", 10);
addChild(spriteManager, -1, (int)tags.kSpriteManager);

知识点二:

游戏控制-重力感应

这个版本的cocos2d-xna是没有封装重力感应的,我用的是XNA中自带的重力感应,因为Accelerometer它也是事件驱动所以很搭不会出现不兼容的现象,应该在以后版本中也不会对它封装了吧。

1添加Microsoft.Devices.Sensors引用

 

2创建Accelerometer对象,

3注册Accelerometer对象的CurrentValueChanged事件,

4启动Accelerometer对象Start()方法来启动重力感应监听。

在注册的事件处理方法中可以通过e.SensorReading.Acceleration.X和e.SensorReading.Acceleration.Y,e.SensorReading.Acceleration.Z来访问当前的加速度的三维偏移值。这里我要提的只有一个,很多教程里都是注册Accelerometer对象的ReadingChanged事件,当你使用的是Windows Phone 7.1 SDK时,VS会提示你ReadingChanged已经过时,当然你是可以用,但是还是建议你使用CurrentValueChanged。TimeBetweenUpdates属性会影响到两次触发CurrentValueChanged事件的时间间隔,所以如果你要设置重力感应的感应时间间隔的话最好还是使用CurrentValueChanged。详细见源代码Game.cs的init()。

 

知识点三:

集成OpenXLive SDK

OpenXLive的功能:

积分榜

  让全世界都知道你是这个游戏中的最强者!积分榜,用来记录你的游戏成绩,让你和全世界的玩家分享你超凡的游戏成绩。

· 游戏成就

  一个个游戏成就,像一枚枚勋章,记录了你在游戏中的成长历程。篝火边,用成就,告诉你的朋友,你是如何成为游戏中最强的勇士。

· 社交网络

  告诉你,这世界上还有多少兄弟姐妹和你一起在游戏中奋战。找到他们,和他们成为好友,一起开始一段冒险的路程。

· 个人中心

  这里有你过去、现在和将来的故事。你的积分、你的成就、你玩过的游戏、你的好友,这是你值得珍藏的一页。

· 云存储

  不想让别人发现你在游戏中的秘密?把它放在云端吧。你可以在任何地方,打开尘封的秘密。

· 游戏公告

  告诉你游戏中发生的大事件,比如,你成为了NO.1。

 

如果你在前面的

勾选上了OpenXLive sdk,新建项目中就会我们添加好了引用就可以很方便的使用它。

熟悉XNA的朋友会发现其实我们的游戏引擎Cocos2d-XNA就是一个GameComponent而我们的OpenXLive SDK也是一个GameComponent,打开我们的主游戏类Game1源代码中叫GameMain,就是找到继承于Microsoft.Xna.Framework.Game的类。

对比我们项目TweeJump和示例程序HelloCocos2d的Game1.cs文件,多的几句代码就是集成OpenXLive的方式。

Game1类中字段

//#error Please full your game Secret Key in below code

private string APISecretKey = "Y8eUF6f5xXEGSuw3DkKntbhQ";

XLiveFormManager manager;

 

Game1构造函数中吧XLiveFormManager实例并Add到Component中

// Create XLive FormManager

manager = new XLiveFormManager(this, APISecretKey);

manager.OpenSession();

// Add XLive FormManager in Components

Components.Add(manager);

 

这里需要注意的是OpenXLive的GameComponents的Add必须放在Cocos2d-xna的游戏引擎的GameComponents之前。

在LoadContent()里加载资源给OpenXLive SDK UI添加背景和退出UI的事件。

Texture2D background = this.Content.Load<Texture2D>(@"images\OpenXLive");

manager.Background = background;

manager.UIExitingEvent += new EventHandler(manager_UIExiting);

 

void manager_UIExiting(object sender, EventArgs e)

{

    CCDirector.sharedDirector().runningScene.visible = true;

}

 

如果在新建项目的时候你勾选了OpenXLive SDK这些代码都是默认添加到Game1.cs中的。

 

下面以MainMenu为例教你在游戏中使用OpenXLive SDK。

init()方法中创建一个按钮

CCMenuItemImage Lobby = CCMenuItemImage.itemFromNormalImage(

@"images\Lobby", @"images\Lobby1", this,

new SEL_MenuHandler(LobbyCallback));

Lobby.position = new CCPoint(0, 20);

CCMenu LMenu = CCMenu.menuWithItems(Lobby);

LMenu.position = new CCPoint(240, 60);

回调方法:

public virtual void LobbyCallback(CCObject pSender)

{

CCDirector.sharedDirector().pause();

       CCDirector.sharedDirector().runningScene.visible = false;          

OpenXLive.Forms.XLiveFormFactory.Factory.ShowForm("Lobby");

}

 

OpenXLive.Forms.XLiveFormFactory.Factory.ShowForm("Lobby");show出我们需要的窗体这里是Lobby,除了”Lobby”还有"Startup"、"Leaderboard"、"Achievements"、"Logon"、"MyCenter"、"FirendsList"、"OnlinePlayer"、"Pause"、 "OpenXLiveGames"。

TweeJump源代码中使用了"Achievements"、"Leaderboard"、"Lobby"这三个常用功能。在Show出窗体后务必把游戏暂停当前Scene隐藏。在回来的时候也务必把游戏开始当前Scene显示。

void manager_UIExitingEvent(object sender, EventArgs e)

{

CCDirector.sharedDirector().runningScene.visible = true;

CCDirector.sharedDirector().resume();

}

在原TweeJump里的Update里的Messagebox里自定义了一个方法,如下:

protected override void Update(GameTime gameTime)       

  {   

             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)            

    {                

      CCDirector.sharedDirector().pause();                

      MessageBox.Show("Exit ?", "OpenXLive",MessageBoxButtons.OKCancel,Exit);                

       //这里的Exit是下面的方法            

    }            

    base.Update(gameTime);            

    // TODO: Add your update logic here

 }

 void Exit(DialogResult result)
        {
            if (result == DialogResult.OK)
            {
                this.Exit();
            }
            else
            {
                CCDirector.sharedDirector().resume();
            }
        }

posted @ 2012-07-14 15:08  Dieaz5  阅读(279)  评论(0编辑  收藏  举报