cocos2d-xna学习笔记4

修改游戏程序入口。在AppDelegate里的applicationDidFinishLauching()方法里添加一句:

  pScene.addChild(Tweejump.Classes.MainMenu.node());

public override bool applicationDidFinishLaunching()
        {
            //initialize director
            CCDirector pDirector = CCDirector.sharedDirector();
            pDirector.setOpenGLView();

            //turn on display FPS
            pDirector.DisplayFPS = true;

            pDirector.deviceOrientation = ccDeviceOrientation.CCDeviceOrientationPortrait;

            // set FPS. the default value is 1.0/60 if you don't call this
            pDirector.animationInterval = 1.0 / 60;

            // create a scene. it's an autorelease object
            CCScene pScene = CCScene.node();
            //添加了这句,修改了游戏的入口
            pScene.addChild(Tweejump.Classes.MainMenu.node());
            //run
            pDirector.runWithScene(pScene);

            return true;
        }

然后在mainmenu.cs里又添加了game.cs的入口
 void playCallback(CCObject sender)
        {
            CCScene pScene = CCScene.node();
            pScene.addChild(Tweejump.Classes.Game.node());
            CCDirector.sharedDirector().pushScene(pScene);
        }

当然,在game.cs里还要添加如下代码:

public static new CCLayer node()
        {
            Game ret = new Game();

            if (ret.init())
            {
                return ret;
            }
            return null;
        }


接下来还要重写Init方法

public override bool init();

在init方法里加载了游戏平台(注意,平台是多个且位置不定。见学习笔记2)、小鸟、金币(注意,平台是多个且位置不定。见学习笔记2)等。全部都放在spritesmanager里

在init方法里最重要的方法:this.schedule(step);

schedule,我猜应该是一个实时调用的类,而step里面更新了小鸟是否吃到了金币、小鸟的位移效果等,jump()实现了小鸟踩到平台时的跳跃(y)的变化,

代码:

new void step(float dt)
        {
            //
            base.step(dt);

            if (gameSuspended) return;

            CCSpriteBatchNode spriteManager = (CCSpriteBatchNode)getChildByTag((int)tags.kSpriteManager);
            CCSprite bird = (CCSprite)spriteManager.getChildByTag((int)tags.kBird);
            //小鸟x水平的变化
            bird_pos.x += bird_vel.x * dt;

            #region ----
            //if (bird_vel.x < -30f && birdLookingRight)
            //{
            //    birdLookingRight = false;
            //    bird.scaleX = -sx;
            //}
            //else if (bird_vel.x > 30f && birdLookingRight)
            //{
            //    birdLookingRight = true;
            //    bird.scaleX = sx;
            //} 
            #endregion
            //480是手机宽度,max_x和min_x设置的理由都是基于小鸟图片大小确立的。
            CCSize bird_size = new CCSize(bird.contentSize.width * sx, bird.contentSize.height * sy);
            float max_x = 480 - bird_size.width / 2;
            float min_x = 0 + bird_size.width / 2;
            //当小鸟的x位置大于max_x时,表示已经跨出手机屏幕,故设置最大值为max_x
            //当小鸟的x位置小于min_x时,表示已经跨出手机屏幕,故设置最小值为min_x
            if (bird_pos.x > max_x) bird_pos.x = max_x;
            if (bird_pos.x < min_x) bird_pos.x = min_x;
            //小鸟垂直坐标变化,为什么如此设置?
            bird_vel.y += bird_acc.y * dt;
            bird_pos.y += bird_vel.y * dt;

            CCSprite bonus = (CCSprite)spriteManager.getChildByTag((int)tags.kBonusStartTag + currentBonusType);
            if (bonus.visible)
            {
                //吃到金币
                CCPoint bonus_pos = bonus.position;
                float range = 20f;
                if (bird_pos.x > bonus_pos.x - range &&
                    bird_pos.x < bonus_pos.x + range &&
                    bird_pos.y > bonus_pos.y - range &&
                    bird_pos.y < bonus_pos.y + range)
                {
                    switch (currentBonusType)
                    {
                        case (int)kbonus.kBonus5: score += 5000; break;
                        case (int)kbonus.kBonus10: score += 10000; break;
                        case (int)kbonus.kBonus50: score += 50000; break;
                        case (int)kbonus.kBonus100: score += 100000; break;
                    }
                    //得分的显示实现-1,游戏中没有动作时分数的更新
                    string scoreStr = score.ToString();
                    CCLabelBMFont scoreLabel = (CCLabelBMFont)this.getChildByTag((int)tags.kScoreLabel);
                    scoreLabel.setString(scoreStr);
                    var a1 = CCScaleTo.actionWithDuration(.2f, 1.5f, .8f);
                    var a2 = CCScaleTo.actionWithDuration(.2f, 1.0f, 1f);
                    var a3 = CCSequence.actions(a1, a2, a1, a2, a1, a2);
                    scoreLabel.runAction(a3);
                    this.resetBonus();
                }
            }

            int t;
            //当小鸟的高度小于0时,分两种情况:有平台则跳越,没平台且高度低于自身的一半即游戏结束
            if (bird_vel.y < 0)
            {
                t = (int)tags.kPlatformsStartTag;
                for (int i = t; i < (int)tags.kPlatformsStartTag + kNumPlatforms; i++)
                {
                    CCSprite platform = (CCSprite)spriteManager.getChildByTag(i);

                    CCSize platform_size = new CCSize(platform.contentSize.width * sx, platform.contentSize.height * sy);
                    CCPoint platform_pos = platform.position;
                    //max_x和min_x的差分别是一个平台加上20
                    max_x = platform_pos.x - platform_size.width / 2 - 10;
                    min_x = platform_pos.x + platform_size.width / 2 + 10;
                    float min_y = platform_pos.y + (platform_size.height + bird_size.height) / 2 - kPlatformTopPadding;
                    //platform_pos.y、 min_y、 max_x、 min_x恰好构成了一个平台的范围
                    if (bird_pos.x > max_x &&
                        bird_pos.x < min_x &&
                        bird_pos.y > platform_pos.y &&
                        bird_pos.y < min_y)
                    {
                        this.jump();
                    }
                }
                //判断游戏结束的条件:即当小鸟的Y低于自身图片的一半时生效
                if (bird_pos.y < bird_size.height / 2)
                {
                    this.gameOver();
                }
            }
            else
                //为什么设置400,应该是小鸟跳动的高度
                if (bird_pos.y > 400)
                {
                    float delta = bird_pos.y - 400;
                    bird_pos.y = 400;

                    currentPlatformY -= delta;
                    //更新游戏中云的高度吗?
                    t = (int)tags.kCloudsStartTag;
                    for (int i = t; i < t + kNumClouds; i++)
                    {
                        CCSprite cloud = (CCSprite)spriteManager.getChildByTag(i);
                        Scale(cloud);
                        CCPoint pos = cloud.position;
                        pos.y -= delta * cloud.scaleY * 0.8f;
                        if (pos.y < -cloud.contentSize.height * sy / 2)
                        {
                            currentCloudTag = i;
                            this.resetCloud();
                        }
                        else
                        {
                            cloud.position = pos;
                        }
                    }
                    //更新游戏中平台的高度?
                    t = (int)tags.kPlatformsStartTag;
                    for (int i = t; i < t + kNumPlatforms; i++)
                    {
                        CCSprite platform = (CCSprite)spriteManager.getChildByTag(i);
                        Scale(platform);
                        CCPoint pos = platform.position;
                        pos = new CCPoint(pos.x, pos.y - delta);
                        if (pos.y < -platform.contentSize.height * sy / 2)
                        {
                            currentPlatformTag = i;
                            this.resetPlatform();
                        }
                        else
                        {
                            platform.position = pos;
                        }
                    }

                    if (bonus.visible)
                    {
                        CCPoint pos = bonus.position;
                        pos.y -= delta;
                        if (pos.y < -bonus.contentSize.height * sy / 2)
                        {
                            this.resetBonus();
                        }
                        else
                        {
                            bonus.position = pos;
                        }
                    }
                    //得分的显示实现-2,游戏中有动作时分数的更新
                    score += (int)delta;
                    string scoreStr = score.ToString();

                    CCLabelBMFont scoreLabel = (CCLabelBMFont)this.getChildByTag((int)tags.kScoreLabel);
                    scoreLabel.setString(scoreStr);
                }

            bird.position = bird_pos;
        }
void jump()
        {
            bird_vel.y = 583f + Math.Abs(bird_vel.x);
        }

 

  

 

转载于:https://www.cnblogs.com/dieaz5/archive/2012/07/17/2596482.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值