- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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
敌人随机放置在一个 2d 自上而下的平原周围,他们随机在这个平原上漫游。我计算了到玩家的最短距离的斜边 = Enemy.dist2p
-- 当 dist2p
值 < 200 时,敌人将向玩家移动,p.x
和 p.y
分别。
我上面的解决方案很粗糙,所以我的问题是敌人在 x 或 y 轴上平均移动 1 个位置,导致每个轴的对角线移动,然后沿着轴滑动直到它到达玩家。 (播放器位于中心屏幕附近的固定位置。)
你能帮我修复 huntPlayer
方法/算法,让敌人沿着斜边路径到达玩家,而不是到 x/y 轴的最快路径吗?
编辑:如果您需要我可能遗漏的任何进一步信息,请告诉我。
最佳答案
在斜边上移动很可能需要您的对象在 y 轴或 x 轴上每帧移动少于一个像素,并且由于 rects
只能容纳整数,因此您需要一个新的属性 position
包含浮点精度的 Sprite 位置。您可以使用 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()
关于python - Pygame 三角函数 : Following the hypotenuse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093038/
在C语言标准库里面提供了常用的三角函数,在头文件math.h里面可以看到函数的相关定义。 double __cdecl sin(double _X); double __cdecl cos(dou
我这个人可不是“科学怪人”,但是我可爱的朋友们,今天我想和你们谈一谈三角函数与牛顿迭代法。这可不是一件简单的事情哦,就像是找到一片荒芜的沙漠中的绿洲一样。但是别怕,我会用通俗易懂的语言给你们解释清楚的
我想做一个 sin 函数。所以这是我的代码: inline double _cdecl Sin(double Rad) { _asm { fld QWORD PTR [
当我偶然发现这个时,我正在通过为表中的字段预先计算一些三角函数来优化查询: SELECT 6371 * acos( 0.793521289617132 * 0.793521289617132 + 0.
我正在尝试在 Android 上使用 Java 和 LibGDX 做一些基本的三角函数。我花了很长时间在谷歌上搜索“如何找到直角三角形的角度”。我还是不太明白:( 我想给 Actor 子类一个随机的方
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我目前使用 MSSQL 查询,它允许我查找特定半径内的项目。它看起来像这样: select distinct ID,longitude,latitude, (@unite * ACOS(cos(rad
这个问题类似于斐波那契数列,只是我们将最后三个数字加在一起而不是最后两个数字。它被称为 Tribonacci。 INPUT:序列中 3 个起始数字的数组/列表,以及 (n) 您希望最终模式有多长,例如
我明白如何计算斜边 a^2 + b^2 = c^2,sqrt(c) = 斜边。而且我知道 stackoverflow 上已经有一些相关的答案,但他们沉浸在我作为初学者程序员还不理解的术语中。 由于这更
我正在写一个应该计算角度(以度为单位)的类,经过长时间的尝试我没有让它工作。 When r = 45 & h = 0 sum should be around 77,14° 但它返回 NaN - 为什
我试着算出三角形的角。 如果三角形的一边是100,另一边是100。 我如何使它达到 45 度。 如果我在我的计算器上运行 tan-1(100/100),我得到 45。我如何在 PHP 中执行此操作?
由于 java.lang.Math 中的三角函数非常慢:是否有一个库可以快速且良好地进行近似?在不损失太多精度的情况下,似乎可以将计算速度提高几倍。 (在我的机器上,乘法需要 1.5ns,java.l
我正在尝试计算 SSIS 表达式(作为新列)中的 SIN 和 COS,但找不到任何表达式。 例如: 新加坡(lat_org_rad)COS(long_org_rad)ACOS(long_org_rad
问题: 在简单的 SDL 2.0.4 应用程序(自上而下的移动/旋转尝试)中使用 math.h 三角函数时,我发现三角计算中存在一些小错误,导致“玩家”不动正好在面对的方向,这让我很烦恼。我搜索了为什
我用 Python 编写了这段代码 def hitsin(a): a = a*57.3 return math.sin(a) 所以每当我输入 hitsin(x) 时,x 都会转换为弧度
我的 Enemy 类中有一个名为 huntPlayer 的方法。它需要一个播放器对象 p。在这里: def huntPlayer(self, p): if self.dist2p self.
我遇到了一些应该很容易回答的问题,但我不能 Handlebars 指放在上面。自从我做了一些三角函数以来已经有一段时间了。 double cosValue = -2.7105054312E-20; /
我是一名优秀的程序员,十分优秀!