python - 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
解决方案
并非所有用于动画的帧看起来都具有相同的高度。为了弥补这一点,由于老鼠在地板上,您需要定义矩形 ( 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)
注意,如果动画帧大小不同或者老鼠在精灵上的位置发生变化,老鼠在游戏中的位置也会在动画期间发生变化。
推荐阅读
- azure - 您能否将应用服务日志或应用程序洞察日志摄取到 azure 事件中心
- c# - ObjectListView 在 SetObjects() 上抛出 InvalidCastException
- python - Teradataml:删除由 Teradata MLE 函数创建的所有临时表
- mysql - 如何确保单元测试原则正试图加载到与 dev 相同的数据库?
- azure - ACR 的 Azure 模块
- bash - 如何在bash中使用变量替换来回显字符串?
- github-actions - 带有分支过滤器的 GitHub Actions 标记过滤器
- android - api中需要的运行时权限小于23?
- amazon-elastic-beanstalk - 无法将 Route 53 上的子域分配给 Elastic Beanstalk 实例
- r - 我保存了一个 R 数据框,然后尝试立即加载它,但权限被拒绝