如何让Sprite围绕移动的另一Sprite旋转?Pygame开发求助
问题解决:让EnemiesStrong跟随Crucifix移动
问题根源很明确:你给EnemiesStrong初始化时只记录了Crucifix的初始中心位置,之后十字架移动时,敌人的旋转中心没有同步更新,所以只会绕着最初的点转圈。
下面是具体修改方案:
1. 修改EnemiesStrong的跟踪逻辑
把原来存储固定位置的逻辑,改成存储目标对象(十字架),这样每次都能获取它的实时位置:
class EnemiesStrong(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.original_image = pygame.image.load('image').convert_alpha() self.image = self.original_image self.rect = self.image.get_rect() self.angle = 0 # 改为接收目标对象而非固定位置 def initLoc(self, target, radius): self.target = target # 存储跟踪的十字架实例 self.radius = radius def update(self): # 每次获取目标的当前中心作为旋转原点 center = pygame.math.Vector2(self.target.rect.center) + pygame.math.Vector2(0, -self.radius).rotate(-self.angle) self.image = pygame.transform.rotate(self.original_image, self.angle) self.rect = self.image.get_rect(center = (round(center.x), round(center.y))) def turnLeft(self): self.angle = (self.angle + 4) % 360
2. 初始化时传入十字架实例
把原来传入固定位置的代码,改成传入十字架对象:
# 替换原来的enemy_s.initLoc(cross1.rect.center, 100) enemy_s.initLoc(cross1, 100)
完整修改后的代码
import pygame class Crucifix(pygame.sprite.Sprite): def __init__(self): super().__init__() self.sprite = pygame.image.load('image').convert_alpha() self.image = self.sprite self.rect = self.image.get_rect() self.rect.x =500 self.rect.y = 500 self.mask = pygame.mask.from_surface(self.image) def update(self): self.rect.x -= 2 if self.rect.x == -100: self.kill() class EnemiesStrong(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.original_image = pygame.image.load('image').convert_alpha() self.image = self.original_image self.rect = self.image.get_rect() self.angle = 0 def initLoc(self, target, radius): self.target = target self.radius = radius def update(self): center = pygame.math.Vector2(self.target.rect.center) + pygame.math.Vector2(0, -self.radius).rotate(-self.angle) self.image = pygame.transform.rotate(self.original_image, self.angle) self.rect = self.image.get_rect(center = (round(center.x), round(center.y))) def turnLeft(self): self.angle = (self.angle + 4) % 360 pygame.init() window = pygame.display.set_mode((800, 800)) clock = pygame.time.Clock() cross1= Crucifix() enemy_s = EnemiesStrong() enemy_s.initLoc(cross1, 100) all_sprites = pygame.sprite.Group(enemy_s) all_sprites.add(cross1) run = True while run: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False enemy_s.turnLeft() all_sprites.update() window.fill(0) all_sprites.draw(window) pygame.display.flip() pygame.quit() exit()
这样修改后,EnemiesStrong每次更新时都会获取Crucifix的当前中心位置,就能跟着十字架一起移动并绕其旋转了。
内容的提问来源于stack exchange,提问作者Daniel Tierney
相关产品推荐
相关产品推荐

