前言
上一篇博客简单介绍了一下游戏的内容和文件构成,这次我们来看一下每一个类文件的内容。
在此之前我们还是需要先提一下生成屏幕(surface)的问题。
首先,我们使用setting(设置类)中设置好了的长宽数据创建了一个屏幕:
pygame.init()
ai_setting = setting()
screen = pygame.display.set_mode((ai_setting.screen_width, ai_setting.screen_height))
pygame.display.set_caption("Alien Invasion")
第一句话:初始化,相当于检查了一下pygame有什么问题。
然后是创建了一个设置类,因为需要使用里面的参数。(我们马上就会详细提到)
pygame.display.set_mode 方法能够创建一个窗口,其中必要参数为 元组,(宽度,长度),还有两个非必要的参数这里就没有使用。
pygame.display.set_caption 方法没什么,就是设置了一个窗口的标题,会显示在新生成窗口的上方。
这里我找到了一个总结了pygame.display一些方法的博客。
其他的类
这部分讲的主要是不能实现一个明确对象但又贯穿整体的类。
听着很玄乎,其实就是游戏的设置属性以及统计信息等数据。
setting
class setting():
def __init__(self):
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
"""飞船个数限制"""
self.ship_limit = 2
"""子弹设置"""
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullet_allowed = 3
self.bullet_width_big = 300
"""外星人设置"""
self.fleet_drop_speed = 10
self.fleet_direction = 1
"""游戏进阶"""
self.speedup_scale = 1.1
self.score_scale = 1.5
"""初始设定"""
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
self.alien_speed_factor = 1
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 1
self.alien_points = 50
def increase_sp(self):
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
self.alien_points = int(self.alien_points*self.score_scale)
设置类,没有传入参数。
在主函数中我们创建的设置类叫做 ai_setting
:
ai_setting = setting()
存储了一些对象的属性,比如:
- 外星人的下落速度,移动方向(移动方向是正负还是有一点讲究的,先放着以后会讲)
- 子弹的长宽,颜色和屏幕上允许的最多子弹个数(还有一个大子弹,是以后的添加项)
- 屏幕的长宽,以及背景颜色(这里我们采取的是灰色)
- 左上角的飞船个数(其实也就是你有几条命,这里注意有两个飞船但一共三条命)
- 游戏初始设定(为什么采用的是方法,后面提到)
- 游戏的进阶,也就是各种速度的提高以及外星人个体得分的提高率
这里面有两个方法。
第一个方法居然是 一些变量,同时我们可以看到在__init__中我们也将该方法作为一个属性。
这样我们就能在 创建变量的同时调用方法,进行初始化,同时也方便我们在游戏进行一半的时候进行初始化
(比如再来一局)
另一个方法实现的是在升阶的同时将飞船速度、子弹速度和外星人的左右移动速度加快,并且提高了外星人的分数
统计信息类
class GameStats():
"""跟踪游戏的统计信息"""
def __init__(self,ai_settings):
self.ai_settings = ai_settings
self.reset_stats()
self.game_active = False
self.high_score = 0
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
self.level = 1
在这里我们对游戏的状态进行控制,通过boolean型判断是否开始游戏。
同时我们还存储了得分、等级、最高分和剩下几条命(需要setting)。
和setting中重置速度和单个外星人的得分的想法相同,我们需要在重新开始的时候将一些数据重置,所以我们给出了一个方法。
实现一个对象的类
这部分介绍的是实现了一个对象的类,如外星人、飞船、子弹、按钮和计分板。
外星人
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""单个外星人的类"""
def __init__(self,ai_settings,screen):
"""初始化外星人并设置起始位置"""
super(Alien,self).__init__()
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('image/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
def update(self):
"""向右移动外星人"""
self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction
self.rect.x = self.x
def check_edge(self):
"""如果碰到边界,返回true"""
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left 0:
return True
对于外星人,我们是采用贴图的方式来实现的,所以我们需要先导入图片,然后在屏幕上找到一个位置来贴图。
在贴图的时候,py是将图片处理成一个矩形:
self.image = pygame.image.load('image/alien.bmp')
self.rect = self.image.get_rect()
这个rect有x、y坐标属性,center、centerx、centery居中属性,以及top、bottom、left、right对齐属性,
另外对于矩形来说,还有width和height。
由于我们的外星人有很多个,所以我们将外星人放置在了屏幕的左上角,后期再进行调整。
self.rect.x = self.rect.width
self.rect.y = self.rect.height
x、y坐标问题
我画一个图就懂了:
外星人的移动轨迹是左右移动,每当碰到左右边界就相反方向移动,同时向飞船靠近,对于单个飞船,我们给出了两个方法:
- 向右移动外星人
- 检测外星人是否碰到左右边界
不过随着波数的增加,外星人移动速度会变快(一级快1.1倍),此时我们原来的rect.x(只能存储int型)很明显就不够用了,
这时我们给出了self.x,用他来存储float型的x坐标,最终交给rect.x,实现功能。
另外外星人左右移动的过程中速度暂时是不变的,改变的只有方向,所以我们只需要改变x对速度的加减即可,
这也是当时将方向定义为int型的理由。
很明显外星人相关的事件是有很多的,为什么我只定义了一部分?
个人理解中,类中的方法一定是对于 单个对象实现的,比如飞船和外星人的碰撞、外星人被子弹打中,都是一个交互的事件,所以不适合放在外星人类中的;
对于外星人撞到了底端,其实我们也可以使用同样的方法,但是这里选择了另外一个结构。
我记得我说过外星人是有很多个的,但是类一次只能创建一个外星人,所以我们需要另外一个结构保存这些外星人,这里我们采取了pygame自带的精灵类:sprite,精灵模块中有一个Group结构,非常适合一个类创建多个对象的情况。
总结一下
这篇博客主要是对一部分的类进行讲解。
首先是两个不用来生成明确对象的类,设置类和统计数据类;
对于生成实际对象的类,这次只讲了一个alien类,剩下几个类也差不了太多。
Original: https://blog.csdn.net/rebortt/article/details/114848186
Author: 筱羊冰冰
Title: python实现外星人入侵——1.类的介绍上
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/783357/
转载文章受原作者版权保护。转载请注明原作者出处!