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();
}
}