实现效果

绘制平面地图
按动键盘可以实现地图位置的移动(图片中的A保存相对不动)

实现地图类

初始化地图类

同上一篇博文讲过的,增加longwide保存地图块的长宽,和transform2x是否将图片放大两倍,suf_m来保存原始的地图数据,suf_s用来保存绘制地图数据

    def __init__(self, maps=[[0, 0], [0, 0]], long=72, wide=72, transform2X=True):# 用键值对保存图片信息"""用字典来保存图片位置<1 代表路面、草坪等可以通过的地方≥1且<2 代表墙面、等≥2 代表可以交互的地方"""self.dic = {0: "road", 0.1: "roadv", 0.101: "roadc1", 0.102: "roadc2", 0.103: "roadc3", 0.104: "roadc4"}# 放置地图self.map = maps# 是否放大两倍,图片的长、宽self.two_size = transform2Xself.image_l = longself.image_h = wide# 计算整体地图的长宽length = len(self.map)max_long = 1for i in range(length):if max_long < len(self.map[i]):max_long = len(self.map[i])# 用来保存原始的地图self.suf_m = pygame.Surface([self.image_h * max_long, self.image_l * length])self.suf_m.fill([255, 255, 255])# 用来显示地图self.suf_s = pygame.Surface([1080, 720])self.suf_s.set_colorkey([0, 0, 0])

绘制地图并更新

下面这个函数用于从地图中读取数据,根据字典读取图片并根据图片位置绘制地图更新到suf_m,最后将suf_m更新到suf_s

    def print_map(self):ci, ri = 0, 0for c in self.map:for r in c:# 根据字典按行绘制image = pygame.image.load(r"s\{}.png".format(self.dic[r]))# 放大图片if self.two_size:image = pygame.transform.scale2x(image)self.image_l, self.image_h = image.get_size()self.suf_m.blit(image, (ri * self.image_l, ci * self.image_h))ri = ri + 1ci = ci + 1ri = 0  # 初始化行标识self.suf_s.blit(self.suf_m.copy(), (0, 0))

设置地图的中心点

确认在地图中的一个不变的点,spirit是用来储存角色信息的对象,获取主角的x坐标和y坐标

    # 根据位置初始化角色位置矢量def __move__init__(self, spirit):self.x0, self.y0 = spirit.x, spirit.y

位移函数

尽量不要用scroll,不然会有bug(图片移动到边缘有拖影),这里计算移动后的角色与初始化角色的位移,然后用blitsuf_m显示到suf_s上。因为图片与人物的移动位置相反,所以带负号

 # 位移函数def center(self, x, y):# 清除旧的图片,x, y是移动后角色的位置self.suf_s.fill([255, 255, 255])# 图片移动的方向与人物相反self.suf_s.blit(self.suf_m, (- self.image_l * (x - self.x0), - self.image_h * (y - self.y0)))

开始移动

传入角色当前位置的信息、位移后的信息,判断位移是否能发生:

  1. x不超过地图
  2. y不超过地图
  3. 位移后的不是墙壁

如果可以则返回更新后的角色的位置矢量,否则返回原本角色的位置矢量。

# 向右/下移动一个单位为1,x,y为当前位置def move(self, x, y, x_final, y_final):if 0 <= y_final < len(self.map):if 0 <= x_final < len(self.map[y_final]):if self.map[y_final][x_final] < 1:self.center(x_final, y_final)return x_final, y_finalelse:return x, yelse:return x, yelse:return x, y

地图上的其他效果

下雨效果

在地图上随机绘制短线代表下雨

    def print_rain(self):for i in range(1000):xj, yj, lj = random.randint(0, 2160), random.randint(0, 1030), random.randint(0, 20)pygame.draw.line(self.suf_m, [255, 255, 255], (xj, yj), (xj, yj + lj), 1)self.suf_s.blit(self.suf_m, (0, 0))

夜晚/日出效果

设置一个透明图层,绘制有颜色的矩形更新到suf_m上,最后将suf_m绘制到suf_s

    def print_time(self, array=[255, 255, 255], alpha=50):# 设置一个表现时间的图层suf_night = pygame.Surface(self.suf_m.get_size())suf_night.set_alpha(alpha)# 绘制全屏矩形rect = self.suf_m.get_rect()pygame.draw.rect(suf_night, array, rect)# 绘制到显示图层上self.suf_m.blit(suf_night, (0, 0))self.suf_s.blit(self.suf_m, (0, 0))

白天和夜晚颜色不同

# 白天def print_night(self):self.print_time([255, 255, 255])# 夜晚def print_night(self):self.print_time([1, 2, 4])

pygame像素地图的实现相关推荐

  1. 中国分省份像素地图(HTML+JS 轻量级实现地图数据展示)

    中国分省份像素地图 想法由来 先看效果(东三省) 实现过程 ps上画个大概 看着这个图,编制js数据 HTML + JS 代码 相关数据文件 人口数据文件 data.js 像素描述文件:chinapi ...

  2. 像素地图生成工具帮助你快速生成精美地图

    在项目中,你可能会需要用到地图以更直观的展示和地域相关的一些信息.现在,借助 AmCharts 新工具--Pixel Map Generator,您可以在短短几分钟内创建出令人惊叹的视觉地图.并可以集 ...

  3. unity 创建自己的像素地图 TileMap

    首先在Hierarchy中右键创建TileMap:如图 然后创建瓦片Tile Palette 然后新建自己的瓦片 然后就可以将图片拖进来进行在tile map中绘画:但是拖入的图片必须按一定的格式,不 ...

  4. 使用柏林噪声随机创建像素地图

    主要参考:Unity中使用柏林噪声生成地图 using UnityEngine; using System.Collections; using System.Collections.Generic; ...

  5. 用pygame写像素游戏地图编辑器

    用pygame写像素游戏地图编辑器 像素游戏的地图 我使用一个矩阵来存储地图,像下面这样: [[1,0,0],[0,1,0],[1,2,0]] 不同的数字代表不同的物体,比如1代表一个房子,0代表路面 ...

  6. 制作html map工具,那些堪称神器的地图制作工具

    那些堪称神器的地图制作工具 早上好呀. 吟诗日日待春风,及至桃花开后却匆匆. 不知不觉,这个系列断断续续也已经第四期了,私藏本身也是依据个人经验总结来写的教程.技巧.信息文章,也是对自身阶段性的整理. ...

  7. mini game游戏像素画绘画课-1

    MINI GAME 游戏像素绘画-1 -欢迎参与琢玉组的游戏制作- 你好! 也许这是你第一次绘制游戏像素画.如果你想学习像素游戏中地图瓦片与基础物体的画法, 可以仔细阅读这篇文章.同时在文章的最后,会 ...

  8. 基于自监督网络的手部静脉无损三维测量

    论文来源:https://arxiv.org/ftp/arxiv/papers/1907/1907.00215.pdf 关键词:双目匹配 无监督 深度神经网络 手掌静脉 目前,基于深度神经网络的监督立 ...

  9. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

最新文章

  1. 矩阵快速幂+构造方法
  2. pycharm使用anaconda管理环境的设置实践
  3. ngx_lua模块中的共享内存字典项API
  4. OpenCV Mat数据类型像素操作
  5. Linux命令中的$()和${}的区别
  6. 三菱st语言编程实例_LD、FBD、IL、ST、SFC、CFC六种编程语言的特点
  7. 当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢
  8. Java中的对象、private关键字、this关键字、构造方法
  9. Android和Linux kernel发展史
  10. 近似推断---变分线性回归
  11. 判断当前js运行的平台环境 取自vue源码
  12. 高效办公,从几行批处理命令开始 | 原力计划
  13. android 编程输入系统时间,基于android和PC的时间事件记录实践
  14. 软件项目交付件模板整理清单
  15. Itext学习(一)----官方网站学习
  16. 如何使用AI绘制网格花卉?
  17. A*算法之野人传教士问题 python解法
  18. 稠密检索模型的zero-shot能力究竟如何?
  19. 【ERROR】Unable to open underlying table which is differently defined or of non-MyISAM type or ...
  20. 基带传输与频带传输(关系与区别)

热门文章

  1. 在线播放音乐AVPlayer的使用
  2. 工业机器人的控制算法
  3. PHP在线二维码生成API源码
  4. 《剑来》语句摘录(五)
  5. 初学前端,学习路线图必不可少,更有【95页】初级前端模块笔记!
  6. 若 PPP 协议使用同步传输技术,接收端收到的数据段中出现比特串“01011111001111101”,则真正的数据应该是()
  7. Linux_网络项目_WEB服务器 设计CGI机制,与CGI处理数据
  8. PHP isset() 和 empty() 的使用
  9. Matlab 基于遗传算法优化的VMD信号去噪算法 创新点:基于样本熵作为适应度函数
  10. “开放赋能”, 趣拿由“零售商”升级为“零售服务商”