Python如何延迟子弹射击

2023-12-13

预先感谢您抽出时间。

如果我用空格键发射子弹,则会创建一串子弹。如果我在 'if keys[pygame.K_SPACE]:' 中使用 time.sleep() 设置延迟,它也会将循环冻结设定的秒数。我怎样才能做到一次只发射一颗子弹?这是我的游戏循环的副本,请告诉我是否需要更多代码:

def game_loop():
    global pause
    x = (display_width * 0.2)
    y = (display_height * 0.2)

    x_change = 0
    y_change = 0

    blob_speed = 3

    velocity = [2, 2]

    pos_x = display_width/1.2
    pos_y = display_height/1.2

    gameExit = False
    while not gameExit:
        for event in pygame.event.get():#monitors hardware movement/ clicks
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        pos_x += velocity[0]
        pos_y += velocity[1]

        if pos_x + blob_width > display_width or pos_x < 601:
            velocity[0] = -velocity[0]

        if pos_y + blob_height > display_height or pos_y < 0:
            velocity[1] = -velocity[1]

# Checks to see if any keys are held down and remembers them with the variable keys.
        keys = pygame.key.get_pressed()

        for b in range(len(bullets)):
            bullets[b][0] += 6

        for bullet in bullets:
            if bullet[0] > 1005:
                bullets.remove(bullet)

        if keys[pygame.K_SPACE]:
            bullets.append([x+25, y+24])

# If the player is holding down one key or the other the blob moves in that direction
        if x < 0:
            x = 0
        if keys[pygame.K_a]:
            x_change = -blob_speed
        if x > 401 - blob_width:
            x = 401 - blob_width
        if keys[pygame.K_d]:
            x_change = blob_speed
        if keys[pygame.K_p]:
            pause = True
            paused()


# If the player is holding down both or neither of the keys the blob stops
        if keys[pygame.K_a] and keys[pygame.K_d]:
            x_change = 0
        if not keys[pygame.K_a] and not keys[pygame.K_d]:
            x_change = 0

        if y < 0:
            y = 0
        if keys[pygame.K_w]:
            y_change = -blob_speed
        if y > display_height - blob_height:
            y = display_height - blob_height
        if keys[pygame.K_s]:
            y_change = blob_speed


        if keys[pygame.K_w] and keys[pygame.K_s]:
            y_change = 0
        if not keys[pygame.K_w] and not keys[pygame.K_s]:
            y_change = 0


        #print(event)
        # Reset x and y to new position
        x += x_change
        y += y_change

        gameDisplay.fill(blue)  #changes background surface
        pygame.draw.line(gameDisplay, black, (601, display_height), (601, 0), 3)
        pygame.draw.line(gameDisplay, black, (401, display_height), (401, 0), 3)
        blob(pos_x, pos_y)
        blob(x, y)

        for bullet in bullets:
            gameDisplay.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0))

        pygame.display.update() #update screen
        clock.tick(120)#moves frame on (fps in parameters)

这是一个没有课程的答案。您只需存储上次发射子弹的时间,从当前时间中减去它,然后检查它是否超过某个时间限制(本例中为 500 毫秒),看看我们是否准备好发射。

import pygame


def game_loop():
    pygame.init()
    gameDisplay = pygame.display.set_mode((640, 480))
    clock = pygame.time.Clock()
    bulletpicture = pygame.Surface((10, 5))
    bulletpicture.fill(pygame.Color('sienna1'))
    bullets = []
    x = 50
    y = 240
    previous_time = pygame.time.get_ticks()

    gameExit = False
    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            current_time = pygame.time.get_ticks()
            # We're ready to fire when 500 ms have passed.
            if current_time - previous_time > 500:
                previous_time = current_time
                bullets.append([x+25, y+24])

        remaining_bullets = []
        for bullet in bullets:
            bullet[0] += 6  # Move the bullet.
            if bullet[0] < 500:  # Filter out the bullets.
                remaining_bullets.append(bullet)
        bullets = remaining_bullets

        gameDisplay.fill((30, 30, 30))

        for bullet in bullets:
            gameDisplay.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0))

        pygame.display.update()
        clock.tick(120)

game_loop()
pygame.quit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python如何延迟子弹射击 的相关文章

随机推荐

  • 如何访问 Angular2 组件中的 codemirror 文本区域值?

    我正在尝试将 codemirror 与 Angular 2 TypeScript 链接 现在 我可以使用 codearea 自定义指令显示 CodeEditor 该指令动态加载脚本文件并格式化文本区域 我无法获取该值 用户在文本区域中键入
  • 我们如何为鼠标滚轮敏感的

    我需要创建一个具有自己的滚动条的页面区域 就像下图中的 Facebook Messenger 一样 堆栈溢出在大段代码的答案中具有相同的系统 但滚动条没有样式 请注意图片 您将在 Messenger DIV 中看到普通滚动条和样式滚动条 有
  • Chrome 中的字体 MIME 类型错误

    这是 font face我使用过的声明 font face font family SolaimanLipi src url font SolaimanLipi 20 04 07 ttf 这在 Firefox 中工作得很好 但在 Chrom
  • 固定大小的 HashMap 的最佳容量和负载因子是多少?

    我正在尝试找出特定情况下的最佳容量和负载系数 我想我已经明白了它的要点 但我仍然感谢比我更有知识的人的确认 如果我知道我的 HashMap 将填满以包含 100 个对象 并且大部分时间都会包含 100 个对象 那么我猜测最佳值是初始容量 1
  • 在 RowMapper 中使用查询

    在java中我会做类似下面的事情来迭代resultset并形成查询 public Map
  • 是否可以创建一个非居中的 Javascript 警报框?

    对于标准 Javascriptalert 盒子 是否可以让它出现在屏幕中心以外的位置 您能指定水平和 或垂直位置吗 Afaik 它无法放置在您想要的位置 您始终可以使用在功能和自定义方面提供更多功能的 JS 框架 工具包解决方案之一 而不是
  • pandas 替换一列中的多个值

    在风险级别列中 我想将 小 替换为 1 将 中 替换为 5 将 高 替换为 15 我试过 dfm replace risk Small 1 risk Medium 5 risk High 15 但仅更换了介质 怎么了 您的替换格式已关闭 I
  • 基于分组返回列的 SQL 查询

    我的选择如下 SELECT SUBSTRING Col1 1 3 AS Series b Col2 CAST c Price c Qty AS MONEY AS Total FROM tableName a inner join WHERE
  • sitecore 中的基本 MembershipProvider

    我正在尝试为 sitecore 实现一个非常非常简单的 MembershipProvider 但我不确定它是否是too简单到实际工作 基本上我们已经有一个用于用户数据的自定义存储 所以我知道客户MembershipProvider是要走的路
  • 删除字符串中某个位置的字符 - javascript [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以删除javascript中某个位置的字符 例如如果我有字符串 Hello World 我可以删除位置3处的字符吗 我想要的结果如下 Helo World 这个问题不是重复的如何使用 Jav
  • 无法构建 apk,firebase_admob 出现错误

    我正在尝试构建 apk 但如果我没有运行 firebase admob 就会出现问题firebase admob那么 apk 可以完美运行并且构建没有任何错误 如何解决该问题 我收到此错误 在这种情况下 任务 firebase admob
  • 石头剪刀布程序不工作(Python)

    问题 程序似乎不接受输入的整数 不会增加赢 输 平局计数 并且不会在调试模式下显示计算机选择 程序的基本设计 编写一个程序 让用户与计算机玩石头 剪刀 布游戏 该程序应按如下方式工作 将显示一个菜单 战绩 0胜0平0负 调试显示计算机的选择
  • Eclipse RCP:如何排序属于不同插件的透视按钮?

    我的应用程序有 5 个插件 每个插件都有自己的视角 因此每个视角扩展定义都位于各个插件的plugin xml 下 现在 我想控制这些视角在我的应用程序中出现的顺序 怎么做 有一个主要插件包含 ApplicationWorkBenchAdvi
  • 如何更改工具栏主页图标颜色

    我正在使用 android support v7 widget Toolbar 并从中学习这个帖子如何将汉堡包图标的颜色更改为白色 但当我打电话时向上 后箭头仍然是深色 setDisplayHomeAsUpEnabled true 我怎样才
  • 如何在 Java 6 中使用为 Java 7 编译的库?

    我正在开发一个 Java 应用程序 我需要使用一个名为myBeans jar This myBeans jar包含许多类文件 这些文件是用jdk 1 7 我没有这些类文件的源代码 我的整个应用程序正在使用jdk 1 6 我无法将其编译器更改
  • SLComposeViewController 有屏幕截图但没有图像附件

    我注意到 Mobile Safari 的 Twitter 和 Facebook 共享添加了当前页面的屏幕截图 但并未实际共享它 例如 我试图通过 SLComposeViewController 复制此内容 但是调用添加图片 实际上将 UII
  • 如何限制 Open JDK 11 上的非堆大小

    我们正在 AWS 中运行基于 openjdk 11 slim 的 docker 容器 我们通常使用两种实例类型 一个有 1G 另一个有 2G 可用内存 在 1G 实例上 我开始使用这些参数来限制堆大小 XX MaxRAM 1g XX Max
  • Angular2 - 将 ngFor item 作为参数传递到管道中?

    我尝试将 ngFor 项目作为参数传递到管道中 但收到错误 异常 调用节点模块失败并出现错误 错误 模板 解析错误 TypeError 无法读取属性 toUpperCase undefined name ng container 错误 gt
  • 生成自定义字母数字序列

    我正在尝试生成自定义字母数字序列 顺序如下 AA0 AA9 AB0 AB9 AC0 AC9 等等 简而言之 有3个地方需要填补 On the first place the values can go from A to Z On the
  • Python如何延迟子弹射击

    预先感谢您抽出时间 如果我用空格键发射子弹 则会创建一串子弹 如果我在 if keys pygame K SPACE 中使用 time sleep 设置延迟 它也会将循环冻结设定的秒数 我怎样才能做到一次只发射一颗子弹 这是我的游戏循环的副