Nowpaper 十五英寸的世界

Rich Games Developer

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在Cocos2d-x XNA的工程模板里创建出来的工程有点复杂,如果直接去看可能会晕头转向,如果想将其完全理解,推荐各位看快乐之王的Cocos2D-x for XNA类解析系列,但通常来说,我所追求的应是简洁易读可塑的代码,所以本篇探讨的是如何更加明了的展现Cocos2d-x的魅力。

  从简单开始

建立cocos2d-x XNA的工程可以通过所带模版直接建立,也可以直接在空白的XNA工程里建立,下面就是这种的建立方法。

首先,点击新建项目,选择WindowsPhoneGame

image

然后,引用cocos2d-xna.dll,在这里需要自行编译一个cocos2d-x XNA的dll,相关的说明可以参看“Cocos2d-x for WindowsPhone:万丈高楼亦可不需平地起

再后,建立一个名字叫AppDelegate的类,继承自CCApplication,AppDelegate不是固定的类名,按照个人的需求可以自己写,你可以叫GameClient或者GameRoot什么都好。

public class AppDelegate : CCApplication
{
    public AppDelegate(Game game, GraphicsDeviceManager graphics)
        : base(game, graphics)
    {
        CCApplication.sm_pSharedApplication = this;
    }
    public override bool applicationDidFinishLaunching()
    {
        //初始化CCDirector
        CCDirector pDirector = CCDirector.sharedDirector();
        pDirector.setOpenGLView();
        //是否显示FPS(每秒帧速率)
        pDirector.DisplayFPS = true;
        // pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft);
        // 在这里设置Updata的间隔
        pDirector.animationInterval = 1.0 / 60;
        // 创建一个场景
        CCScene pScene = new TestScene() ;
        // 运行这个场景
        pDirector.runWithScene(pScene);
        return true;
    }
}

这个类里简单写了注释,相比用模板建立起来的AppDelegate代码少了很多,模板建立的涵盖比较全,写法也比较特殊,其实很多对于初学来说没有用,将原来的类简化明确各代码用途,待后续用到一些深入的方法时候再对Application继承类做改造。将上面代码实现后,你会发现TestScene类没有实现,这个就是我们下面要说的场景。

  一个场景和一张图片

场景对于游戏来说是内容表现的承载,基本上所有的展示都在这里来做,而cocos2d也有一个比较好的场景管理器——CCDirector,这个名字起好,游戏就像拍电影一样,由导演来安排在什么时候有什么样的场景,它有例如下面的场景管理方法:

public void pushScene(CCScene pScene);
public void replaceScene(CCScene pScene);
public void popScene();
public void runWithScene(CCScene pScene);

上面就用上了runWithScene方法,实现一个场景也很简单,新建一个类比如叫TestScene,场景里面需要有元素,比如一张图片,实现如下代码:

public class TestScene : CCScene
{
    public TestScene()
    {
        InitScene();
    }
    public void InitScene()
    {
        CCSprite image = CCSprite.spriteWithFile("HelloWorld");
        image.position = new CCPoint(400, 240);
        this.addChild(image);
    }        
}

上面的代码是创建了一张图片的精灵,通过文件读取,并且将位置设置在(400,240),并将其添加到场景中。

但是你会发现图片没有加入,你可以找到一张,起名叫HelloWorld,当然,你可以随便叫什么名,只需要将代码调整正确即可,注意代码里不需要写后缀,因为XNA里读取不需要。添加到你的Content子工程目录里,如果放在的是二级目录,例如Images/HelloWorld.png,那么代码里就得写成CCSprite.spriteWithFile("Images/HelloWorld");

  整合起来

在主程序和cocos2d-x的类没有建立任何联系,所以运行起来是没有效果,到现在就需要改造Game1.cs了,打开文件,然后把Game1类改成下面的样子:

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

        this.graphics.IsFullScreen = true;

        TargetElapsedTime = TimeSpan.FromTicks(333333);

        InactiveSleepTime = TimeSpan.FromSeconds(1);

        CCApplication application = new AppDelegate(this, graphics);
        this.Components.Add(application);
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
        base.Update(gameTime);
    }
}

把那些自动生成的没用代码删除掉,整体看起来很简洁,我就觉得极简的代码能有一种艺术感,清晰明了,那些没用的代码无时不刻浪费着时间。

好了请确保上述中的AppDelegate.cs、TestScene.cs、Game1.cs都已经做好了修改,以及HelloWorld图片,运行一下。

啊哈~~~报错了

  解决错误,字体文件

这个错误你看起来会莫名其妙,实际上是因为cocos2d-x XNA版本内部读取了一个Arial.spritefont,这个字体文件是引擎的默认字体,就和直接用XNA写文字一样,需要一个spritefont来指定样式,

image

要加这个文件直接将模板里的复制过来可以,自己建立一个也可以,这就是看个人喜好了,但是记得要放在fonts目录里,在其他的地方是不行的。

加入后再运行就可以看到效果了。

本篇主要用极简的代码来实现一个开始程序、一个场景、一个图片的显示,这个例子可以帮助我们对引擎基本运作的理解。

  源代码

源代码由于考虑后续的文章,所以和本篇中的代码有所出入。

点击这里下载

posted on 2012-06-16 21:46  nowpaper  阅读(2259)  评论(0编辑  收藏  举报