python - 如何使对象在pygame中移动一个角度
问题描述
我想将我的敌人移动到 pygame 中三角形的假想斜边上,从 start_x、start_y 变量移动到 target_x、target_y,我该怎么做?这是我的实用程序文件的一部分
def polar_to_rectangularD(degrees, hypotenuse=1.0, inverted_y=True):
opp = math.sin(math.degrees(degrees))*hypotenuse
adj = math.cos(math.degrees(degrees))*hypotenuse
if inverted_y:
opp = -opp
return opp,adj
def angle_towardsD(start_x, start_y, target_x, target_y, inverted_y=True):
opp = target_y - start_y
adj = target_x - start_x
if inverted_y:
opp = -opp
angle = math.atan2(opp, adj)
return math.degrees(angle)
这是我主要尝试用它做的一部分
if wall_spawn == 1:
enemy_y = player_ymax + player_half_height + enemy_radius
enemy_direction = -1
spawn_angle = utility.angle_towardsD((win_width/6),650,(win_width/2),-100)
enemy_x_offset, enemy_y_offset = utility.polar_to_rectangularD(spawn_angle,1)
enemy_y -= enemy_y_offset
enemy_movement += enemy_x_offset
#enemy_movement is set to None
解决方案
你不需要计算角度。只需计算从敌人到玩家的向量。按敌人的速度缩放矢量并将其添加到敌人的位置:
def move_enemy(start_x, start_y, target_x, target_y, spped):
dx = target_x - start_x
dy = target_y - start_y
dist = math.hypot(dx, dy)
if dist > 0:
start_x += min(spped, dist) * dx / dist
start_y += min(spped, dist) * dy / dist
return start_x, start_y
最小的例子:
import pygame, math
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
player_x, player_y, player_vel = 100, 100, 5
enemy_x, enemy_y, enemy_vel = 300, 300, 3
def move_enemy(start_x, start_y, target_x, target_y, speed):
dx = target_x - start_x
dy = target_y - start_y
dist = math.hypot(dx, dy)
if dist > 0:
start_x += min(speed, dist) * dx / dist
start_y += min(speed, dist) * dy / dist
return start_x, start_y
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
player_x = max(10, min(390, player_x + player_vel * (keys[pygame.K_d] - keys[pygame.K_a])))
player_y = max(10, min(390, player_y + player_vel * (keys[pygame.K_s] - keys[pygame.K_w])))
enemy_x, enemy_y = move_enemy(enemy_x, enemy_y, player_x, player_y, enemy_vel)
window.fill(0)
pygame.draw.circle(window, (0, 128, 255), (player_x, player_y), 10)
pygame.draw.circle(window, (255, 32, 32), (enemy_x, enemy_y), 10)
pygame.display.flip()
pygame.quit()
exit()
推荐阅读
- docker - 如何使用 Portainer 访问 Docker 容器外壳和挂载卷?
- python - 如何在 python 中求解具有常数的微分方程组?
- postsharp - Postsharp:ThreadAffineAttribute 和异步方法
- node.js - Mocha:如何在 typescript 中使用 assert.reject 并在 params 中使用 promise?
- swift - `#if TARGETMACRO` -> `#endif` 之间的 Swift 代码可防止代码着色/自动完成
- python - Dask 广播在计算图期间不可用
- excel - 如何将excel中不常见的日期时间格式分别转换为年、月、日和时间单元格?
- delphi - 是否可以将类型存储在 Delphi 中的变量中?
- excel - 值保留在列名中?
- java - 如何在 Java 中读取树结构制表符分隔的 txt 文件