配套视频教程
本节最终效果
这个游戏大致玩法就是和超级玛丽差不多,可以不停在各个档板上跳动,同时受到重力的作用,会向下掉,如果落下时,没有站在档板上,就输了。
我们加入重力因素,继续改造sprites.py
Player在update中,acc加速度初始化时,引入了垂直方向的加速度
碰撞后,方块底部要停在档板上,所以要改成rect.midbottom
新增档板类(sprites.py)
新建了一个Platform类,用来模拟档板,其实就是一个绿色的长矩形条
class Platform(pg.sprite.Sprite): def __init__(self, x, y, w, h): pg.sprite.Sprite.__init__(self) self.image = pg.Surface((w, h)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y
main.py创建2个挡板,其中一个宽度和窗口等宽的相当于地面
update方法中,进行碰撞检测
最终效果
完整代码:
main.py
import pygame as pg import random from settings import * from sprites import * class Game: def __init__(self): # initialize game window, etc pg.init() pg.mixer.init() self.screen = pg.display.set_mode((WIDTH, HEIGHT)) pg.display.set_caption(TITLE) self.clock = pg.time.Clock() self.running = True def new(self): # start a new game self.all_sprites = pg.sprite.Group() self.platforms = pg.sprite.Group() self.player = Player() self.all_sprites.add(self.player) p1 = Platform(0, HEIGHT - 40, WIDTH, 40) self.all_sprites.add(p1) self.platforms.add(p1) p2 = Platform(WIDTH / 2 - 50, HEIGHT * 3 / 4, 100, 20) self.all_sprites.add(p2) self.platforms.add(p2) self.run() def run(self): # Game Loop self.playing = True while self.playing: self.clock.tick(FPS) self.events() self.update() self.draw() def update(self): # Game Loop - Update self.all_sprites.update() hits = pg.sprite.spritecollide(self.player, self.platforms, False) if hits: self.player.pos.y = hits[0].rect.top self.player.vel.y = 0 def events(self): # Game Loop - events for event in pg.event.get(): # check for closing window if event.type == pg.QUIT: if self.playing: self.playing = False self.running = False def draw(self): # Game Loop - draw self.screen.fill(BLACK) self.all_sprites.draw(self.screen) # *after* drawing everything, flip the display pg.display.flip() def show_start_screen(self): # game splash/start screen pass def show_go_screen(self): # game over/continue pass g = Game() g.show_start_screen() while g.running: g.new() g.show_go_screen() pg.quit()
sprites.py
import pygame as pg import random from settings import * from sprites import * class Game: def __init__(self): # initialize game window, etc pg.init() pg.mixer.init() self.screen = pg.display.set_mode((WIDTH, HEIGHT)) pg.display.set_caption(TITLE) self.clock = pg.time.Clock() self.running = True def new(self): # start a new game self.all_sprites = pg.sprite.Group() self.platforms = pg.sprite.Group() self.player = Player() self.all_sprites.add(self.player) p1 = Platform(0, HEIGHT - 40, WIDTH, 40) self.all_sprites.add(p1) self.platforms.add(p1) p2 = Platform(WIDTH / 2 - 50, HEIGHT * 3 / 4, 100, 20) self.all_sprites.add(p2) self.platforms.add(p2) self.run() def run(self): # Game Loop self.playing = True while self.playing: self.clock.tick(FPS) self.events() self.update() self.draw() def update(self): # Game Loop - Update self.all_sprites.update() hits = pg.sprite.spritecollide(self.player, self.platforms, False) if hits: self.player.pos.y = hits[0].rect.top self.player.vel.y = 0 def events(self): # Game Loop - events for event in pg.event.get(): # check for closing window if event.type == pg.QUIT: if self.playing: self.playing = False self.running = False def draw(self): # Game Loop - draw self.screen.fill(BLACK) self.all_sprites.draw(self.screen) # *after* drawing everything, flip the display pg.display.flip() def show_start_screen(self): # game splash/start screen pass def show_go_screen(self): # game over/continue pass g = Game() g.show_start_screen() while g.running: g.new() g.show_go_screen() pg.quit()