- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
因此,我受东方的启发,在 Pygame 中创建了一款子弹 hell 风格的游戏,让玩家以不同的射速向多个不同的方向发射子弹。我设法借用了一些代码,使我能够实现子弹的快速射击,然后通过为散布射击创建多个不同的子弹对象来添加它。然而,尽管我希望能够为每个单独的子弹对象流调整重新加载速度,但老实说我对如何调整感到困惑。有人可以帮我吗?
这里是子弹按预期射击所涉及的代码,所有子弹都具有相同的装填速度:
reloadSpeed = 50
shootingEvent = pygame.USEREVENT + 1
reloaded = True
(稍后在 while 循环中):
if key[pygame.K_z]:
if reloaded:
bulletSound.stop()
player.shoot()
bulletSound.play()
reloaded = False
pygame.time.set_timer(shootingEvent, reloadSpeed)
这是我的 Player 类中的射击函数,以及用于上下文的 Bullet 类:
def shoot(self):
bullet1N = Bullet(self.rect.centerx, self.rect.top, -4, -10, lb)
bulletCentreN = Bullet(self.rect.centerx, self.rect.top, 0, -10,db)
bullet3N = Bullet(self.rect.centerx, self.rect.top, 4, -10, lb)
bullet1N2 = Bullet(self.rect.centerx, self.rect.top, -2, -10, db)
bullet2N2 = Bullet(self.rect.centerx, self.rect.top, -1, -10, db)
bullet3N2 = Bullet(self.rect.centerx, self.rect.top, 1, -10, db)
bullet4N2 = Bullet(self.rect.centerx, self.rect.top, 2, -10, db)
(等,等等,很多不同类型的子弹。第一个数字代表相应“功率”阈值中的数量流,因为我想要随着功率在整个游戏中增加而不同的子弹流;'N' 或 ' S' 表示流是用于正常开火期间还是在轮类期间,第二个数字表示该流用于的功率级别。)
keystate = pygame.key.get_pressed()
if power < 16:
if keystate[pygame.K_LSHIFT]:
Group(bulletCentreS)
else:
Group(bullet1N)
Group(bulletCentreN)
Group(bullet3N)
if power >= 16 and power < 48:
if keystate[pygame.K_LSHIFT]:
Group(bullet1S2)
Group(bullet2S2)
else:
Group(bullet1N2)
Group(bullet2N2)
Group(bullet3N2)
Group(bullet4N2)
(Group只是一个函数,可以更有效地将子弹添加到几个 Sprite 组中)
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, speedx, speedy, col):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((6, 6))
self.image.set_alpha(100)
self.image.fill(col)
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
self.speedy = speedy
self.speedx = speedx
def update(self):
self.rect.y += self.speedy
self.rect.x += self.speedx
# kill if it moves off the top of the screen
if self.rect.bottom < 25:
self.kill()
if self.rect.x > WIDTH/2:
self.kill()
如图所示,这导致任何模式的每颗子弹都以相同的速度发射,尽管在某些情况下移动速度不同。
编辑:多亏了金斯利,我才意识到我需要以某种方式在我的 Bullet 类中实现射击功能,以便可以通过每个具有射速属性的 Bullet 对象来调整不同流的射速......但我将如何实现呢?
最佳答案
一个简单的技术是记录“触发”事件的实时时间,并且在时间延迟到期之前不允许该类型的进一步操作。
获取可用时间戳的一种简单方法是 PyGame function pygame.time.getticks()
,它返回自启动以来不断增加的毫秒数。
每当用户启动触发机制时,存储时间。
fire_time_type1 = pygame.time.getticks() # time of last shot
还要决定射速延迟应该是多少,例如:
RELOAD_DELAY_TYPE1 = 300 # milliseconds
修改用户界面,使触发过程仅在延迟结束后完成:
now = pygame.time.getticks()
if ( now > fire_time_type1 + RELOAD_DELAY_TYPE1 ):
fire_weapon_type1()
fire_time_type1 = now
else:
# still waiting for re-load time delay
# play weapon-too-hot sound, etc.
pass
显然,这种机制可以在类中工作,因此延迟发生在对象内部,而不是像这个例子那样发生在外部。
通过简单地存储更多的使用时间记录,这种方法很容易针对不同的延迟实现。
编辑:
也许触发类可以维护不同类型的状态 子弹。
### Gun object encapsulates enough detail to track the number of shots
### from a given magazine size, enforcing a reload-delay once the
### magazine is empty
class Gun:
def __init__( self, name, magazine_size, reload_delay=300 ):
self.name = name
self.shots = 0
self.mag_size = magazine_size
self.reload = reload_delay # milliseconds
self.use_time = 0
def hasBullet( self ):
""" Check that either a bullet is available, or that the
reload delay has expired """
now = pygame.time.getticks()
if ( self.shots >= self.mag_size and now > self.use_time + self.reload ):
self.shots = 0 # reload
print( "Debug: [%s] reloaded after %d millisecs" % (self.name, self.reload ) )
return ( self.shots < self.mag_size )
def trackFiring( self ):
""" keep track of the magazine limit, and when the shot was fired """
self.shots += 1
self.use_time = pygame.time.getticks() # time of last shot
print( "Debug: [%s] fired, %d rounds left" % (self.name, self.mag_size - self.shots ) )
### ...
nail_gun = Gun( 'nail', 200, 500 )
rockets = Gun( 'rocket', 3, 1000 )
bfg = Gun( 'BFG (oh yes!)', 1, 5000 )
### ...
# Player activates rocket launcher~
if ( rockets.hasBullet() ):
rockets.trackFiring()
shoot( ... )
显然,子弹射击可以在 Gun
类中进行,但这留给读者作为练习。
注意:我还没有测试编译这段代码,预计会有小错误和遗漏。
关于python - 如何在一个事件中为 Pygame 中的不同对象设置多个计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867246/
我需要在 文档就绪 触发后 5 秒调用我的函数 abc()。 这在 jQuery 中可能吗? $(document).ready(function () { //Wait 5 seconds then
我发现 System.Diagnostics.Stopwatch 类即使在很短的时间段(即 20 秒)内似乎也存在可测量的不准确性。对于编码为运行 20 秒的进程,我的进程显示耗时为 20.3+ 秒:
我正在使用 Ionic Framework 使用 Angular 构建一个 Android/iPhone 食谱应用程序。 功能之一应该是每个成分/步骤的警报/计时器。 我猜 Ionic 是基于 Apa
我有一个 JS 计时器脚本,从 20 秒开始倒计时 var count = 0; var speed = 1000; countdown = setInterval( function
我的 JavaScript 计时器有一个大问题。一切正常,除了 1 个按钮:停止!我不知道如何停止计数器上的所有内容(例如重置每个输入和计数器)。有什么想法可以解决这个问题吗?
所以我有一个 TimerTask 任务 在其 run() 中调用函数 onTimerComplete() onTimerComplete() 看起来像这样: private void onTimerC
我在 Eclipse 中的 windowbuilder 创建的 run() 方法中有计时器。 我不知道如何通过另一种方法停止该计时器。例如通过添加 if(MenuWindow.gameStarted
我对java很陌生,我试图在按下按钮时启动计时器,但无法启动它。我尝试了几行代码,但似乎没有任何效果。 我已经声明了我的标签、文本字段和计时器: private JTextField JTFHours
import java.util.Scanner; import java.util.Timer; import java.util.TimerTask; public class Boggle {
我正在尝试在 JavaScript 中获取计时器的值,因此当计时器为零时它会显示不同的内容; var local_t = new Date(); local_t.setSeconds(local_t.
我需要使用 jquery 为网站创建自定义 slider 。到目前为止,如果我单击按钮,我已经设法让它按照我想要的方式运行,但我想实现一个自动计时器,以便幻灯片在 5 秒后切换。 这是我的 JS 代码
我正在制作一个计时器,记录点击“通过”按钮上的“确定”时的最长时间(个人最好成绩)。我似乎无法弄清楚如何让计数器回到 0,我确信有一种方法可以只用 2 个按钮(开始 + 通过)来完成。我希望计时器在我
我有一个 java.util.Timer 用于限制电子邮件发送(如果最近发送了状态电子邮件,那么现在不要发送,而是创建一个计时器任务以稍后发送任何新状态)。 我想要的是确保最终发送所有排队的电子邮件,
我已经建立了一个在线考试门户,允许学生使用网络浏览器在线参加考试。 现在我还开发了计时器功能,用户必须在规定的时间范围内完成考试。我遇到的麻烦是,当我刷新页面时,计时器再次从新开始,例如 40 分钟。
我想知道在一定时间内禁用按钮的最佳方法是什么。当用户使用其他按钮转到其他页面时,定时器不会被重置,按钮仍将被禁用。 我读过很多关于异步任务、线程的不同方法。但是我非常不确定哪种方法最好。 我希望计时器
我正在制作一个测验应用程序,我想在其中显示用户在玩游戏时所用的时间。它应该采用 HH:MM:SS 格式,从 00:00:00 开始,直到他选择答案。当用户每秒播放时,计时器应该每秒更新一次。另外,我想
您好,计划为该 Activity 开发 android 倒数计时器应用程序,当用户单击开始按钮时显示计时器倒计时并显示计时器倒计时,用户将转到剩余 Activity ,即使计时器在后台运行,如果用户单
我想知道是否有一种简单的方法可以使用 PHP 在数据库中创建计时器,我想在数据库中创建该行 30 分钟后将其删除。如果这不够具体,我很抱歉,但我不知道如何在其中提供更多细节,请随意发表评论,以便我可以
我试图制作一种与我的计时器一起使用的对象。问题是,当我只有裸函数(不在对象中)时,它就可以工作。但是当我把它放在对象内部时它不起作用。 使用此代码我只能看到 00:01 当我只使用函数本身时,它工作正
这个问题已经有答案了: How to format numbers as currency strings (67 个回答) 已关闭 9 年前。 我想显示从 1 到 2500 的美元计时器。当计时器增
我是一名优秀的程序员,十分优秀!