首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTimer操作还是暂停操作?

NSTimer操作还是暂停操作?
EN

Stack Overflow用户
提问于 2011-12-22 23:35:29
回答 1查看 229关注 0票数 2

首先,总的来说,我对编程是相当陌生的。对Objective C和IOS编程来说也是非常新的。这只是我为了学习而写的一个编程练习。

它的基本功能是:

计算机选择要攻击的次数,然后随机选择1到4或0和3之间的数字(真的无关紧要)。它在每次通过for循环时都会这样做。

我想要实现的是:

如果计算机选择0,则它突出显示适当的按钮并使其活动,以便用户与之交互,但他们只有一定的时间来按下所述按钮。定时器调用取消高亮显示按钮并使其处于非活动状态的函数。

所有这些都是有效的,但它们都是同时发生的。如果计算机攻击三次,所有三个按钮都会同时高亮显示并激活,然后同时变为非活动状态。我想让程序暂停计时器的长度,让玩家有足够的时间按下按钮。我搞不懂这部分。我想使用一个while循环,它在按下按钮或计时器调用函数时启动,但这只会使它卡在while循环中。我已经在第一个if语句中说明了这一点。

再说一次,请保持简单,因为我是编程新手。谢谢

代码语言:javascript
复制
if(theEnemy.attackingOrBlocking == 1)
{
    int whereAttack;
    int numberOfAttacks = 3; //theEnemy.numOfAttacks;
    for (int i = 0; i <= numberOfAttacks; i++)
    {
        whereAttack = theEnemy.attackButton;
        if (whereAttack == 0) 
        {
            while (buttonPushed == NO)
            {
                [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(timerCallback) userInfo:nil repeats:NO];

                lowAttackBlock.userInteractionEnabled = YES;
                lowAttackBlock.highlighted = YES;
            }

        }
        if (whereAttack == 1)
        {
                [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(timerCallback) userInfo:nil repeats:NO];

                leftAttackBlock.userInteractionEnabled = YES;
                leftAttackBlock.highlighted = YES;

        }
        if (whereAttack == 2)
        {
                [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(timerCallback) userInfo:nil repeats:NO];

                rightAttackBlock.userInteractionEnabled = YES;
                rightAttackBlock.highlighted = YES;

        }
        if (whereAttack == 3)
        {
                [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(timerCallback) userInfo:nil repeats:NO];

                highAttackBlock.userInteractionEnabled = YES;
                highAttackBlock.highlighted = YES;
        }
        if (myCharacter.block != whereAttack)
        {
            myCharacter.health -= 10;
            [yourHealth setText:[[NSString alloc] initWithFormat:@"%d",myCharacter.health]];
        }
    }

}

}

EN

回答 1

Stack Overflow用户

发布于 2011-12-22 23:55:12

启动计时器是一个异步操作,因此它不会停止应用程序的正常流程,因此,如果您处于启动3计时器的for循环中,则在第一个计时器回调之前,for循环将完全执行。

要做到这一点,一种方法是在实例变量中缓存命中次数,每次调用计时器时都会将命中次数减1。

因此,您发起了一系列3次攻击,您将remainingAttack实例变量设置为3,调用performAttack方法来检查是否还有攻击要做,如果有,则执行攻击(或者您希望从timer回调中执行攻击),将攻击次数减少1(或从timer回调中),启动计时器。

在定时器callBack中执行您的逻辑,然后再次调用performAttack作为定时器的最后一个操作。

这是我现在能想到的基本逻辑,你必须根据你的个人需求来调整它,而且可能会有更好的解决方案。但这只是其中之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8606107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档