pygame中用sprite来表示一个精灵,通常是一个可以绘制的对象。默认的框架是这样的:
class Player(pygame.sprite.Sprite):
#玩家的精灵
def __init__(self):
pygame.sprite.Sprite.__init__(self)
#convert 转换像素格式可以提高blit速度
self.image = pygame.image.load(os.path.join(img_folder,"p1_jump.png")).convert()
#将图片中和BLACK颜色相同的颜色值绘制成透明
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH/2,HEIGHT/2)
self.y_speed = 5
def update(self):
self.rect.x +=5
self.rect.y +=self.y_speed
if self.rect.bottom > HEIGHT - 200:
self.y_speed = -5
if < 200 :
self.y_speed = 5
if self.rect.left >WIDTH:
self.rect.right = 0
在其中init函数中我们会初始化它的图片、它的坐标,最重要的是把它具象化成一个rect,在update函数里我们会更新这个rect的坐标从而让这张图动起来。
在后续我们的running循环中,通过使用
all_sprites.update()
all_sprites.draw(screen)
来更新和绘制我们的精灵。当然画完所有东西不要忘记flip一下。
重点 代码规范问题
我们的代码需要有合理的结构才能让我们的项目更加的稳定,代码编写要尽量规范按照游戏代码的格式来写。
首先我们讲一下最简单的格式,两个文件,分别是main主文件和一个settings配置文件,都是py的。
settings:里面设置了窗口大小、FPS、定义颜色、图片、还有我们的小精灵class player等等。只要是定义类的东西大部分都放在这个文件里我们拿过来就可以直接使用。
main:里面包含一个大的Game类以及下面的代码:
g = Game() #创建game类
g.show_start_screen() #开始画面
while g.running: #运行
g.new()
g.run()
g.show_go_screen()
pg.quit() #退出关闭窗口
那么Game类又包含了以下几个函数:
1.init初始化函数:用来初始化,创建窗口、标题和时钟。
def __init__(self):
#初始化窗口
self.running = True
#创建窗口 并且初始化
pg.init()
pg.mixer.init() #音乐一类
self.screen = pg.display.set_mode((WIDTH,HEIGHT))
pg.display.set_caption("My game")
self.clock = pg.time.Clock()
2.new函数:开始一次游戏时候创建精灵组并且启动游戏触发run函数:
def new(self):
#开始一次新游戏
self.all_sprites = pg.sprite.Group()
self.run()
3.run函数:游戏已经被启动了,开始循环loop,在loop中确定循环速度、触发事件、更新、绘图。
def run(self):
#game loop
self.playing = True
while self.playing:
#确定循环速度 事件 更新 绘图
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
4.update函数:由run函数触发,更新一些需要更新的东西。
def update(self):
self.all_sprites.update()
5.events函数:run触发,处理所有的事件。包括你游戏关闭或者炸了。
def events(self):
#loop 中的event #检查事件 处理事件
for event in pg.event.get():
#检查是否关闭窗口
if event.type == pg.QUIT:
if self.playing:
self.playing = False
self.running = False
6.draw函数:run触发,用来绘制所有图像,别忘记要flip。
def draw(self):
self.screen.fill(BLUE)
self.all_sprites.draw(self.screen)
#画完所有的东西就要flip一下
pg.display.flip()
7.show_start_screen /show_go_screen:start显示初始画面不在loop中,go显示游戏画面在loop中。
ok,全部写完之后要在程序末尾pygame.quit()一下。这就是一个简单的框架了。