在Pygame中沿光标方向绘制无限长度的线

2023-12-07

我正在寻找有关 pygame 的帮助。我正在用 Python 开发简单的游戏来学习 Pygame。我想制作一个可以旋转并且可以用激光线射击的宇宙飞船。 我已经完成了方向键控制,我们也可以用鼠标位置旋转飞船,但是我在射击方面遇到了问题。我想从宇宙飞船位置到鼠标方向画一条无限长的线。我怎样才能做到这一点?这是我的代码:

  def draw_objects(self):
        SCREEN.fill(BLACK)
        self.target = pygame.mouse.get_pos()
        self.x = self.player.position[0] #player x position
        self.y = self.player.position[1] #player y position
        self.mx = self.target[0] #mouse x position
        self.my = self.target[1] #mouse y position
        self.slope=float(float(self.y-self.my)/float(self.x-self.mx+0.1)) #slope
        self.x_new =  DISPLAY_WIDTH #ray length
        self.y_new = self.y + self.slope * (self.x_new - self.x) 
        self.player.draw()
        self.draw_columns()
        for agent in self.all_agents:
            agent.draw()
            agent.draw_vectors()
        if self.player.shoot == True:
            pygame.draw.line(SCREEN, GREEN, self.player.position,(self.x_new, self.y_new), 2)

        pygame.display.update()

enter image description here

它无法正常工作,因为它只能在宇宙飞船的右侧工作。在其他情况下,它会绘制一条反射到光标的线。

enter image description here

我将感谢您的帮助。


slope不保持方向。
你必须得到以下标志player_x - mouse_x + 0.1并与使用x_new

    dx = player_x - mouse_x + 0.1

    reversed_sign_x = 1 if dx < 0 else -1

    x_new = reversed_sign_x * DISPLAY_WIDTH

完整的工作示例:

  • 移动鼠标来移动线,
  • 单击左按钮设置玩家新位置。

.

import pygame

# --- constants ---

BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
DISPLAY_WIDTH = 800
DISPLAY_HEIGHT = 600

# --- functions ---

def calculate(player_x, player_y, mouse_x, mouse_y):
    dx = player_x - mouse_x + 0.1
    dy = player_y - mouse_y

    reversed_sign_x = 1 if dx < 0 else -1
    #reversed_sign_y = 1 if dy < 0 else -1

    slope = dy/dx

    x_new = reversed_sign_x * DISPLAY_WIDTH
    y_new = player_y + slope * (x_new - player_x)

    return x_new, y_new

# --- main ---

# - init -

pygame.init()
SCREEN = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))

# - objects -

player_x = DISPLAY_WIDTH // 2
player_y = DISPLAY_HEIGHT // 2

mouse_x = player_x
mouse_y = player_y

x_new, y_new = calculate(player_x, player_y, mouse_x, mouse_y)

# - mainloop -

clock = pygame.time.Clock()
running = True

while running:

    # - events -

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            player_x, player_y = event.pos
        elif event.type == pygame.MOUSEMOTION:
            x_new, y_new = calculate(player_x, player_y, event.pos[0], event.pos[1])

    # - updates -

    # empty

    # - draws -

    SCREEN.fill(BLACK)
    pygame.draw.line(SCREEN, GREEN, (player_x, player_y), (x_new, y_new), 2)
    pygame.display.flip()

    # - FPS -

    clock.tick(25)

# - end -

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

在Pygame中沿光标方向绘制无限长度的线 的相关文章

  • 查找两个字典的匹配键值对

    检查一个字典的键值对是否也存在于其他字典中的最有效方法是什么 假设我有两个字典dict1 and dict2这两个字典有一些共同的键值对 我想找到这些并打印出来 做到这一点最有效的方法是什么 请建议 一种方法是 d inter dict k
  • 在 gtk.main() 执行时与 gtk.container 交互?

    目前在 Python 中使用电池监视器图标进行实验pygtk and egg trayicon创建一个图标来显示电池图标 工具提示 我似乎能够添加图标和工具提示文本 但是当它到达gtk main 阶段我需要一种方法来修改这些 以便它可以显示
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 将 3d NumPy 数组重塑为 2d NumPy 数组时遇到问题

    我正在研究图像处理问题 我的数据以 3 维 NumPy 数组的形式呈现 其中 x y z 条目是图像 z 的 x y 像素 数值强度值 有 100000 张图像 每张图像为 25x25 因此 数据矩阵的大小为 25x25x10000 我试图
  • 有没有办法在 Altair 箱线图中格式化工具提示值

    是否可以格式化箱线图工具提示中的值 由此织女星文档 https vega github io vega lite docs boxplot html tooltip encoding channels 看起来是这样 但我不太清楚如何使用 A
  • 检查时间戳列是否在另一个数据帧的日期范围内

    我有一个数据框 df A 有两列 amin 和 amax 这是一组时间范围 我的目标是查找 df B 中的列是否位于 df A amin 和 amax 列中范围的任何行之间 df A amin amax amin amax 0 2016 0
  • Heroku 上的 Django 应用程序在一段时间后删除对象

    我编写了一个简单的 Django 问答论坛应用程序并将其部署在 Heroku 上 该网站的本地版本运行良好 但是 生产版本不会将问题 答案等存储超过几个小时 我决定坚持使用 Django 附带的 sqlite3 我预计该网站不会有太多流量
  • 在 Windows 上的 python2.5 上安装 Openpyxl

    我努力了easy install install openpyxl and python setup install 两者都失败了 我也尝试过easy install openpyxl并再次失败 我包括了我得到的输出 当我尝试时easy i
  • 使用 Pytest 捕获 SystemExit 消息

    我正在使用 pytest 编写测试 我遇到了一些函数抛出异常的情况SystemExit如果输入错误 终端上会显示一些错误消息 我想为以下情况编写测试SystemExit抛出并验证输出错误消息中是否有特定字符串 这是代码 def test v
  • 使用存储的密钥作为环境变量

    我有一个秘密密钥存储在 GCP 的秘密管理器中 我们的想法是使用该密钥通过云功能获取预算列表 现在 我可以从代码中访问该密钥 但我面临的问题是我需要使用该密钥设置一个环境变量 这是我添加密钥的方式 如果您的本地目录中有该文件 但是还有其他方
  • PyGTK TreeView 中的自动换行

    如何在 PyGTK TreeView 中自动换行文本 gtk TreeView 中的文本是使用 gtk CellRendererText 渲染的 文本换行归结为在单元格渲染器上设置正确的属性 为了让文本换行 您需要设置wrap width单
  • Pygame 旋转射击

    我和几个朋友一直在编写一种有趣的新射击机制 为了让它发挥作用 我们需要朝玩家面对的方向射击 Sprite 正在使用 Pygame Transform Rotate 进行旋转 我们怎样才能找到一个角度 然后朝那个方向发射子弹呢 这是我们的精灵
  • 从 Java 调用 Python 代码时出现问题(不使用 jython)

    我发现这是从 java 运行 使用 exec 方法 python 脚本的方法之一 我在 python 文件中有一个简单的打印语句 但是 我的程序在运行时什么也没做 它既不打印Python文件中编写的语句 也不抛出异常 程序什么都不做就终止了
  • NLTK 无法找到 stanford-postagger.jar!设置CLASSPATH环境变量

    我正在开发一个项目 需要我使用 nltk 和 python 来标记令牌 所以我想用这个 但遇到了一些问题 我浏览了很多其他已经提出的问题和其他论坛 但我仍然无法解决这个问题 问题是当我尝试执行以下命令时 from nltk tag impo
  • 在类方法 Python 中调用多处理

    最初 我有一个类来存储一些处理后的值 并通过其他方法重用这些值 问题是当我尝试将类方法划分为多个进程以加速时 python 生成了进程 但它似乎不起作用 正如我在任务管理器中看到的那样 只有 1 个进程在运行 并且结果从未传递 我做了几次搜
  • 我以为 Python 通过引用传递了所有内容?

    采取以下代码 module functions py def foo input new val input new val module main py input 5 functions foo input 10 print input
  • 无法从 celery 信号连接到 celery 任务?

    我正在尝试连接task2 from task success signal from celery signals import task success from celery import Celery app Celery app t
  • 确定 pyInstaller 生成的 Python EXE 中的应用程序路径

    我有一个驻留在单个 py 文件中的应用程序 我已经能够让 pyInstaller 将其成功捆绑到 Windows 的 EXE 中 问题是 应用程序需要一个 cfg 文件 该文件始终直接位于应用程序旁边的同一目录中 通常 我使用以下代码构建路
  • 为什么我只能在异步函数中使用await关键字?

    假设我有这样的代码 async def fetch text gt str return text async def show something something await fetch text print something 这很
  • WTforms 表单未提交但不输出验证错误

    我正在尝试使用以下方式上传文件flask uploads工作和遇到一些障碍 我会告诉你我的flask查看函数 html 希望有人能指出我缺少的内容 基本上发生的情况是我提交了表格但失败了if request method POST and

随机推荐

  • FirebaseInstanceId:传递消息时出错:MI 设备中未找到 ServiceIntent

    当应用程序长时间处于后台时 我们发现了此错误 我在小米设备中发现了这个问题 我在三星进行了测试 它运行完美 但在小米中 它总是抛出相同的错误 None
  • findOne 可以先匹配还是最后匹配?

    我专门使用猫鼬 尽管我不认为这有那么重要 例如 假设我有一个名为 MongoQueue 的集合 并且我向该队列添加了一些人 MongoQueue save function err firstPerson if err console lo
  • 使用不同的因变量重复回归

    我已经在 Stack 和 google 上搜索了解决方案 但没有找到解决我的问题的方法 我有大约 40 个因变量 我的目标是获得调整后的均值 lsmeans 在考虑了一些协变量后 我需要调整 A 组和 B 组的均值 我的最终对象应该是一个数
  • 在 matplotlib 中使用更多颜色进行绘图

    我正在尝试使用 matplotlib 绘制散点图 但收到 IndexError 从空列表中弹出 错误 我不知道如何修复它 import matplotlib pyplot as plt import matplotlib import nu
  • 表格单元格在行内右对齐

    我试图弄清楚如何将单元格移动到 HTML 表格的左侧 我想在最后一行使用更少的单元格 默认情况下它位于右侧 例如我有这张表 table tr th one th th two th th three th tr tr td one td t
  • Android v2 MapFragment 在 Scrollview 中滚动时抖动

    我正在使用 SupportMapFragment 在 ScrollView 中显示静态地图 我不喜欢移动 缩放地图 只显示位置 当我向下 向上滚动时 地图在其边界内晃动 感觉非常滞后 我的问题是 如何消除这种滞后 或者如何使用 v2 api
  • 在 Java 中 Ping 多个服务器 [重复]

    这个问题在这里已经有答案了 我有一个程序可以向服务器发送 ping 请求 该列表很大 如果IP无法到达 需要时间才能转到下一个IP 我希望 对于每一个IP 它应该创建一个新线程并同时处理所有线程 这是代码 for int i 0 i lt
  • Jackson @JsonProperty(required=true) 不会抛出异常

    我正在使用 jackson 2 2 注释 JsonProperty 并将 required 设置为 true 通过 ObjectMapper readValue 方法反序列化不包含该属性的 json 文件时 不会引发异常 它应该以不同的方式
  • 在 SQL Server 中执行列值[重复]

    这个问题在这里已经有答案了 我需要对 SQL 表中保存的值进行算术运算 例如 我在下一列中的值为 5 10 我想要 15 EQUATION VALUE 2 5 7 6 8 14 根据方程式我需要计算该值 正如您现在所知 SQL Server
  • 在运行时修改类定义的注释字符串参数

    想象一下有一个类 Something someProperty some value public class Foobar 它已经编译 我无法控制源代码 并且是 jvm 启动时类路径的一部分 我希望能够在运行时将 某些值 更改为其他值 这
  • 过程中表值参数中的标识列,如何定义 DataTable

    是否可以将类型为 table 的参数以及类型为 int IDENTITY 1 1 的列传递给过程 并使用作为输入参数传递的 DataTable 对象来执行此存储过程 我收到以下错误 插入表变量不允许的标识列 表值参数 xxxxx 的数据不符
  • 我们如何解释表达式 (++x)+(++x)+(++x) 的结果? [复制]

    这个问题在这里已经有答案了 x 1 std cout lt lt x x x 我期望输出是11 但实际上是12 Why 我们通过期待来解释它未定义的行为而不是任何特定的结果 由于表达式尝试多次修改 x 而无需干预序列点 its 行为未定义
  • 生成16位灰度BitmapData并保存到文件

    我试图在 C 中从随机数据生成 16 位灰度位图 但它在 Marshal Copy 上崩溃了 这是我的代码 Bitmap b16bpp private void GenerateDummy16bitImage b16bpp new Bitm
  • 从响应中提取图像数据:Angular 2

    响应具有图像数据 但我无法从响应中提取它 客户代码 download this http get http localhost 9000 download this fileid subscribe data gt this image d
  • Wpf 图像控制阻止文件

    我有一个简单的Window带按钮和第二个Window当我点击时打开Button 第二Window has a Image控件 显示 png 文件 所以如果我使用FileObject财产为Binding一切正常 我可以从中删除文件File E
  • Safari 开发工具 JS 控制台窗口中的 $1 和 $2 等是什么?

    当我在 Safari 上运行开发工具并在控制台窗口中使用 querySelector 时 我得到正确的值 然后是 1 和 2 等等 任何人都可以帮助理解它们的含义吗 Chrome 0 4 开发工具会记住您在选项卡 或 配置文件 面板 中选择
  • Ruby 中的 Google Apps API 和服务帐户出现问题

    我在获取用于实例化驱动器服务帐户的示例代码时遇到一些问题 我已按照指示在 API 控制台中设置了服务帐户 并包含了 https www googleapis com auth drive 但运行此命令会生成以下错误 授权失败 服务器消息 S
  • 我如何知道 ListBoxItem 是否是 Wpf 的 ListBox 中的最后一个项目?

    我怎么知道是否ListBoxItem是集合的最后一项 在ItemContainerStyle或在ItemContainer的模板 在 Wpf 内ListBox 这个问题是因为我需要知道某个项目是否是最后一个以其他方式显示的项目 例如 假设我
  • 抽象类的非静态方法和静态方法有什么区别?

    我知道在抽象类中使用静态方法不是最佳实践 但是如果我在抽象类中同时使用静态方法和非静态方法有什么区别 我假设调用这些方法没有区别 因为我们无法为抽象类创建实例 所以我们可以仅使用类名调用静态和非静态方法 除了关键字 Static 之外 它们
  • 在Pygame中沿光标方向绘制无限长度的线

    我正在寻找有关 pygame 的帮助 我正在用 Python 开发简单的游戏来学习 Pygame 我想制作一个可以旋转并且可以用激光线射击的宇宙飞船 我已经完成了方向键控制 我们也可以用鼠标位置旋转飞船 但是我在射击方面遇到了问题 我想从宇