import pygame
import os
import random
import time
pygame.font.init()
pygame.init()
pygame.mixer.music.load(os.path.join("assets",
"BackgroundMusic.mp3"))
#游戏窗口
WIDTH, HEIGHT = 500,500
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shootergame")
#Player player
PLAYER_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_player.png"))
#Enemy players
EMS_1 = pygame.image.load(os.path.join("assets", "space_enemy_1R.png"))
EMS_2 = pygame.image.load(os.path.join("assets", "space_enemy_2R.png"))
EMS_3 = pygame.image.load(os.path.join("assets", "space_enemy_3R.png"))
EMS_4 = pygame.image.load(os.path.join("assets", "space_enemy_4R.png"))
#Asteroids
ASTEROID_1 = pygame.image.load(os.path.join("assets", "asteroid_1R.png"))
ASTEROID_2 = pygame.image.load(os.path.join("assets", "asteroid_2R.png"))
ASTEROID_3 = pygame.image.load(os.path.join("assets", "asteroid_3R.png"))
#Boss
BOSS = pygame.image.load(os.path.join("assets", "bossR.png"))
#Lasers
RED_LZ = pygame.image.load(os.path.join("assets", "red_laserR.png"))
GREEN_LZ = pygame.image.load(os.path.join("assets", "green_laserR.png"))
BLUE_LZ = pygame.image.load(os.path.join("assets", "blue_laserR.png"))
PURPLE_LZ = pygame.image.load(os.path.join("assets", "purple_laserR.png"))
BACKGROUND = pygame.transform.scale(pygame.image.load(os.path.join("assets", "bg.png")), (WIDTH,HEIGHT))
boost = False
boost_speed = 8
def score_write():
d = shelve.open('score.txt','w')
d['score'] = score
d.close()
def score_read():
d = shelve.open('score.txt')
score = d['score']
d.close()
def score_multiply():
if time <= 50:
score = score*10
if time <= 100 and time > 50:
score = score*5
if time <= 150 and time > 100:
score = score*3
if time <= 200 and time > 150:
score = score*2
if time > 200:
score = score
class ship:
def __init__(self, x,y, health=100):
self.x = 220
self.y = 450
self.health = health
self.player_img = None
self.laser_img = None
self.lasers = []
self.cool_down = 0
def draw(self, window):
window.blit(self.player_img, (self.x, self.y))
def get_width(self):
return self.player_img.get_width()
def get_height(self):
return self.player_img.get_height()
class Player(ship):
def __init__(self, x, y, health=100):
super().__init__(x,y, health)
self.player_img = PLAYER_SPACE_SHIP
self.laser_img = RED_LZ
self.mask = pygame.mask.from_surface(self.player_img)
self.max_health = health
class Em(ship):
COLOUR_MAP = {
"red": (EMS_1, RED_LZ),
"green": (EMS_2, GREEN_LZ),
"purple": (EMS_3, PURPLE_LZ),
"blue": (EMS_4, BLUE_LZ)
}
def __init__(self, x, y, colour, health=100):
super().__init__(x, y, health)
self.ship_img, self.laser_img = self.COLOUR_MAP[colour]
self.mask = pygame.mask.from_surface(self.ship_img)
def move(self,vel):
self.y += vel
def main():
run = True
FPS = 60
level = 1
hp = 2
boostspeed = 4
player_vel = 3
boost = player_vel + 5
main_font = pygame.font.SysFont("comicsans", 40)
clock = pygame.time.Clock()
pygame.mixer.music.play(loops=-1)
enemies = []
wave_length = 5
enemy_vel = 1
boost = 10
player = Player(300,650)
def redraw_window():
WINDOW.blit(BACKGROUND, (0,0))
hp_label = main_font.render(f"HP: {hp}", 1, (255,255,255))
level_label = main_font.render(f"Level: {level} ", 1, (255,255,255))
WINDOW.blit(hp_label, (10, 10))
WINDOW.blit(level_label, (WIDTH - level_label.get_width() - 10,10))
for enemy in enemies:
enemy.draw(WINDOW)
player.draw(WINDOW)
pygame.display.update()
while run:
clock.tick(FPS)
if len(enemies) == 0:
level += 1
wave_length += 5
for i in range(wave_length):
enemy = Em(random.randrange(50, WIDTH-10), random.randrange(-1500*level/5, -100), random.choice(["red","green","purple","blue"]))
enemies.append(enemy)
boost = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player.x - player_vel > 0:
player.x -= player_vel
if keys[pygame.K_RIGHT] and player.x + player_vel + player.get_width() < WIDTH:
player.x += player_vel
if keys[pygame.K_UP] and player.y - player_vel > 0:
player.y -= player_vel
if keys[pygame.K_DOWN] and player.y + player_vel + player.get_height() < HEIGHT:
player.y += player_vel
if keys[pygame.K_LSHIFT]:
boost = True
start = time.time()
if boost == True:
player_vel = boost_speed
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LSHIFT:
player_vel = 3
for enemy in enemies:
enemy.move(enemy_vel)
redraw_window()
main()
score_write()
尝试改变self.player_img = None to self.player_img = pygame.Surface((0, 0))在船舶类别中。另外,当您加载图像时,使用.convert or .convert_alpha()最后,例如img = pygame.image.load("image.png").convert_alpha()。它应该提高性能。