接上篇,我们实现菜单窗口的弹出和关闭功能,首先在打开GameScene.m,添加必要的实例变量:

    __weak PopupLayer *_popupLayer;

再添加2个新方法:

-(void)removePopup{
    if (_popupLayer) {
        NSString *popupName = _popupLayer.name;

        [_popupLayer removeFromParent];
        _popupLayer = nil;
        self.userInteractionEnabled = YES;
    }
}

-(void)showPopupNamed:(NSString*)popupName{
    if (!_popupLayer) {
        PopupLayer *newPopupLayer = (PopupLayer*)[CCBReader load:popupName];
        NSAssert(newPopupLayer, @"%@ popupLayer must not nil",popupName);

        newPopupLayer.scale = 0.f;

        [self addChild:newPopupLayer];
        _popupLayer = newPopupLayer;
        _popupLayer.gameScene = self;
        self.userInteractionEnabled = NO;

        CCActionScaleTo *scaleAction = [CCActionScaleTo actionWithDuration:0.5 scale:1.0f];
        [_popupLayer runAction:scaleAction];
    }
}

代码很简单,打开窗口时首先确保没有窗口已经被打开,然后按名称加载窗口,关闭GameScene节点与用户的交互功能,然后用放大动画从无显示弹出的菜单窗口.

关闭窗口时,首先确保当前有窗口被打开,然后恢复打开窗口方法里的动作.

因为我们要从外部调用GameScene类的方法,所以要修改接口文件:

-(void)removePopup;
-(void)showPopupNamed:(NSString*)popupName;

接下来打开PopupLayer.h文件,在import语句下方添加:

@class GameScene;

这里不用#import “GameScene.h”,为的是避免可能的重复包含头文件.在接口声明中添加一个新属性:

@property (nonatomic,strong) GameScene *gameScene;

下面打开PopupLayer.m文件补全之前留空的回调方法:

-(void)moneyEntered{
    NSString *text = _moneyText.string;
    CCLOG(@"text is %@",text);
    @try {
        self.money = text.intValue;
    }
    @catch (NSException *exception) {
        CCLOG(@"exception is %@",exception.debugDescription);
    }
}

-(BOOL)isMoneyValid{
    if (self.money <= 0) {
        return NO;
    }else if (self.money > [GameState sharedInstance].totalMoney)
        return NO;
    else
        return YES;
}

-(void)closePopup{
    CCLOG(@"%@",self.name);
    if ([self.name isEqualToString:@"moneyLayer"]) {
        self.money = _moneyText.string.intValue;
        if (![self isMoneyValid]) {
            GameState *gameState = [GameState sharedInstance];
            [gameState.interface updateStatusLabel:@"主上您压上的银两不够啊 ;)"];
            return;
        }
        GameState *gameState = [GameState sharedInstance];
        gameState.money = self.money;
    }
    [self.gameScene removePopup];
}

大家现在编译肯定会出错的,因为里面有一个陌生的类GameState,我们下一篇就来实现它 ;)

(NO.00001)iOS游戏SpeedBoy Lite成形记(十六)的更多相关文章

  1. (NO.00001)iOS游戏SpeedBoy Lite成形记(十八)

    现在需要实现具体的游戏逻辑大致如下: 玩家点击某条赛道选择一个选手,然后会弹出菜单窗口让玩家输入压赌的金额,如果输入的金额值非法,则在GameInterface下部的状态栏中显示提示,要求玩家重新输入 ...

  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(十九)

    最后就是要完成前面设定的第3件事:如果玩家赌对了则赢钱,反之输钱. 前面的框架搭的差不多了,所以这里实现起来也就不难了 ;) 首先我们怎么知道用户输入完毕,然后关闭窗口了?只有在这个点上GameSce ...

  3. (NO.00001)iOS游戏SpeedBoy Lite成形记(十五)

    现在啃第2个问题:如何让玩家输入赌注金额. 实现的方法有很多种,比如可以限制玩家只能从特定的金额中选择,把每个选择做成一个按钮即可.以下是一个假想选择窗口的示意图: 这样没有玩家的输入问题了.缺点是不 ...

  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(十四)

    下面要启用场景的触摸功能,在GameScene.m的didLoadFromCCB方法里添加下面一行: self.userInteractionEnabled = YES; 然后还需要给GameScen ...

  5. (NO.00001)iOS游戏SpeedBoy Lite成形记(十二)

    如果选手能在加速的时候屁股产生推进器效果就跟好了,仿佛选手腾云驾雾的感觉.我们可以用Cocos2D中的CCMotionStreak类来轻松实现.下面在Player.h接口文件添加以下代码: @prop ...

  6. (NO.00001)iOS游戏SpeedBoy Lite成形记(十)

    上篇最后遇到是神马问题呢? 原来由于现在seq动作的时间变得不确定了,jump的持续时间不能对应发生变化,导致可能选手在比赛后边就没有跳跃动作了!这虽不影响整个代码逻辑,却多少有些让玩家不爽. 一种解 ...

  7. (NO.00001)iOS游戏SpeedBoy Lite成形记(一)

    这是本猫第一个原创iOS游戏,留此为证!看编号貌似要写9万多个,千锤百炼还是太少吧!? ;) 这是一个赛跑游戏,几位选手从起点跑到终点看谁用的时间最少.现在需要实现的功能是: 1.8位选手从起点移动至 ...

  8. (NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3

    在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了. 我只需要再实现一 ...

  9. (NO.00001)iOS游戏SpeedBoy Lite成形记(十一)

    之前的10篇内容主要实现了选手从起点移动至终点的动作,比较随机的模拟了选手的速度变化,另外完成了选手到达终点时该做的事情. 接下来的几篇中我们进一步完善SpeedBoy Lite项目,使它真正成为一个 ...

随机推荐

  1. oracle查询相关语句

    1,查询表空间使用情况select a.a1 表空间名称,c.c2 类型,c.c3 区管理,b.b2/1024/1024 表空间大小M,(b.b2-a.a2)/1024/1024 已使用M,subst ...

  2. SQL_CALC_FOUND_ROWS equivalent in PostgreSQL

    https://www.postgresql.org/message-id/1185863074.10580.91.camel%40linda.lfix.co.uk On Tue, 2007-07-3 ...

  3. Android简易实战教程--第四十话《Spinner》

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...

  4. GirlFriendNotFoundException异常是怎样处理的?

    GirlFriendNotFoundException异常是怎样处理的? 如果说要去创造这个异常,那么我们的JAVA程序里,肯定是继承Exception去处理,所有我们可以先实现一个自己的Except ...

  5. MongoDb 用 mapreduce 统计留存率

    MongoDb 用 mapreduce 统计留存率(金庆的专栏)留存的定义采用的是新增账号第X日:某日新增的账号中,在新增日后第X日有登录行为记为留存 输出如下:(类同友盟的留存率显示)留存用户注册时 ...

  6. 一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。 高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)。

    //点数 #define N 10 //点间距 int D[N]; //A1到每个Ai的距离 int A1ToX[N]; void preprocess() { srand(time(0)); //随 ...

  7. 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(4)--收集解决参数嗅探问题的信息 首先我们需要明白,参数嗅探本身不是问 ...

  8. [tornado]websocket 最简单demo

    想法 前两天想看看django 长轮询或者是websocket的方案,发现都不太好使. tornado很适合做这个工作,于是找了些资料,参照了做了个最简单demo,以便备用. 具体的概念就不说了,to ...

  9. 2apt-get命令,deb包安装,源码安装

    1 安装卸载软件 更新源服务器列表 sudovi /etc/apt/sources.list 更新完服务器列表后需要更新下源 sudoapt-get update 更新源 sudoapt-get in ...

  10. Android简易实战教程--第二十五话《网络图片查看器》

    访问网络已经有了很成熟的框架.这一篇只是介绍一下HttpURLConnection的简单用法,以及里面的"注意点".这一篇可以复习或者学习HttpURLConnection.han ...