文章目录
-
前言:
一、游戏框架
1.游戏文件的框架
2.素材文件的框架
二、完整代码展示
1.游戏文件的框架
2.素材文件的框架
3.效果展示
三、总结
前言:
一个游戏如何通过代码完成呢?作为初学者的我们,首先就是搭建一个大体的框架,将对象封装成类,再根据对象的特点,一步一步的完善对应的类,通过模块化的方式,制作游戏。
一、游戏框架
游戏和素材作为两个py文件,其中main函数在游戏文件中,并定义一个类来初始化和启动游戏,另一个素材文件用来承载与对象相关的类
1.游戏文件的框架
import pygame.sprite
from plane_sprites import *
class PlaneGame(object):
def __init__(self):
# 1,创建游戏窗口
# 2.创建游戏时钟
# 3.调用私有方法,创建精灵组
#4.设置定时器(敌机 1s 玩家 0.5s)
def start_game(self):
while True:
#刷新频率
#事件监测
#碰撞检验
#更新精灵
#更新画面
if __name__ == '__main__':
game = PlaneGame()
# 1.游戏初始化
game.__init__()
# 2.游戏开始
game.start_game()
2.素材文件的框架
import pygame
from pygame.locals import *
import random
#常量初始化
class GameSprite(pygame.sprite.Sprite):
def __init__(self, image_name, speed=1):
#调用父类的初始化方法
#定义对象的属性
pass
def update(self):
pass
class Background(GameSprite):
def __init__(self, is_bg1=False):
#调用父类的方法创建精灵(image/rect/speed)并加载背景图片
#判断背景图片,设置初始位置
pass
def update(self):
#调用父类的update
#判断背景移出屏幕,将背景放到屏幕上方
pass
二、完整代码展示
1.游戏文件的框架
代码如下(示例):
import pygame.sprite
from plane_sprites import *
class PlaneGame(object):
def __init__(self):
# 1,创建游戏窗口
self.screen = pygame.display.set_mode(SCREEN.size)
# 2.创建游戏时钟
self.clock = pygame.time.Clock()
# 3.调用私有方法,创建精灵组
self.__create_sprites()
#4.设置定时器(敌机 1s 玩家 0.5s)
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
pygame.time.set_timer(CREATE_PLAY_EVENT, 500)
def __create_sprites(self):
#创建背景精灵和精灵组
bg1 = Background()
bg2 = Background(True)
self.back_ground = pygame.sprite.Group(bg1, bg2)
#创建敌机精灵组
self.enemy_ground = pygame.sprite.Group()
#创建飞机精灵组
self.play = Play()
self.play_ground = pygame.sprite.Group(self.play)
def __event_handler(self):
for event in pygame.event.get():
if event.type == QUIT:
PlaneGame.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
enemy1 = ENEMY()
self.enemy_ground.add(enemy1)
elif event.type == CREATE_PLAY_EVENT:
self.play.fire()
key_pressed = pygame.key.get_pressed()
if key_pressed[K_LEFT]:
self.play.speed = -4
elif key_pressed[K_RIGHT]:
self.play.speed = 4
elif key_pressed[K_DOWN]:
self.play.speed = 3
elif key_pressed[K_UP]:
self.play.speed = -3
else:
self.play.speed = 0
def __check_collide(self):
#子弹与敌机碰撞检测
pygame.sprite.groupcollide(self.play.bullet_ground, self.enemy_ground, True, True)
#玩家与敌机碰撞检测
die = pygame.sprite.spritecollide(self.play, self.enemy_ground, True)
if len(die) > 0:
self.play.kill()
PlaneGame.__game_over()
def __update_sprites(self):
#背景
self.back_ground.update()
self.back_ground.draw(self.screen)
#敌机
self.enemy_ground.update()
self.enemy_ground.draw(self.screen)
#飞机
self.play_ground.update()
self.play_ground.draw(self.screen)
#子弹
self.play.bullet_ground.update()
self.play.bullet_ground.draw(self.screen)
@staticmethod
def __game_over():
pygame.quit()
exit()
def start_game(self):
while True:
#刷新频率
self.clock.tick(FRAME_RATE)
#事件监测
self.__event_handler()
#碰撞检验
self.__check_collide()
#更新精灵
self.__update_sprites()
#更新画面
pygame.display.update()
if __name__ == '__main__':
game = PlaneGame()
# 1.游戏初始化
game.__init__()
# 2.游戏开始
game.start_game()
2.素材文件的框架
代码如下(示例):
import pygame
from pygame.locals import *
import random
#常量初始化
SCREEN = pygame.Rect(0, 0, 480, 700)
FRAME_RATE = 60
CREATE_ENEMY_EVENT = USEREVENT
CREATE_PLAY_EVENT = USEREVENT+1
class GameSprite(pygame.sprite.Sprite):
def __init__(self, image_name, speed=1):
#调用父类的初始化方法
super().__init__()
#定义对象的属性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
self.rect.y += self.speed
class Background(GameSprite):
def __init__(self, is_bg1=False):
#调用父类的方法创建精灵(image/rect/speed)
super().__init__("./images/background.png")
#判断背景图片,设置初始位置
if is_bg1:
self.rect.y = -self.rect.height
def update(self):
#调用父类的update
super().update()
#判断背景移出屏幕,将背景放到屏幕上方
if self.rect.y >= SCREEN.height:
self.rect.y = -self.rect.y
class ENEMY(GameSprite):
def __init__(self):
#调用父类方法,并加载敌机图片
super().__init__("./images/enemy1.png")
#指定敌机初始位置
self.rect.bottom=0
max_x=SCREEN.width-self.rect.width
self.rect.x=random.randint(0,max_x)
#指定敌机初始速度
self.speed=random.randint(1,3)
def update(self):
#调用父类方法,保持垂直移动
super().update()
#判断敌机是否飞出屏幕,如果是,则删除敌机精灵
if self.rect.y >= SCREEN.height:
self.kill()
class Play(GameSprite):
#初始化
def __init__(self):
#加载飞机图片
super().__init__("./images/me1.png",1)
#定义飞机位置
self.rect.centerx=SCREEN.centerx
self.rect.bottom=SCREEN.bottom-120
#初始化子弹精灵组
self.bullet_ground=pygame.sprite.Group()
#更新
def update(self):
#飞机移动
if self.speed==4 or self.speed==-4:
self.rect.x+=self.speed
else:
self.rect.y+=self.speed
#边界设置
if self.rect.x<0:
self.rect.x=0
elif self.rect.x>SCREEN.width-self.rect.width:
self.rect.x=SCREEN.width-self.rect.width
def fire(self):
#创建子弹精灵
bullet=Bullet()
bullet.speed=-2
#设置精灵数量和位置
for i in (0, 1, 2):
bullet.rect.centerx=self.rect.centerx
bullet.rect.bottom=self.rect.y-i*20
#添加到精灵组
self.bullet_ground.add(bullet)
class Bullet(GameSprite):
def __init__(self):
#加载子弹图片,并设置速度
super().__init__("./images/bullet1.png",-2)
def update(self):
#调研父类方法,保持垂直移动
super().update()
if self.rect.bottom<0:
self.kill()
3.效果展示
总结
总体来说,制作游戏就是将对象封装成类,对象的数据和行为定义为类的属性和方法,并根据需要决定是否将其私有化(一般不希望用户获取的设为私有)。