2021-06-07

s## Python 从入门到实践 游戏实现(详解)
第一次完整的做完一个游戏(深感Python的强大)(尽管积分系统没做全,之所以停下来,是想好好消化一下pygame的内容,自我感觉这本书适合入门python语言,但到开发的部分没有深究,下面我会尽力去解释它并且学习这个内容,当然,我的错误也希望大家勇敢指出。)
首先是主程序alien_invasion

import pygame

from setting import Settings
from ship import Ship
from alien import Alien
from pygame.sprite import Group
from game_states import GameStates
from button import Button
import game_functions as gf


def update(self):
    """平行移动外星人"""
    self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction
    self.rect.x = self.x


def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    play_button = Button(ai_settings, screen, "Play")
    stats = GameStates(ai_settings)
    the_ship = Ship(ai_settings, screen)
    bullets = Group()
    alien = Alien(ai_settings, screen)
    # 创建外星人群
    aliens = Group()
    gf.create_fleet(ai_settings, screen, the_ship, aliens)

    while True:
        gf.check_events(ai_settings, screen, stats, play_button, the_ship, bullets)
        if stats.game_active:
            the_ship.update()
            bullets.update()
            # 删除子弹,防止消耗内存
            gf.update_bullets(ai_settings, screen, the_ship, aliens, bullets)
            gf.update_aliens(ai_settings, stats, screen, the_ship, aliens, bullets)
        gf.update_screen(ai_settings, screen, stats, the_ship, aliens, bullets, play_button)


run_game()

从run_game开始
首先 pygame.init():
作用是初始化所有导入的pygame模块。如果模块失败,则不会引发异常,但如果成功且失败的总数将作为元组返回。您可以随时手动初始化单个模块,但pygame.init()初始化所有导入的pygame模块是一种方便的方法来启动所有内容。各个模块的init()函数会在失败时引发异常。您可能希望单独初始化不同的模块以加速您的程序或不使用您的游戏没有的东西。不止一次调用此init()是安全的:重复调用将不起作用。即使你有pygame.quit()所有模块也是如此。
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height)):
初始话要显示的窗口或屏幕
set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0)
size参数分别代表宽度和高度
flag参数控制您想要的显示类型。有几种类型可供选择,甚至可以使用位或操作符(管道“|”字符)组合多种类型。如果你传递0或没有标志参数,它将默认为软件驱动窗口。下面是你想要选择的显示标志
depth表示深度参数,通常最好不要传递深度参数。它将默认为系统的最佳和最快的颜色深度。如果你的游戏需要特定的颜色格式,你可以用这个参数来控制深度。Pygame将模拟不可用的颜色深度,这可能是缓慢的。
vsync=0通过将vsync参数设置为1,可以获得垂直同步的显示,但不能保证得到一个。该请求仅适用于使用pygame调用set_mode()。那么什么又是垂直同步呢?垂直同步就是单个象素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。垂直同步是一种让显示器延迟输入画面等待显卡渲染。垂直同步的作用就是显著减少游戏画面撕裂、跳帧,因为画面的渲染不是整个画面一同渲染的,而是逐行或逐列渲染的,能够让FPS保持与显示屏的刷新率相同。不过开了垂直同步之后,会引入极高的画面延迟。对于任何FPS游戏来说,我们都强烈建议关闭垂直同步,除非是真的发生了不能忍受的画面撕裂。

pygame.display.set_caption(“Alien Invasion”):
作用是改变这个窗口的名字,如果原来有名字,则改变原来的名字

play_button = Button(ai_settings, screen, “Play”):
play_button创建了一个按钮的实例。
而Button在class Button类里面

class Button():

def __init__(self, ai_settings, screen, msg):
    # 初始化按钮属性
    self.screen = screen
    self.screen_rect = screen.get_rect()
    self.width, self.height = 200, 50
    self.button_color = (0, 255, 0)
    self.text_color = (255, 255, 255)
    self.font = pygame.font.SysFont(None, 48)


    # 创建按钮的rect对象,使其居中
    self.rect = pygame.Rect(0, 0, self.width, self.height)
    self.rect.center = self.screen_rect.center

    # 按钮标签只需创建一次
    self.prep_msg(msg)

def prep_msg(self, msg):
    """将msg渲染为图像,并使其在按钮上居中"""
    self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
    self.msg_image_rect = self.msg_image.get_rect()
    self.msg_image_rect.center = self.rect.center

def draw_button(self):
    # 绘制一个用颜色填充的按钮,再绘制文本
    self.screen.fill(self.button_color, self.rect)
    self.screen.blit(s`

stats = GameStates(ai_settings)

the_ship = Ship(ai_settings, screen)
bullets = Group()
alien = Alien(ai_settings, screen)
# 创建外星人群
aliens = Group()
gf.create_fleet(ai_settings, screen, the_ship, aliens)
在我反复翻阅资料之后我发现一个神奇的网站,它写的更详细
https://www.pygame.org/docs/
真的,大家完全可以去这里寻求帮助

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YZzzz...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值