python/pygame飞机游戏边学边写(二)

还是搞一个移动的太空背景吧,看着好看一点。

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控制游戏关难度,难道要每一关都编写一个难度吗?下一步添加双方飞机及碰撞检测,继续完善,现有效果呈现:

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值