项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~

工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:812095339

1.游戏地图的组成

地图在游戏中是非常重要的一部分,几乎所有的游戏都有地图。比如梦幻西游中的长安城、建邺城、大雁塔等等都是游戏地图。

那么在我们的开发中,地图的组成部分有:

1.地图的背景图:一张完整的地图图片

2.地图的前景图:需要把人物遮挡住的地方

我们按照绘图顺序:画地图背景、画玩家、最后再画地图前景,这样就能将玩家遮挡住。

3.行走层数据:一个二维数组,将地图划分成一个个的小格子,记录着这些小格子是否可以行走。

就比如在我们的游戏开发中,将用32*32做为一个格子的大小。

上图是我很久以前做的地图编辑器,将地图划分成一个个小格子就是这个意思,这应该好理解了吧,黄色格子就是不可行走区域。

2.封装地图类

由于地图行走层就是一个二维数组(二维列表),所以我们先封装一个二维列表,方便以后的操作,core.py中增加:


class Array2D:"""说明:1.构造方法需要两个参数,即二维数组的宽和高2.成员变量w和h是二维数组的宽和高3.使用:‘对象[x][y]’可以直接取到相应的值4.数组的默认值都是0"""def __init__(self, w, h, default=0):self.w = wself.h = hself.data = []self.data = [[default for y in range(h)] for x in range(w)]def show_array2d(self):for y in range(self.h):for x in range(self.w):print(self.data[x][y], end=' ')print("")def __getitem__(self, item):return self.data[item]

创建Array2D对象就是创建一个宽和高为w、h的二维数组,其中show_array2d是在控制台打印二维数组的内容。

因为我们实现了__getitem__方法,所以可以直接用中括号对Array2D对象进行取值,比如

arr2d=Array2D(3,5)

arr2d[2][4]=666

接下来就是编写地图类了,上面我们已经分析过了,地图包括:背景图、前景图、行走数据。

那么构造一个地图对象就需要相应的图片surface和行走数据,core.py中增加:

class GameMap(Array2D):"""游戏地图类"""def __init__(self, bottom, top, x, y):# 将地图划分成w*h个小格子,每个格子32*32像素w = int(bottom.get_width() / 32) + 1h = int(top.get_height() / 32) + 1super().__init__(w, h)self.bottom = bottomself.top = topself.x = xself.y = ydef draw_bottom(self, screen_surf):screen_surf.blit(self.bottom, (self.x, self.y))def draw_top(self, screen_surf):screen_surf.blit(self.top, (self.x, self.y))def load_walk_file(self, path):"""读取可行走区域文件"""with open(path, 'r') as file:for x in range(self.w):for y in range(self.h):v = int(file.readline())self[x][y] = vself.show_array2d()

GameMap继承自Array2D,因为地图本身就是一个二维数组嘛。

构造方法里有四个参数,bottom和top是相应图片的surface,x,y是地图的绘图坐标。

draw_bottom和draw_top是绘制地图背景和地图前景的方法。

load_walk_file是加载地图行走区域的方法,用双for循环读取文件是因为当初写文件的时候,也是这样写入的,由于继承了Array2D,所以可以直接用self[x][y]。最后在控制台打印一下读取的地图二维数组。

3.看看效果

既然封装好了地图类,那我们简单使用一下,看看效果咋样:

在main.py的Game类中,修改一下代码:

    def __init_game(self):self.hero = pygame.image.load('./img/character/hero.png').convert_alpha()self.map_bottom = pygame.image.load('./img/map/0.png').convert_alpha()self.map_top = pygame.image.load('./img/map/0_top.png').convert_alpha()self.game_map = GameMap(self.map_bottom, self.map_top, 0, 0)self.game_map.load_walk_file('./img/map/0.map')

增加了一个game_map属性,也就是游戏地图对象。

再修改一下绘图的代码,看看效果:

    def update(self):while True:self.clock.tick(self.fps)# TODO:逻辑更新self.event_handler()# TODO:画面更新self.game_map.draw_bottom(self.screen_surf)Sprite.draw(self.screen_surf, self.hero, 100, 100, 0, 0)Sprite.draw(self.screen_surf, self.hero, 210, 120, 1, 1)Sprite.draw(self.screen_surf, self.hero, 300, 100, 2, 2)pygame.display.update()

我故意改了一下第二个精灵的位置,它竟然跑到房顶去了。

不过,别担心,是因为没有绘制前景图将角色挡住:

我们加一行代码就行了:

    def update(self):while True:self.clock.tick(self.fps)# TODO:逻辑更新self.event_handler()# TODO:画面更新self.game_map.draw_bottom(self.screen_surf)Sprite.draw(self.screen_surf, self.hero, 100, 100, 0, 0)Sprite.draw(self.screen_surf, self.hero, 210, 120, 1, 1)Sprite.draw(self.screen_surf, self.hero, 300, 100, 2, 2)self.game_map.draw_top(self.screen_surf)pygame.display.update()

本章完~

pygame网络游戏_4_1:人物行走_地图设计相关推荐

  1. pygame网络游戏_1:简介

    工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:812095339 1.文章简介 三年前,我和一位网友一起开发了一款网络游戏<间隙之间>.当初,只是想实现我的游戏梦, ...

  2. pygame的mask测试_作者:李兴球

    """ mask测试,mask就是膜或罩的意思,可以从一个图片创建一个mask,但要转换alpha的,否则就失去了意义. 我们可以想像给一个透明的图片覆一层膜,也就是ma ...

  3. pygame网络游戏_4_2:人物行走_角色移动效果

    项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~ 工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:81209533 ...

  4. pygame网络游戏_5_5:网络编程_游戏客户端【终章!】

    项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~ 1.本章效果 2.回顾 哎呀呀,好久没更新了,这几天一直在搞我的pygame新项目仙剑 ...

  5. pygame网络游戏_5_4:网络编程_设计通信协议

    1.回顾 之前,我们写了一个Connection的子类Player,简单的实现了deal_data方法去处理客户端发送过来的数据(也就是print了一下).那么,这一章我们就真正的来设计一套简单的客户 ...

  6. python pygame模块按键延迟_如何在python/pygame中延迟一件事情而不延迟其他事情?...

    最简单的方法是使用事件(无论如何都要检查事件)import pygame pygame.init() screen = pygame.display.set_mode((200, 200)) # ou ...

  7. python pygame模块按键延迟_用pygame做游戏时,用pygame.KEYDOWN来实现的按键控制“不灵敏”能怎么解决?...

    这样写就十分灵活了 就是每个按键添加了一个k变量来检测按键是否被按着. 每一对儿方向相对的按键加了一个f变量来记录两个按键谁最后按下的. speed=[x,y] for event in pygame ...

  8. pygame只能编写游戏_游戏框架搭建

    游戏框架搭建 目标 -- 使用 面相对象 设计 飞机大战游戏类 目标 明确主程序职责 实现主程序类 准备游戏精灵组 01. 明确主程序职责 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分 ...

  9. python的pygame库使用方法_[宜配屋]听图阁

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

最新文章

  1. 录屏 模拟器_Scrcpy-在电脑无缝操作手机 (投屏/录屏/免Root)
  2. 谷歌提议更改Istio指导委员会
  3. 【转】SASS用法指南
  4. python argparse nargs_Python | 使用argparse解析命令行参数
  5. 宏定义函数container_of的解释
  6. 分享10款常用的jQuery焦点图插件
  7. 学术论文写作的 paper、code 资源
  8. 机械--NX2007(UG)有限元分析教程2--装配体
  9. 扩展欧几里得算法推导
  10. VB DoEvents用法
  11. 支付宝小程序: h5跳转 小程序
  12. mysql error 1236_【MySQL】Got fatal error 1236原因和解决方法
  13. iOS 每日一记之———————————————仿QQ语音通话隐藏显示效果
  14. 小米手机通过USB连接MAC电脑
  15. JAMA Psychiatry:大脑发育过程中与注意和情绪变化相关的内在结构性的改变
  16. 2021Web前端中高级面试题复盘
  17. Pattern Recognition期刊投稿经验
  18. CodeForces 757 E.Bash Plays with Functions(积性函数+dp)
  19. 白盒测试方法之逻辑覆盖
  20. 深入理解 Proxy 和 Reflect-- JavaScript

热门文章

  1. 2D和3D游戏动作区分
  2. 打印机的系统是linux吗,Linux系统下打印机怎样配置?
  3. 处理Web端表格数据,华为、海信等企业为何都选择了SpreadJS?
  4. 财务软件的工资计算公式定义
  5. 「Redis开发与运维」读书笔记
  6. 5G+自动驾驶,效果拔群超乎想象!
  7. 视频教程-SQL入门教程-MySQL
  8. c语言程序设计第3版朱可立,C语言程序设计(第3版)
  9. 华为onu 调为交换机_华为MA5626配置成普通交换机的完整方法
  10. 第19课 微信小程序安装使用mpvue脚手架