[英]PYTHON & PYGAME How to move and rotate polygon towards the mouse position?
( 编辑:旋转对我来说不再重要了,只是运动。我仍然很好奇,很想知道如何进行旋转。)
def angle_between(p1, p2):
ang1 = np.arctan2(*p1[::-1])
ang2 = np.arctan2(*p2[::-1])
return (ang1 - ang2) % (2 * np.pi)
class Minion: # Shape: Triangle
def __init__(self):
self.rotation = 0
self.position = (200,200)
self.radius = 50
self.vertices = ((1,1), (10,10), (1,10))
def determine_vertices(self):
x = self.position[0]
y = self.position[1]
target_pos = pygame.mouse.get_pos()
x2 = target_pos[0]
y2 = target_pos[1]
# Will start off pointing to the right (pre-rotation)
vertex_A = (x + self.radius, y)
vertex_B = (x + (cos(2*pi/3))*self.radius, y + (sin(2*pi/3))*self.radius)
vertex_C = (x + (cos(4*pi/3))*self.radius, y + (sin(4*pi/3))*self.radius)
self.vertices = (vertex_A,vertex_B,vertex_C) # NOT YET ROTATED
# Now let's find the angle between my location and the target location
self.rotation = angle_between((x,y),(x2,y2))
# Here is where I am stuck
好的,所以在旋转顶点之前,我已经找到了它们的位置,并且还找到了要将其旋转到的角度(以弧度为单位)。 这是我看过的链接:
编辑:我已将顶点公式更改为旋转,但它们旋转的方向和方向都太快。 我不知道为什么。 这是代码:
vertex_A = (x + (cos(self.rotation))*self.radius, y + (sin(self.rotation))*self.radius)
vertex_B = (x + (cos((2*pi/3) + self.rotation))*self.radius, y + (sin((2*pi/3) + self.rotation))*self.radius)
vertex_C = (x + (cos((4*pi/3) + self.rotation))*self.radius, y + (sin((4*pi/3) + self.rotation))*self.radius)
要将对象移向鼠标,可以使用矢量。 只需从鼠标pos减去位置,对结果向量进行归一化,并以所需速度将其复数即可。 这样就可以为您提供速度矢量,您可以在每帧self.pos
其添加到self.pos
(还可以更新矩形,用作矩形的位置并用于碰撞检测)。
调用Vector2.as_polar
方法(它返回极坐标 )以获取矢量的角度,然后使用它旋转原始图像。
import pygame as pg
from pygame.math import Vector2
class Entity(pg.sprite.Sprite):
def __init__(self, pos, *groups):
super().__init__(*groups)
self.image = pg.Surface((50, 30), pg.SRCALPHA) # A transparent image.
# Draw a triangle onto the image.
pg.draw.polygon(self.image, pg.Color('dodgerblue2'),
((0, 0), (50, 15), (0, 30)))
# A reference to the original image to preserve the quality.
self.orig_image = self.image
self.rect = self.image.get_rect(center=pos)
self.vel = Vector2(0, 0)
self.pos = Vector2(pos)
def update(self):
# Subtract the pos vector from the mouse pos to get the heading,
# normalize this vector and multiply by the desired speed.
self.vel = (pg.mouse.get_pos() - self.pos).normalize() * 5
# Update the position vector and the rect.
self.pos += self.vel
self.rect.center = self.pos
# Rotate the image.
# `Vector2.as_polar` returns the polar coordinates (radius and angle).
radius, angle = self.vel.as_polar()
self.image = pg.transform.rotozoom(self.orig_image, -angle, 1)
self.rect = self.image.get_rect(center=self.rect.center)
def main():
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
all_sprites = pg.sprite.Group()
entity = Entity((100, 300), all_sprites)
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
all_sprites.update()
screen.fill((30, 30, 30))
all_sprites.draw(screen)
pg.display.flip()
clock.tick(30)
if __name__ == '__main__':
pg.init()
main()
pg.quit()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.