草庐IT

swift - 拳击计数/延迟/定时器

coder 2023-09-16 原文

我创建了一个拳击模拟,现在要回去添加动画。现在,我正在添加一个“Ref's Countup”来增加悬念。我尝试了很多事情,但没有一个得到我想要的。我尝试了:

Thread.sleep(forTimeInterval: 1)
knockdownNumber.text = "\(knockdownNumberInt)"

sleep(1)
knockdownNumber.text = "\(knockdownNumberInt)"

那些暂停了用户界面。所以他们确实等待了适当的时间,但没有更改我的文本。 还有一些只计算一次(即 1、3 或 1、8)。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

 delay(1) {
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

延迟函数为

 func delay(_ delay:Double, closure:@escaping ()->()) {
    DispatchQueue.main.asyncAfter(
        deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

我调用该函数(所有这些都在其中)的方式是在他被击倒之后。这段代码看起来像这样。

knockdownNumber.text = "1"
    knockdownNumberInt = 1
    downSec()
    knockdownNumberInt = knockdownNumberInt + 1
    downSec()
    knockdownNumberInt = knockdownNumberInt + 1
    downSec()
    if fighter2.endurance < 400 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 300 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 200 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 100 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 0 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < -100 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }

我真的很难过。

最佳答案

使用这种方法你就快完成了:

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in
    self.knockdownNumber.text = "\(self.knockdownNumberInt)"
}

您需要做的就是将repeats 设置为true,计时器将永远重复。

现在我们需要决定何时停止计时器。我们甚至应该在启动计时器之前就决定这一点,而不是像您所做的那样 - 在开始新时间时递减 knockdownNumberInt。这是行不通的,因为您放入计时器闭包中的内容是异步的。

因此我们决定要数到的数字:

knockdownNumber.text = "1"
knockdownNumberInt = 3
if fighter2.endurance < 400 {
    knockdownNumberInt += 1 // use the "+=" to make it cleaner!
}
if fighter2.endurance < 300 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 200 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 100 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 0 {
    knockdownNumberInt += 1
}
if fighter2.endurance < -100 {
    knockdownNumberInt += 1
}

在类中声明一个名为 currentCountDown 的属性:

var currentCountDown = 1

然后你可以像这样创建你的计时器:

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] (timer) in
    guard let `self` = self else { // I added this to prevent a retain cycle.
         timer.invalidate()
         return
    }
    self.currentCountDown += 1
    self.knockdownNumber.text = "\(self.currentCountDown)"
    if self.currentCountDown == self.knockdownNumberInt {
        timer.invalidate()
    }
}

关于swift - 拳击计数/延迟/定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537125/

有关swift - 拳击计数/延迟/定时器的更多相关文章

  1. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  2. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  3. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  4. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  5. Ruby 计数数组对象,如果对象包含值 - 2

    我有一个数组:array=['Footballs','Baseball','football','Soccer']而且我需要计算看到Football或Baseball的次数,无论大小写和复数形式如何。这是我尝试做的,但没有成功:array.count{|x|x.downcase.include?'football'||x.downcase.include?'baseball'}编写这段代码的正确或更好的方法是什么?我正在寻找3作为答案。 最佳答案 我会将count与一个block结合使用,该block根据与您正在寻找的约束相匹配的正

  6. ruby - Heroku - 如何开始工作人员(延迟工作)? - 2

    我有一些使用delayed_job的小程序。在我的本地主机上一切正常,但是当我将我的应用程序部署到Heroku并单击应该由delayed_job执行的链接时,没有任何反应,“任务”只是保存到表delayed_job中。Inthisarticleonherokublog写入时,执行delayed_job表中的任务,当运行此命令时rakejobs:work。但是我怎样才能运行这个命令呢?命令应该放在哪里?在代码中,还是从终端控制台? 最佳答案 如果您正在运行Cedar堆栈,请从终端控制台运行以下命令:herokurunrakejobs:

  7. ruby - AWS 上远程机器上的进程计数 - 2

    我正在为在AmazonEC2实例上运行的应用程序设计一个AutoScaling系统。应用程序从SQS读取消息并对其进行处理。AutoScaling系统将监控两件事:SQS中的消息数量,所有EC2机器上运行的进程总数。例如,如果SQS中的消息数量超过3000,我希望系统自动缩放,创建一个新的EC2实例,在其上部署代码,当消息数量低于2000时,我希望系统终止EC2实例.我正在用Ruby和Capistrano做这件事。我的问题是:我无法找到一种方法来确定在所有EC2机器上运行的进程数并将该数字保存在变量中。你能帮帮我吗? 最佳答案 您可

  8. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  9. ruby - 续集:如何使用分组和计数 - 2

    简单地说,我如何使用Sequel执行此查询?selecta.id,count(t.id)fromalbumsarightjointrackstont.album_id=a.idgroupbya.id 最佳答案 DB[:albums___a].right_join(:tracks___t,:album_id=>:id).select_group(:a__id).select_more{count(:t__id)} 关于ruby-续集:如何使用分组和计数,我们在StackOverflow上找

  10. ruby-on-rails - RSpec 检查数组的计数 - 2

    我正在测试我的ControllerAction以供练习。在我的Controller中,我只想从我的数据库中按名称获取所有不同的产品:defshop@products=Product.select('distincton(name)*').sort_by&:orderend我已经手动检查过了,它工作正常。现在我正在使用我的RSpec设置我的测试,我想测试@products是一个大于0的数组:RSpec.describePagesController,type::controllerdodescribe'GET#shop'doit'shouldgetallproudcts'doget:sh

随机推荐