还是搞一个移动的太空背景吧,看着好看一点。
class BackGround:
def __init__(self, surface):
self.surface = surface
self.image1 = pygame.transform.scale(pygame.image.load(os.path.join('image', 'bg.png')), (WIDTH, HEIGHT))
self.image2 = pygame.transform.scale(pygame.image.load(os.path.join('image', 'bg.png')), (WIDTH, HEIGHT))
self.rect1 = self.image1.get_rect()
self.rect2 = self.image2.get_rect()
self.rect1.x = 0
self.rect1.y = 0
self.rect2.x = 0
self.rect2.y = - HEIGHT
def background_move(self):
self.surface.blit(self.image1, (self.rect1.x, self.rect1.y))
self.surface.blit(self.image2, (self.rect2.x, self.rect2.y))
self.rect1.y += 1
if self.rect1.top >= HEIGHT:
self.rect1.top = -HEIGHT
self.rect2.y += 1
if self.rect2.top >= HEIGHT:
self.rect2.top = -HEIGHT
背景移动起来啦,但是忘了设定游戏帧率FPS,移动太快了。同时再整理一下主循环结构:
1、修改游戏窗口的名字,名字里面实时显示时间帧率。
2、增加玩家得分,进入正式游戏后显示在游戏窗口左上角。
3、增加玩家飞机数量,初始设定为3,在玩家飞机数量为0时进入结束界面。
import sys
import os
import pygame
pygame.init()
screen_info_height = pygame.display.Info().current_h
HEIGHT = screen_info_height * 0.9
WIDTH = screen_info_height * 0.9 * 2 / 3
RED = (255, 0, 0)
WHITE = (0, 0, 0)
FPS = 60
game_window = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
running = True
state1 = True
state2 = False
level = 0
score = 0
life_number = 3
class BackGround:
def __init__(self, surface):
self.surface = surface
self.image1 = pygame.transform.scale(pygame.image.load(os.path.join('image', 'bg.png')), (WIDTH, HEIGHT))
self.image2 = pygame.transform.scale(pygame.image.load(os.path.join('image', 'bg.png')), (WIDTH, HEIGHT))
self.rect1 = self.image1.get_rect()
self.rect2 = self.image2.get_rect()
self.rect1.x = 0
self.rect1.y = 0
self.rect2.x = 0
self.rect2.y = - HEIGHT
def background_move(self):
self.surface.blit(self.image1, (self.rect1.x, self.rect1.y))
self.surface.blit(self.image2, (self.rect2.x, self.rect2.y))
self.rect1.y += 1
if self.rect1.top >= HEIGHT:
self.rect1.top = -HEIGHT
self.rect2.y += 1
if self.rect2.top >= HEIGHT:
self.rect2.top = -HEIGHT
def draw_text(surface, text, x, y, color, size):
font = pygame.font.Font(os.path.join('font', 'simkai.ttf'), size)
font_surf = font.render(text, True, color)
font_surf_rect = font_surf.get_rect()
font_surf_rect.x = x
font_surf_rect.y = y
surface.blit(font_surf, (x - font_surf_rect.width / 2, y))
def start_interface(surface):
if state1:
image1 = pygame.image.load(os.path.join('image', 'begin_button.png'))
image2 = pygame.image.load(os.path.join('image', 'exit_button0.png'))
else:
image1 = pygame.image.load(os.path.join('image', 'begin_button0.png'))
image2 = pygame.image.load(os.path.join('image', 'exit_button.png'))
rect1 = image1.get_rect()
rect1.x = WIDTH / 2 - rect1.width / 2
rect1.y = HEIGHT * 0.25
surface.blit(image1, (rect1.x, rect1.y))
rect2 = image2.get_rect()
rect2.x = WIDTH / 2 - rect2.width / 2
rect2.y = HEIGHT * 0.35
surface.blit(image2, (rect2.x, rect2.y))
draw_text(surface, '按Tab键选择菜单,按Enter键确认', WIDTH / 2, HEIGHT * 0.55, RED, 20)
def end_interface():
draw_text(game_window, 'GAME OVER', WIDTH / 2, 500, RED, 50)
def control():
global running, state1, state2, level
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_TAB:
state1, state2 = state2, state1
if event.key == pygame.K_RETURN and state1 and level == 0:
level = 1
if event.key == pygame.K_RETURN and state2 and level == 0:
running = False
def main():
background = BackGround(game_window)
while running:
control()
if life_number > 0:
if level == 0:
background.background_move()
start_interface(game_window)
if level == 1:
background.background_move()
draw_text(game_window, 'SCORE: ' + str(score), 70, 10, RED, 25)
draw_text(game_window, '第一关', WIDTH / 2, 300, RED, 30)
else:
background.background_move()
end_interface()
clock.tick(FPS)
pygame.display.set_caption('飞机游戏 ' + 'FPS: ' + '{0:0.2F}'.format(clock.get_fps()))
pygame.display.update()
pygame.quit()
sys.exit()
if __name__ == '__main__':
main()
基本的大框架大概就这样了吧,通过life_number控制游戏是否继续进行,通过level控制游戏关难度,难道要每一关都编写一个难度吗?下一步添加双方飞机及碰撞检测,继续完善,现有效果呈现: