上回说到我们已经可以控制小方块的移动了,现在我们要把这个小方块放置到游戏场景里

剥去美术的外壳,游戏场景其实就是一个标记了玩家可行走与不可行走的空间

对于2D游戏,它是一个平面网格,3D游戏就是一个3维空间网格

我们先来看2D的情况:

首先我们用一个二维数组记录地图上所有像素坐标点(整数坐标点)的可行走与不可行走的信息

grid_map = [[0 for i in range(M)] for i in range(N)]

地图中的阻挡就是一块连续的不可行走区域

以最简单的矩形阻挡为例,我们定义一个类来描述一个阻挡:

class Block(object):

def __init__(self,x,y,w,h):

self.rect = Rect(x,y,w,h)

for i in range(y,y+h):

for j in range(x,x+w):

grid_map[i][j]=1

在构造函数中把二维数组中对应的元素标记为不可行走(0可行走,1不可行走)

这样我们每构造一个Block类的对象,就在地图上生成了一个阻挡

我们在地图初始化中创建所有的阻挡

def InitMap():

for i in range(N):

for j in range(M):

grid_map[i][j]=0#初始化地表,都是可行走

for i in range(0,M,50):#创建若干阻挡

b1 = Block(i,0,10,100)

b2 = Block(i,200,10,100)

b3 = Block(i,400,10,100)

block_list.append(b1)

block_list.append(b2)

block_list.append(b3)

如果绘制出来,将得到这样的一张地图,黑色的是可行走区域,灰色的表示阻挡块

二维地图.png

接下来我们再让这些阻挡能够真的影响玩家的移动

假设玩家出生时不会出生在阻挡里

那么我们只需要在表示玩家的矩形发生移动时,判断矩形边界上的点是否都在可行走区域即可

onblock = 0

#分别判断两条横边和两条竖边,tx,ty是矩形起始坐标点,20是默认边长

for i in range(tx,tx+20):

if(grid_map[ty][i] or grid_map[ty+19][i]):

onblock = 1

break

for i in range(ty,ty+20):

if(grid_map[i][tx] or grid_map[i][tx+19]):

onblock = 1

break

完整代码可以从这里获取

下面我们将把地图推广到3D空间

首先来感受一下游戏中会用到的3D地图的样子

3D地图.png

俯视图如下

俯视图.png

这是建模工具的展现方式。

我们在游戏里怎么通过2D视图来让玩家感受3D的空间呢?

重点来了,这也是这款游戏的核心玩点

玩家的主视角是当前高度的平面俯视图,通过地图的颜色来让玩家区分自己所处的地形:

地面:可自由移动(淡黄色表示)

阻挡:不可移动(灰色表示)

塌陷:走上去会下落到下一层,直到到达某一层的地面(黑色表示)

玩家可以自由切换到其他相邻高度,高度发生变化,平面俯视图也会相应变化

如图所示的一个空间区域(俯视图)

淡蓝色阻挡高度为1,深蓝色阻挡高度为2

地图.png

它在游戏中的表现如下,一共有3种不同的高度表现

20190124_154914.gif

现在我们用代码来实现这个空间

目前的版本不存在中空的“洞穴”,也就是说所有的阻挡如果存在,则一定是从第一层开始连续向上堆叠形成

在这个前提下我们就可以按下面的方式来定义一个空间内的阻挡:

a.在第一层的矩形投影

b.在空间上的高度H_block

而最后的活动空间,就是这些阻挡的“并集”以外的区域

class Block(object):

def __init__(self,x,y,w,h,lv):#构造函数的参数表示投影矩形(x,y,w,h),以及阻挡的高度lv

self.rect = Rect(x,y,w,h)

self.lv = lv

for k in range(lv):#遍历[0,lv-1]层

for i in range(y,y+h):

for j in range(x,x+w):

grid_map[k][i][j]=2#在[0,lv-1]层形成阻挡

for i in range(y,y+h):

for j in range(x,x+w):

if(0 == grid_map[lv][i][j]):#注意不能把已有的阻挡重算为平地

grid_map[lv][i][j]=1#在lv层形成地面

我们需要在屏幕上绘制出这3种地形:

障碍物:比当前高度(H_cur)高的阻挡(H_block>H_cur)

平地:等于当前高度的阻挡(H_block==H_cur)

塌陷区:没有阻挡的区域或阻挡高度小于当前高度(H_block

def DrawMap(lv):

if lv > H :

return

for b in block_list:

if(b.lv > lv):

pygame.draw.rect(screen, color2, b.rect)

elif b.lv == lv :

pygame.draw.rect(screen, color1, b.rect)

最后我们再来看怎么操作玩家移动

在当前高度的移动与二维平面的移动一致(在上一篇中已经有讲述)

所以只需要实现如何改变玩家的高度

我的设计是这样的:

按z键后开始浮空,并立即飞到上一层,浮空状态时走到塌陷区不会下落

按x键后取消浮空,下落到能到达的最高地面

所以可以这样定义一个玩家类:

class Robot(object):

def __init__(self):

self.x = 10

self.y = 10

self.z = 0

self.is_fly = 0#表示是否是浮空状态

再针对玩家的按键做对应的处理,就可以实现3维空间内的运动了

if (key_press[K_z]):

self.is_fly = 1

self.z += 1

elif (key_press[K_x]):

self.is_fly = 0

完整的代码可以从这里获取

python可以开发3d游戏吗_用python3从零开始开发一款烧脑射击游戏#3相关推荐

  1. python制作射击游戏_用python3从零开始开发一款烧脑射击游戏#2

    上回说到用pygame绘制一个静止的小方块,今天将会实现通过鼠标或者键盘来控制小方块的移动 在这之前,首先我们需要考虑一个问题: 我们怎样才会认为一个物体在运动?风动,幡动还是仁者心动? 小方块在屏幕 ...

  2. Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法

    Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法 首先,我们来看一下Arduino UNO开发板的具体引脚排列,如下图所示, 再了解一下三色RGB LED模块,如下图所示 ...

  3. 游戏原画设计HTML5模板是一款适合网页游戏原画设计作品展示的HTML5网站模板。

    游戏原画设计HTML5模板是一款适合网页游戏原画设计作品展示的HTML5网站模板.不仅仅是首页,二级页面,三级页面,登陆,购物车等,页面齐全 功能齐全  js+css+html (img,字体均有), ...

  4. python适合开发区块链吗_区块链入门开发语言选择 python适合开发区块链吗

    区块链用什么需要开发?在哪可以了解? 从现在各个公有链的使用情况来看,来一代的都是参考Bitcoin,使用C 开发,而新一代的区块链技术使用的语言则是Go,Python,C#和JavaScript.以 ...

  5. 开发实现物理加速度移动_《无限法则》开发经验分享:射击游戏的物理引擎应用和移动模拟...

    文/腾讯游戏学院 9月21日,由腾讯游戏学院举办的第三届TGDC(腾讯游戏开发者大会)在深圳举行.在大会的技术论坛中,<无限法则>服务器主程序唐骏以<无限法则>的项目经验为例, ...

  6. 开发app用户协议_兰州移动APP开发用户体验设计不应该做的事

    接着讲述关于移动APP开发的用户体验设计应该不做什么?以下是兰州东方商易的移动APP开发设计人员在处理APP开发的UX设计时应避免的一系列要点: 不要限制互动大多数移动APP开发设计者都建议您避免使用 ...

  7. 记事本贪吃蛇游戏代码_如何用Python10分钟绘制贪吃蛇小游戏?

    贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩.玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长.随着蛇的身体变长,游戏的难度就会 ...

  8. atari游戏模型_在Atari.com免费玩经典街机游戏

    atari游戏模型 The late 70's and early 80's was a golden age for video games. Arcades were a thriving hot ...

  9. xbox360游戏下载_如何在Xbox One上玩Xbox 360游戏

    xbox360游戏下载 Microsoft's Xbox One can now play a limited number of Xbox 360 games. But it's not as si ...

最新文章

  1. Spring Cloud 万字总结!
  2. 微型计算机的发展通常以为技术指标,计算机组成原理期末复习题.doc
  3. vb.net 线程偶尔不会自动关闭_C# 多线程系列(7)手动线程通知
  4. python3网上学习资源汇总
  5. C语言中不检查数组下标是否越界。
  6. oracle asm磁盘头 备份,ASM磁盘头的第三个备份-Physically Addressed Metadata Redundancy
  7. SQL Server中行列转换 Pivot UnPivot (转载)
  8. Asp.net基础概念之 事件
  9. 用Asp.net写自己的服务框架
  10. Exchange笔记之Exchange Server 2003前端后端部署
  11. 7月用户对快递服务问题申诉24978件 同比增长50.1%
  12. 神奇的go语言(高级应用)
  13. 在计算机操作系统中操作系统是处于应用软件,计算机操作系统应用试题与答案.pdf...
  14. C++ Primer 第5版 练习5.14
  15. 解决:RSA host key for [ip] has changed and you have requested strict checking.
  16. 【趣味科普】数学中的励志故事
  17. 预计销售额超20亿 长城汽车新能源购车节收获4万订单
  18. ganache命令行安装
  19. python3 psycopg2查询PostgreSQL返回字典
  20. el-table的自定义行高设置

热门文章

  1. Linux下 删除文件夹下的所有文件
  2. 美丽链——通过买套内衣读懂“区块链”?
  3. 小故事——巴比奇和他的计算机
  4. 一粒云盘v2.1发布
  5. 无人驾驶技术——Radar雷达
  6. Java实验——定义一个类,该类中包含以下几个方法(静态):实现两个字符串数组的逆序排序,输出结果为字符串数组;求两个整形数组的交集;求两个浮点型数组的并集;
  7. 微信搜一搜迈出新的一步,好戏来了
  8. 又被平均了?年度平均工资出炉,IT行业超14万元居首
  9. java调用bat脚本实现pppoe拨号_pppoe客户端自动拨号原理及实现
  10. 解决百度网盘二维码加载不出来问题