You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:56:20