当前位置: 首页 > news >正文

从零开始学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 = 120self.y = 120def update(self, moveCommandX, moveCommandY):self.x += moveCommandXself.y += moveCommandYclass 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 = Trueself.moveCommandX = 0self.moveCommandY = 0def processInput(self):self.moveCommandX = 0self.moveCommandY = 0eventList = pygame.event.get()for event in eventList:if event.type == pygame.QUIT:self.running = Falseelif event.type == pygame.KEYUP:if event.key == pygame.K_LEFT:self.moveCommandX = -8if event.key == pygame.K_RIGHT:self.moveCommandX = 8if event.key == pygame.K_UP:self.moveCommandY = -8if event.key == pygame.K_DOWN:self.moveCommandY = 8if event.key == pygame.K_ESCAPE:self.running = Falsedef 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()

http://www.xdnf.cn/news/88201.html

相关文章:

  • AI大模型-window系统CPU版安装anaconda以及paddle详细步骤-亲测有效
  • c++STL——stack、queue、priority_queue的模拟实现
  • JDK安装超详细步骤
  • c#操作excel
  • Codeforces Round 1019 (Div. 2)(A-D)
  • 【线段树】P10381 「HOI R1」杂赛选比|普及+
  • SpringbootWeb开发(注解和依赖配置)
  • Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例
  • 基于STM32、HAL库的MCP4018T数字电位器驱动程序设计
  • 第5章-1 优化服务器设置
  • 08_Docker Portainer可视化管理
  • Kafka 面试,java实战贴
  • Java中常见API的分类概述及示例
  • Spark集群搭建-spark-local
  • [Java · 铢积寸累] 数据结构 — 数组类型 - Arrays 工具类详解
  • 文献分享:不同抗体表位作图技术比较
  • 《计算机视觉度量:从特征描述到深度学习》—深度学习图像特征工程
  • 动态加载内容时selenium如何操作?
  • Kubernetes相关的名词解释etcdctl(20)
  • 鸿蒙移动应用开发--渲染控制实验
  • 【MCP Node.js SDK 全栈进阶指南】初级篇(2):MCP基础服务器开发
  • Python3中使用jupyter notebook
  • Vue2 el-checkbox 虚拟滚动解决多选框全选卡顿问题 - 高性能处理大数据量选项列表
  • 高性能服务器配置经验指南1——刚配置好服务器应该做哪些事
  • 字符串全排列(Java版本自己用)
  • SpringBoot3集成MyBatis-Plus(解决Boot2升级Boot3)
  • MQ底层原理
  • AI代表企业签订的合同是否具有法律效力?
  • 第一章-语言基础\2.竞赛常用库函数\其他库函数
  • AXOP33552: 400MHz 高速双通道运算放大器