Pygame 三角函数:跟随斜边?

2023-12-07

我的方法里有一个方法Enemy类称为huntPlayer。它需要一个玩家对象p。这里是:

def huntPlayer(self, p):   
  if self.dist2p < 200:
    self.hunting = True
    if p.x > self.rect.x:
      self.rect.x += self.speed #this is a constant at value 1
    elif p.x < self.rect.x:
      self.rect.x -= self.speed
    else:
      self.rect.x += 0
    if p.y > self.rect.y:
      self.rect.y += self.speed
    elif p.y < self.rect.y:
      self.rect.y -= self.speed 
    else:
      self.rect.y += 0
  else:
    self.rect.x += 0
    self.rect.y += 0

敌人随机放置在二维自上而下的平原周围,他们随机在这个平原上漫游。我计算了到玩家最短距离的斜边=Enemy.dist2p- 当。。。的时候dist2pvalue p.x and p.y分别。

我上面的解决方案很粗糙,因此我的问题是敌人在 x 或 y 轴上平均移动 1 个位置,导致每个轴的对角线移动,然后沿着轴滑动,直到到达玩家。 (玩家位于中央屏幕附近的固定位置。)

你能帮我解决这个问题吗huntPlayer方法/算法,以便敌人沿着斜边路径到达玩家,而不是到达 x/y 轴的最快路径?

编辑:如果您需要我可能遗漏的任何进一步信息,请告诉我。


在斜边上移动很可能需要您的对象在 y 轴或 x 轴上每帧移动少于一个像素,并且因为rects只能保存整数,您需要一个新属性position其中包含以浮点精度表示的精灵位置。您可以使用pygame.math.Vector2使用有用的方法创建向量,例如normalize()以及与其他向量的加、减、乘等。

假设您已经创建了一个属性self.position = pygame.math.Vector2(0, 0)(或者你希望它开始的任何位置)你可以这样做:

def hunt_player(self, player):
    player_position = pygame.math.Vector2(player.rect.topleft)
    direction = player_position - self.position
    velocity = direction.normalize() * self.speed

    self.position += velocity
    self.rect.topleft = self.position

通过将玩家的位置与敌人的位置相减,您将得到一个从敌人指向玩家的向量。如果我们将方向向量添加到我们的位置,我们将立即传送到玩家。相反,我们对向量进行归一化(使其长度为 1 像素)并乘以我们的速度属性。新创建的向量将是一个指向玩家的向量,其长度为我们的速度。

完整示例

import pygame
pygame.init()


SIZE = WIDTH, HEIGHT = 720, 480
FPS = 60
BACKGROUND_COLOR = pygame.Color('white')

screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()


class Hunter(pygame.sprite.Sprite):

    def __init__(self, position):
        super(Hunter, self).__init__()

        self.image = pygame.Surface((32, 32))
        self.image.fill(pygame.Color('red'))
        self.rect = self.image.get_rect(topleft=position)
        self.position = pygame.math.Vector2(position)
        self.speed = 2

    def hunt_player(self, player):
        player_position = player.rect.topleft
        direction = player_position - self.position
        velocity = direction.normalize() * self.speed

        self.position += velocity
        self.rect.topleft = self.position

    def update(self, player):
        self.hunt_player(player)


class Player(pygame.sprite.Sprite):

    def __init__(self, position):
        super(Player, self).__init__()

        self.image = pygame.Surface((32, 32))
        self.image.fill(pygame.Color('blue'))
        self.rect = self.image.get_rect(topleft=position)

        self.position = pygame.math.Vector2(position)
        self.velocity = pygame.math.Vector2(0, 0)
        self.speed = 3

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.velocity.x = -self.speed
        elif keys[pygame.K_RIGHT]:
            self.velocity.x = self.speed
        else:
            self.velocity.x = 0

        if keys[pygame.K_UP]:
            self.velocity.y = -self.speed
        elif keys[pygame.K_DOWN]:
            self.velocity.y = self.speed
        else:
            self.velocity.y = 0

        self.position += self.velocity
        self.rect.topleft = self.position

player = Player(position=(350, 220))
monster = Hunter(position=(680, 400))
running = True
while running:

    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    monster.update(player)

    screen.fill(BACKGROUND_COLOR)
    screen.blit(player.image, player.rect)
    screen.blit(monster.image, monster.rect)

    pygame.display.update()

Result

enter image description here

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

Pygame 三角函数:跟随斜边? 的相关文章

随机推荐

  • 在每个请求上使用基于角色的自定义身份验证查询数据库的正确方法 ASP.NET MVC

    这可能是一个有点无知的问题 但我是 mvc 新手 所以我很抱歉 我研究了书呆子晚餐身份验证模型 但在我的应用程序中 我有一个复杂的基于角色的身份验证 所以我做的是这样的 void MvcApplication PostAuthenticat
  • 安装 Spark 2.4.4 后尝试运行 pyspark 时如何修复“TypeError:需要一个整数(获取类型字节)”错误

    我已经安装了 OpenJDK 13 0 1 和 python 3 8 和 Spark 2 4 4 测试安装的说明是从 Spark 安装的根目录运行 bin pyspark 我不确定我是否错过了 Spark 安装中的某个步骤 例如设置一些环境
  • 对列表进行子集化(为所有组件选择匹配值)

    我尝试以某种方式从列表中读出某些元素 这相当于df c 1 4 5 in a data frame gt obj lt list c 1 5 c 1 5 gt obj 1 1 1 2 3 4 5 2 1 1 2 3 4 5 我正在寻找这样的
  • 为什么ACTION_MEDIA_BUTTON无法处理事件?

    遵循有关如何进行的培训部分使用硬件播放控制键来控制音频播放 我创建一个监听器类 public class RemoteControlReceiver extends BroadcastReceiver Override public voi
  • CMake:对 boost 库的未定义引用

    我通过这个添加了提升 set Boost USE STATIC LIBS ON set Boost USE MULTITHREADED ON set Boost USE STATIC RUNTIME OFF find package Boo
  • 我一直搞砸 1NF

    对我来说 到目前为止我发现的关于 1NF 最容易理解的描述是 主键是唯一标识每一行的一列 或一组列 在 www phlonx com 上 据我所知 冗余意味着每个键每行的值不应超过 1 个 超过 1 的值将是 冗余的 正确的 尽管如此 我还
  • Javascript Array.sort 实现?

    JavaScript 使用哪种算法Array sort 功能使用 我知道它可以采用各种方式的参数和函数来执行不同类型的排序 我只是对普通排序使用哪种算法感兴趣 我刚刚浏览了 WebKit Chrome Safari source 根据数组的
  • Java:空间对编译有影响吗?

    我正在制作一个程序 有点像 Piglatin 其中我无意中错过了语句中的一个变量 String a R a 其实应该是String a R text a 编译器产生了一个错误 但是 当我做到了 String a R a 程序编译完成 我想知
  • 需要在导航抽屉内显示可扩展列表视图

    I am an Android Application Developer I have started working on React Native I am unable to find a way to show expandabl
  • ASP.NET MVC 5 身份 userManager.IsInRole

    以下代码不起作用 我无法解释为什么 我的用户管理器造成了很大的困扰 因为它创建用户和角色很好 但是当我运行此代码时 userManager IsInRole 总是返回 false 所以第二个当我运行我的种子时 我遇到了错误 因为它试图创建记
  • Zend Framework 2 库路径

    当我试图尝试 ZF2 时 我偶然发现了我的第一个问题 在模块上说我想使用 Shanty Mongo 连接到 MongoDb 的外部库 因此 我复制了库上的整个 Shanty 目录并创建了一个新的 Model 类 namespace Dumm
  • AsyncTask不能在android线程中工作

    我使用 AsyncTask 来更改 TextView 的文本 如下所示 private class LongOperation extends AsyncTask
  • Twisted:重新连接ClientFactory连接到不同的服务器

    我有一个扭曲的 ReconnectingClientFactory 我可以通过该工厂成功连接到给定的 ip 和端口 而且效果很好 reactor connectTCP ip 端口 myHandsomeReconnectingClientFa
  • 如何找到与我的代码兼容的所有以前版本的 python

    我在 python 2 7 3 中创建了一个中型项目 包含大约 100 个模块 我希望找出我的代码与哪些以前版本的 python 例如 2 6 x 2 7 x 兼容 在公共领域发布我的项目之前 找到它的最简单方法是什么 我知道的解决方案 安
  • 使用索引作为键初始化对象数组[重复]

    这个问题在这里已经有答案了 我试图找出如何初始化一个对象数组 其中每个对象都以索引 i 作为其键 以 0 作为其值 下面的代码没有按预期工作 但我不明白为什么 我还是 Javascript 的初学者 在其他地方找不到答案 var n 10
  • 带有 Dagger Hilt 的 Android 动态功能模块

    我已经构建了一个动态功能模块示例 其中包含基于格子应用程序的片段 子组件和依赖组件 如果您想查看here是链接 现在 我正在尝试使用将其转换为 Dagger Hilt安卓官方文档 在核心模块中 即库模块 应用程序模块和动态功能模块依赖于 S
  • Kotlin 无法在 Android Studio 上运行

    所有 kotlin 文件都无法在我的 Android Studio 上显示 即使直接将java文件转换为koltin 也可以对其进行编辑 但它不会出现在项目文件树上 IDE 还表明它是反编译的 class 文件 我无法创建 Kotlin 文
  • 如何过滤除特定白名单之外的所有 HTML 标签?

    这是针对 NET 的 设置了 IgnoreCase 但未设置 MultiLine 通常我在正则表达式方面表现不错 也许我的咖啡因不足 用户可以输入 HTML 编码的实体 u i b h3 h4 br a img 允许自动关闭 和 无论有或没
  • 无法使用点布局(graphviz 作为库)

    我使用 graphviz v2 28 0 作为 C 应用程序中的库 并且我想使用点布局渲染图形 一切正常 直到我打电话给gvLayout context graph 点 输出以下错误的函数 Error Layout type dot not
  • Pygame 三角函数:跟随斜边?

    我的方法里有一个方法Enemy类称为huntPlayer 它需要一个玩家对象p 这里是 def huntPlayer self p if self dist2p lt 200 self hunting True if p x gt self