请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 8342|回复: 5

pygame像素地图的实现

[复制链接]

25

主题

33

帖子

273

积分

中级会员

Rank: 3Rank: 3

积分
273
发表于 2020-1-27 05:51:22 | 显示全部楼层 |阅读模式
实现效果

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

实现地图类

初始化地图类

同上一篇博文讲过的,增加long、wide保存地图块的长宽,和transform2x是否将图片放大两倍,suf_m来保存原始的地图数据,suf_s用来保存绘制地图数据
  1.     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 = transform2X        self.image_l = long        self.image_h = wide        # 计算整体地图的长宽        length = len(self.map)        max_long = 1        for 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上
  1.     def print_map(self):        ci, ri = 0, 0        for 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 + 1            ci = ci + 1            ri = 0  # 初始化行标识            self.suf_s.blit(self.suf_m.copy(), (0, 0))
复制代码
设置地图的中心点

确认在地图中的一个不变的点,spirit是用来储存角色信息的对象,获取主角的x坐标和y坐标
  1.     # 根据位置初始化角色位置矢量    def __move__init__(self, spirit):        self.x0, self.y0 = spirit.x, spirit.y
复制代码
位移函数

尽量不要用scroll,不然会有bug(图片移动到边缘有拖影),这里计算移动后的角色与初始化角色的位移,然后用blit将suf_m显示到suf_s上。因为图片与人物的移动位置相反,所以带负号
  1.         # 位移函数    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)))
复制代码
开始移动

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

  • x不超过地图
  • y不超过地图
  • 位移后的不是墙壁
如果可以则返回更新后的角色的位置矢量,否则返回原本角色的位置矢量。
[code]# 向右/下移动一个单位为1,x,y为当前位置    def move(self, x, y, x_final, y_final):        if 0




上一篇:打雪仗的游戏
下一篇:2020年1月23日山师比赛题解
回复

使用道具 举报

0

主题

16

帖子

346

积分

中级会员

Rank: 3Rank: 3

积分
346
发表于 2020-2-3 20:21:51 | 显示全部楼层
我看不错噢 谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

22

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
发表于 2020-2-7 02:35:05 | 显示全部楼层
楼主,我太崇拜你了![www.12360.co]
社区不能没有像楼主这样的人才啊!
回复

使用道具 举报

0

主题

15

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
发表于 2020-2-11 00:42:03 | 显示全部楼层
感谢楼主的无私分享![www.12360.co]
回复

使用道具 举报

0

主题

14

帖子

304

积分

中级会员

Rank: 3Rank: 3

积分
304
发表于 2020-2-15 09:39:03 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

0

主题

7

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2020-2-17 22:19:56 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 21:59 , Processed in 0.091881 second(s), 24 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表