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

从零开始学Python游戏编程40-碰撞处理2

4 绘制防御塔

从图2中可以看出,防御塔实际上是图4中第2行第1列的图像与第7行第1列图像的组合,绘制防御塔的代码只需要将图5中绘制完整坦克代码中相应的行列坐标改为防御塔所需的行列坐标即可,在render()方法中。代码如图7所示。

图7 绘制防御塔的代码

其中,第82行和90行代码中的gameState.tower1Pos以及gameState.tower2Pos指定了防御塔的位置;第83行、第86行、第91行和第94行指定了绘制防御塔所需的图片。

5 碰撞处理

从图1中可以看出,玩家控制的坦克无法放在防御塔所在的方框中,以上功能通过GameState类的update()方法实现。

《从零开始学Python游戏编程38-精灵5》中提到的GameState类的update()方法中,根据控制指令修改玩家坦克的位置,还要对玩家坦克的位置超出游戏屏幕范围的情况进行处理。而加入碰撞处理的update()方法代码如图8所示。

图8 加入碰撞处理的update()方法代码

第22行代码创建newTankPos变量,其值为之前坦克的位置加上控制指令。newTankPos可以看作是坦克“理论上”的新位置,“理论上”的新位置指的是只有某些条件满足时,坦克才会出现在新位置上,第24-26行就指定了这些条件,包括坦克的位置必须在游戏窗口范围内,并且新位置不能在两个防御塔的位置上,满足以上条件,第27行才会将坦克的位置设置为新位置,否则坦克的位置不会改变。通过以上代码,完成了碰撞处理。

6 完整代码

碰撞处理的完整代码如下所示。

import os
import pygame
from pygame import Rect
from pygame.math import Vector2class GameState():def __init__(self):self.worldSize = Vector2(16,10)self.tankPos = Vector2(0,0)self.tower1Pos = Vector2(10, 3)self.tower2Pos = Vector2(10, 5)def update(self,moveTankCommand):newTankPos = self.tankPos + moveTankCommandif  newTankPos.x >= 0 and newTankPos.x < self.worldSize.x \and newTankPos.y >= 0 and newTankPos.y < self.worldSize.y \and newTankPos != self.tower1Pos and newTankPos != self.tower2Pos:self.tankPos = newTankPosclass UserInterface():def __init__(self):pygame.init()self.gameState = GameState()self.unitsTexture = pygame.image.load("units.png")self.cellSize = Vector2(64,64)windowSize = self.gameState.worldSize.elementwise() * self.cellSizeself.window = pygame.display.set_mode((int(windowSize.x),int(windowSize.y)))pygame.display.set_caption("移动坦克")self.moveTankCommand = Vector2(0,0)self.clock = pygame.time.Clock()self.running = Truedef processInput(self):self.moveTankCommand = Vector2(0,0)for event in pygame.event.get():if event.type == pygame.QUIT:self.running = Falsebreakelif event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:self.running = Falsebreakelif event.key == pygame.K_RIGHT:self.moveTankCommand.x = 1elif event.key == pygame.K_LEFT:self.moveTankCommand.x = -1elif event.key == pygame.K_DOWN:self.moveTankCommand.y = 1elif event.key == pygame.K_UP:self.moveTankCommand.y = -1def update(self):self.gameState.update(self.moveTankCommand)def render(self):self.window.fill((0,0,0))spritePoint = self.gameState.tankPos.elementwise()*self.cellSizetexturePoint = Vector2(1,0).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y),int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)texturePoint = Vector2(0,6).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y),int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)spritePoint = self.gameState.tower1Pos.elementwise()*self.cellSizetexturePoint = Vector2(0,1).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y), int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)texturePoint = Vector2(0,6).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y), int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)spritePoint = self.gameState.tower2Pos.elementwise()*self.cellSizetexturePoint = Vector2(0,1).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y), int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)texturePoint = Vector2(0,6).elementwise()*self.cellSizetextureRect = Rect(int(texturePoint.x), int(texturePoint.y), int(self.cellSize.x),int(self.cellSize.y))self.window.blit(self.unitsTexture,spritePoint,textureRect)pygame.display.update()    def run(self):while self.running:self.processInput()self.update()self.render()self.clock.tick(60)userInterface = UserInterface()
userInterface.run()pygame.quit()

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

相关文章:

  • ElementUi的tabs样式太难修改,自定义tabs标签页
  • 26考研 | 王道 | 数据结构笔记博客总结
  • Java并发编程面试题:并发工具类(10题)
  • WebUI可视化:第6章:项目实战:智能问答系统开发
  • 区间和数量统计 之 前缀和+哈希表
  • Qt基础009(HTTP编程和QJSON)
  • Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
  • AD盖白油(一面是板颜色,一面是白色丝印)
  • 数据库-子查询、关联查询 和 TCL 语言
  • 【HTTP/3:互联网通信的量子飞跃】
  • AI 编程工具:Augment Code
  • 影楼精修-手部青筋祛除算法解析
  • 2025年江西建筑安全员A证适合报考人群
  • 【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
  • Servlet小结
  • 【高中数学/古典概率】从1~2000中随机抽一个数,问取到的数既不被8整除,又不被12整除的概率是多少?
  • 鸿蒙-试一下属性字符串:除了Span之外,如何在同一个Text组件中展示不同样式的文字
  • ADVB协议同步
  • 破界出海:HR SaaS平台的全球化实践与组织效能跃升
  • 基于ssm的共享型汽车租赁管理系统(源码+数据库+万字文档+ppt)
  • cat查看当前目录下所有文件内容
  • 河北省大数据应用创新大赛样题
  • C++----模拟实现string
  • 力扣-234.回文链表
  • Linux查看可用端口号码命令
  • SIEMENS PLC程序解读 ST 语言 车型识别
  • PHP框架在微服务迁移中能发挥什么作用?
  • 【C/C++】从源码到执行:程序运行的完整生命周期解析
  • 神奇PG SQL数据库,配合简单代码就能巧妙实现复杂的功能
  • 专家系统的知识获取、检测与组织管理——基于《人工智能原理与方法》的深度解析