我试图编写一个简单的游戏来提高自己在 pygame 上的表现,我在代码中看不到任何问题,但是敌人的图像看起来很滞后,就像它有时会消失并在很短的时间内返回一样。我不认为这与我的硬件有关。它不止一个文件,它是多个相互导入的文件,所以我将它们全部放下。呃,顺便说一句,代码不是很短,由于字符限制,我无法发布整个代码,所以这是我可能遇到的问题。我也有关于 hit_sound 的声音延迟问题,我尝试减少缓冲区。不完全有效。
PS:下面可能有一些语法问题,可能是因为我复制粘贴了代码。原始代码中没有任何语法,因此如果您看到任何语法,请不要介意。
敌人类.py
import pygame, sys, random, warrior_class, main
class enemycl():
def __init__(self):
pygame.init()
self.enemy_skull_time = pygame.time.get_ticks()
self.enemy_skull_animation_delay_time = 50
self.ani_sayac_enemy_skull = 0
self.enemy_skull_former_move = 2
self.enemy_skull_move = self.enemy_skull_former_move
self.enemy_skull_move_time = pygame.time.get_ticks()
self.enemy_skull_move_time_delay = 100
self.enemy_skull_x = 100
self.enemy_skull_y = warrior_on_enemy.ground_level - 10
self.enemy_skull_look_right = True
self.push_count_max = 10
self.push_count = self.push_count_max
self.push_distance = 40
self.enemy_skull_max_hp = 100
self.enemy_skull_hp = self.enemy_skull_max_hp
enemy_animation_skull0 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0000.png')).convert_alpha()
enemy_animation_skull1 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0001.png')).convert_alpha()
enemy_animation_skull2 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0002.png')).convert_alpha()
enemy_animation_skull3 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0003.png')).convert_alpha()
enemy_animation_skull4 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0004.png')).convert_alpha()
enemy_animation_skull5 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0005.png')).convert_alpha()
enemy_animation_skull6 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0006.png')).convert_alpha()
enemy_animation_skull7 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0007.png')).convert_alpha()
enemy_animation_skull8 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0008.png')).convert_alpha()
enemy_animation_skull9 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0009.png')).convert_alpha()
enemy_animation_skull10 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0010.png')).convert_alpha()
enemy_animation_skull11 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0011.png')).convert_alpha()
enemy_animation_skull12 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0012.png')).convert_alpha()
enemy_animation_skull13 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0013.png')).convert_alpha()
enemy_animation_skull14 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0014.png')).convert_alpha()
enemy_animation_skull15 = pygame.transform.scale2x(pygame.image.load(
'assets/enemy_animation/floating_skull_enemy/style_A/PNG/frame0015.png')).convert_alpha()
self.enemy_animation_skull_dead = pygame.transform.scale2x(pygame.image.load('assets/enemy_animation/floating_skull_enemy/style_A/PNG/enemy_skull_dead.png'))
self.animation_list_enemy_skull = [
enemy_animation_skull0,
enemy_animation_skull1,
enemy_animation_skull2,
enemy_animation_skull3,
enemy_animation_skull4,
enemy_animation_skull5,
enemy_animation_skull6,
enemy_animation_skull7,
enemy_animation_skull8,
enemy_animation_skull9,
enemy_animation_skull10,
enemy_animation_skull11,
enemy_animation_skull12,
enemy_animation_skull13,
enemy_animation_skull14,
enemy_animation_skull15
]
self.enemy_skull_image = enemy_animation_skull0
self.enemy_skull_mask = pygame.mask.from_surface(self.enemy_skull_image)
self.warrior_mask = pygame.mask.from_surface(warrior_on_enemy.character_img)
self.iscolliding = False
def draw(self):
if self.enemy_skull_hp > 0:
self.enemy_skull_image = self.animation_list_enemy_skull[self.ani_sayac_enemy_skull]
if pygame.time.get_ticks() - self.enemy_skull_time >= self.enemy_skull_animation_delay_time:
if self.ani_sayac_enemy_skull < len(self.animation_list_enemy_skull) - 1:
self.ani_sayac_enemy_skull += 1
elif self.ani_sayac_enemy_skull >= len(self.animation_list_enemy_skull) - 1:
self.ani_sayac_enemy_skull = 0
self.enemy_skull_time = pygame.time.get_ticks()
if self.enemy_skull_look_right:
pass
elif not self.enemy_skull_look_right:
self.enemy_skull_image = pygame.transform.flip(self.enemy_skull_image, True, False)
if pygame.time.get_ticks() - self.enemy_skull_move_time >= self.enemy_skull_move_time_delay:
if self.enemy_skull_x <= 0 or self.enemy_skull_x >= 880:
self.enemy_skull_move = -self.enemy_skull_move
self.enemy_skull_former_move = self.enemy_skull_move
if self.enemy_skull_move > 0:
self.enemy_skull_look_right = True
elif self.enemy_skull_move < 0:
self.enemy_skull_look_right = False
self.enemy_skull_x += self.enemy_skull_move
elif self.enemy_skull_hp <= 0 and self.enemy_skull_look_right:
self.enemy_skull_image = self.enemy_animation_skull_dead
elif self.enemy_skull_hp <= 0 and not self.enemy_skull_look_right:
self.enemy_skull_image = pygame.transform.flip(self.enemy_animation_skull_dead,True,False)
pygame.draw.rect(main.maincm.window,(255,0,0),(735,25,200,25))
pygame.draw.rect(main.maincm.window, (0, 255, 0), (735+((self.enemy_skull_max_hp-self.enemy_skull_hp)*2), 25, self.enemy_skull_hp*2, 25))
main.maincm.window.blit(self.enemy_skull_image, (self.enemy_skull_x, self.enemy_skull_y))
pygame.display.update()
def game_loop(self):
self.draw()
self.warrior_rect = warrior_class.warriorc.character_img.get_rect(
topleft=(warrior_on_enemy.player_x, warrior_on_enemy.player_y))
self.enemy_skull_rect = self.enemy_skull_image.get_rect(
topleft=(self.enemy_skull_x, warrior_class.warriorc.ground_level - 10))
self.enemy_skull_mask = pygame.mask.from_surface(self.enemy_skull_image)
self.warrior_mask = pygame.mask.from_surface(warrior_on_enemy.character_img)
self.offset = (
(round(warrior_on_enemy.player_x - self.enemy_skull_x)), round((warrior_on_enemy.player_y - self.enemy_skull_y)))
self.iscolliding = self.enemy_skull_mask.overlap(self.warrior_mask, self.offset)
if self.push_count < self.push_count_max:
if not warrior_on_enemy.look_right:
self.enemy_skull_x -= self.push_distance/self.push_count_max
self.push_count += 1
elif warrior_on_enemy.look_right:
self.enemy_skull_x += self.push_distance / self.push_count_max
self.push_count += 1
warrior_on_enemy = warrior_class.animation()
enemy_on_enemy = enemycl()
主文件
import pygame
class display_class():
def __init__(self):
pygame.init()
pygame.mixer.init()
# Setting display.
self.window_width = 960
self.window_height = 540
self.window = pygame.display.set_mode((self.window_width, self.window_height))
self.clock = pygame.time.Clock()
pygame.display.set_caption('Warrior')
icon = pygame.image.load('Adventurer-1.5/Individual_Sprites/status/sword_shte/adventurer-swrd-shte-00.png')
pygame.display.set_icon(icon)
self.FPS = 75
maincm = display_class()
unit_collision.py
import pygame, enemy_class, main
pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()
hit_sound = pygame.mixer.Sound('assets/melee_sounds/Minecraft_Hit_-_Sound_Effect__143020_01032021.wav')
rect_color = (0,0,255)
collisiontime = pygame.time.get_ticks()
first_collide = 0
def collision():
global rect_color
global first_collide
if enemy_class.enemy_on_enemy.iscolliding:
if not enemy_class.warrior_on_enemy.isattacking and enemy_class.enemy_on_enemy.enemy_skull_hp > 0:
if first_collide < 1:
enemy_class.warrior_on_enemy.warrior_health -= 10
first_collide += 1
elif enemy_class.warrior_on_enemy.isattacking:
if first_collide < 1:
enemy_class.enemy_on_enemy.enemy_skull_hp -= 5
hit_sound.play(loops=0, maxtime=0, fade_ms=0)
enemy_class.enemy_on_enemy.enemy_skull_move = 0
enemy_class.enemy_on_enemy.push_count = 0
first_collide += 1
rect_color = (255, 0, 0)
else:
if not -enemy_class.enemy_on_enemy.enemy_skull_former_move <= enemy_class.enemy_on_enemy.enemy_skull_move <= enemy_class.enemy_on_enemy.enemy_skull_former_move or enemy_class.enemy_on_enemy.enemy_skull_move == 0:
enemy_class.enemy_on_enemy.enemy_skull_move = enemy_class.enemy_on_enemy.enemy_skull_former_move
rect_color = (0,0,255)
first_collide = 0
if False:
pygame.draw.rect(main.maincm.window,rect_color,enemy_class.enemy_on_enemy.warrior_rect,1)
pygame.draw.rect(main.maincm.window,rect_color,enemy_class.enemy_on_enemy.enemy_skull_rect,1)
pygame.display.update()
战士卡利斯提尔.py
import pygame, sys, warrior_class, enemy_class, main, unit_collision
warrior = warrior_class.animation()
enemy = enemy_class.enemycl()
while True:
enemy_class.warrior_on_enemy.game_loop()
enemy_class.enemy_on_enemy.game_loop()
unit_collision.collision()
main.maincm.clock.tick(main.maincm.FPS)