首页 > 解决方案 > Pygame动画居中问题

问题描述

视频

我不确定为什么我的攻击动画低于敌人的其他动画。每次它攻击它y似乎更低。我不知道为什么,即使我把它们都集中在一起。

player_rect = player_image.get_rect(center = self.get_rect().center)
player_rect.centerx += 0
player_rect.centery += -6
window.blit(player_image, player_rect)

我的敌人类:

class rat:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.upshot = [pygame.image.load("rawlk (" + str(i) + ").png").convert_alpha() for i in range(1, 12)]
        self.idle = [pygame.image.load("idle (" + str(i) + ").png").convert_alpha() for i in range(1, 21)]
        self.id = [pygame.image.load("id (" + str(i) + ").png").convert_alpha() for i in range(1, 21)]
        self.move2 = [pygame.image.load("walk (" + str(i) + ").png").convert_alpha() for i in range(1, 12)]

        self.att = [pygame.image.load("att (" + str(i) + ").png").convert_alpha() for i in range(1, 8)]
        self.at = [pygame.image.load("at (" + str(i) + ").png").convert_alpha() for i in range(1, 8)]
        
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.fps = 60
        self.clock = pygame.time.Clock()
        self.next_frame_time = 0
        self.anim_index = 0
        self.time = 0
        self.direction = "move"
        self.direction = "move2"

        self.direction = "idle"
        self.direction = "att"
        self.direction = "at"
        self.direction = "id"

        self.speed = 1
        self.image = pygame.image.load("ratso.png").convert_alpha()
        self.image2 = pygame.image.load("ratso2.png").convert_alpha() 
        self.font = pygame.font.Font("Gugi-Regular.ttf", 20)
        self.scoretext = self.font.render("Lv 1", True, (255,255,255))
        self.scorerect = self.scoretext.get_rect()
        self.scorerect.center = ((400,550))

        self.hitbox2 = (self.x - 47, self.y + 11, 169, 52) # NEW
        self.hitbox = (self.x + 17, self.y + 11, 129, 52) # NEW
        
    def get_rect(self):
        self.rect.topleft = (self.x,self.y)
        return self.rect
         



    def draw(self):
        self.rect.topleft = (self.x,self.y)
        if self.direction == "move":
            self.clock.tick(self.fps)
            image_list = self.upshot

        elif self.direction == "idle":
            self.clock.tick(self.fps)
            image_list = self.idle

        elif self.direction == "id":
            self.clock.tick(self.fps)
            image_list = self.id

        elif self.direction == "move2":
            self.clock.tick(self.fps)
            image_list = self.move2


        elif self.direction == "att":
            self.clock.tick(self.fps)
            image_list = self.att

        elif self.direction == "at":
            self.clock.tick(30)
            image_list = self.at
                        
        time_now = pygame.time.get_ticks()
        if (time_now > self.next_frame_time):
            # Time until the next game
            inter_time_delay = 2500 // self.fps
            self.next_frame_time = time_now + inter_time_delay
            # Showing next frame
            self.anim_index += 1
            if self.anim_index >= len(image_list):
                self.anim_index = 0
 
        if self.anim_index >= len(image_list):
            self.anim_index = 0
            
        player_image = image_list[self.anim_index]



        self.hitbox = (self.x, self.y + 30, 46,60)

        # --------------------------------------------------------------------- center all of them
        player_rect = player_image.get_rect(center = self.get_rect().center)
        player_rect.centerx += 0
        player_rect.centery += -6
        window.blit(player_image, player_rect)

     # --------------------------------------------------------------------- center all of them

        window.blit(self.scoretext,(self.x + 15,self.y - 50))
        self.hitbox2 = (self.x - 190, self.y - 22, 159, 40) # NEW
        self.hitbox = (self.x + 80, self.y - 22, 159, 40) # NEW

标签: pythonpygame

解决方案


并非所有用于动画的帧看起来都具有相同的高度。为了弥补这一点,由于老鼠在地板上,您需要定义矩形 ( midbottom) 的底部,而不是中心:

player_rect = player_image.get_rect(center = self.get_rect().center)

player_rect = player_image.get_rect(midbottom = self.get_rect().midbottom)
window.blit(player_image, player_rect)

注意,如果动画帧大小不同或者老鼠在精灵上的位置发生变化,老鼠在游戏中的位置也会在动画期间发生变化。


推荐阅读