从零开始学Python游戏编程33-指令模式2

《从零开始学Python游戏编程32-指令模式1》中提到的“移动矩形”游戏中,游戏数据(状态)与游戏界面都是在Game类中定义的,本着模块功能越简单越好的原则,可以将,游戏数据(状态)与游戏界面分离,即新创建一个表示游戏数据(状态)的类。

1 游戏数据(状态)类的创建

通过图1所示代码创建游戏数据(状态)类GameState。

图1  GameState的代码

其中,GameState类包含两个属性x和y,表示游戏状态,也就是矩形左上角的横纵坐标;该类还包含一个名为update()的方法,通过该方法对属性x和y进行更新,update()的方法的参数moveCommandX和moveCommandY分别是水平移动矩形和垂直移动矩形的指令。

2 游戏数据(状态)类的实例化

在游戏类Game的__init__()方法中实例化游戏数据(状态)类,如图2所示。

图2 游戏数据(状态)类的实例化

其中,gameState是游戏类Game的属性,表示游戏状态。

注意1 在游戏类Game中定义了gameState,则之前表示游戏状态的属性x和y的代码就可以删除了。

3 更新游戏数据

在Game类的render()方法中,使用图3所示的代码更新游戏数据。

图3 更新游戏数据的代码

其中,第47行代码通过gameState调用update()更新游戏数据,也就是更新gameState的属性x和y的值。

4 显示游戏数据

由于Game类中表示游戏数据的变量改为gameState,因此,Game类中显示游戏数据的属性render()代码也要相应发生变化,代码如图4所示。

图4 显示游戏数据的代码

主要变化在于第50-51行中通过pygame.draw.rect()函数绘制矩形时,矩形左上角坐标值改为self.gameState.x和self.gameState.y。

5 游戏完整代码

游戏完整代码如下所示。

import pygame
class GameState():
    def __init__(self):
        self.x = 120
        self.y = 120
    def update(self, moveCommandX, moveCommandY):
        self.x += moveCommandX
        self.y += moveCommandY
        
class Game():
    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((640, 480))
        pygame.display.set_caption('矩形移动游戏')
        pygame.display.set_icon(pygame.image.load('1.png'))
        self.clock = pygame.time.Clock()
        self.gameState = GameState()
        self.running = True
        self.moveCommandX = 0
        self.moveCommandY = 0
    def processInput(self):
        self.moveCommandX = 0
        self.moveCommandY = 0
        eventList = pygame.event.get()
        for event in eventList:
            if event.type == pygame.QUIT:
                self.running = False
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    self.moveCommandX = -8
                if event.key == pygame.K_RIGHT:
                    self.moveCommandX = 8
                if event.key == pygame.K_UP:
                    self.moveCommandY = -8
                if event.key == pygame.K_DOWN:
                    self.moveCommandY = 8
                if event.key == pygame.K_ESCAPE:
                    self.running = False
        
    def update(self):
        self.gameState.update(self.moveCommandX, self.moveCommandY)
    def render(self):
        self.window.fill((0,0,0))
        pygame.draw.rect(self.window, (0,0,255),
                           (self.gameState.x, self.gameState.y, 400, 240))
        pygame.display.update()
    def run(self):
        while self.running:
            self.processInput()
            self.update()
            self.render()
            self.clock.tick(60)
game = Game()
game.run()
pygame.quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值