python游戏开发实战:行走系统之地图编辑器
一、运行效果
操作说明:
方向键控制地图移动
w键保存地图
r键读取地图
鼠标左键设置障碍
鼠标右键删除障碍
二、前言
之前呢,写过一个python的A星算法类(A星算法),运行结果只能在控制台查看,太不爽了。A星算法可是游戏里常用的寻路算法,当然是要结合游戏使用才过瘾。
所以,我打算写几篇关于2drpg行走系统开发的文章。
写行走系统之前,我们得有个地图编辑器。将地图行走层编辑保存为文件,然后在游戏里读取这个行走层文件。
三、开发思路
游戏中的地图其实就是一个二维数组,我们的地图编辑器只需要将这个二维数组相应位置的值改变就行了。我们可以人为规定map[x][y]==0的时候是可行走的,map[x][y]==1的时候是障碍。
所以,地图编辑器就是用来编辑这个二维数组,并且将它可视化。
在我写的这个简易的地图编辑器中,规定16*16个像素为一个格子,当然你完全可以改成其他尺寸。
四、核心算法
鼠标点下去的位置是如何与二维数组下标对应的呢?这就是本文的重点。
在解决一个问题之前,我们得理一理已知条件是什么,需要求什么。
已知:
map_x,map_y 地图绘图坐标,也就是地图图片的左上角相对于窗口的坐标。
mouse_x,mouse_y 鼠标在窗口中的坐标
求:
indexX,indexY 鼠标点击位置所对应的地图二维数组中的下标
如图所示:
绿色的是游戏地图,黑色的是游戏窗口,红色点是鼠标点击的位置。
那么,鼠标相对于地图的坐标是多少呢?
设mouse_map_x,mouse_map_y为鼠标相对于地图的坐标,如图:
显然mouse_map_x=mouse_x+(-map_x),但是为什么是加(-map_x)呢?因为map_x是相对于游戏窗口的坐标,所以它总是一个负数,所以加一个负号让它变成正数。
同理mouse_map_y=mouse_y+(-map_y)
那么我们所求的indexX,indexY就很容易计算出来了,上面说过了一个格子占16*16个像素。
所以:
indexX=int(mouse_map_x/16)
indexY=int(mouse_map_y/16)
ok啦,下面放上代码(源码里的命名和上述命名有所不同,还请大家注意啦)。
五、源码
"""为演示A星算法的实际用途,而专门开发的地图编辑器
"""
import pygameclass Array2D:"""说明:1.构造方法需要两个参数,即二维数组的宽和高2.成员变量w和h是二维数组的宽和高3.使用:‘对象[x][y]’可以直接取到相应的值4.数组的默认值都是0"""def __init__(self, w, h):self.w = wself.h = hself.data = [[0 for y in range(h)] for x in range(w)]def showArray2D(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]winSur = None # 窗口的surface
map2d = None # 地图的二维数组
mapImg = None # 地图的图片
x, y = [0, 0] # 地图当前绘图坐标
dirKeyState = [0, 0, 0, 0] # 下,上,右,左方向键状态,0没按下 1按下def init():global winSur, map2d, mapImgpygame.init()pygame.display.set_caption("地图行走层编辑器")winSur = pygame.display.set_mode((640, 480))mapImg = pygame.image.load('./images/btm_1_0.jpg')# 以16*16像素为一个可行走的格子map2d = Array2D(int(mapImg.get_width() / 16), int(mapImg.get_height() / 16))def writeMap():with open('./map01.map', mode='w', encoding='utf8') as file:file.write(str(map2d.data))print("保存地图成功!")def readMap():global map2dwith open('./map01.map', mode='r', encoding='utf8') as file:data = file.read()map2d.data = eval(data)map2d.w = len(map2d.data)map2d.h = len(map2d.data[0])print("读取地图成功!")def moveMap():"""移动地图:return:"""global x, ystep = 8if dirKeyState[0] == 1:y += stepif y + step > 0:y = 0if dirKeyState[1] == 1:y -= stepif y - step < -(mapImg.get_height() - 480):y = -(mapImg.get_height() - 480)if dirKeyState[2] == 1:x += stepif x + step > 0:x = 0if dirKeyState[3] == 1:x -= stepif x - step < -(mapImg.get_width() - 640):x = -(mapImg.get_width() - 640)def drawMap():"""绘制不可行走区域:return:"""for ty in range(map2d.h):for tx in range(map2d.w):if map2d[tx][ty] == 1:pygame.draw.rect(winSur, (255, 255, 255), (x + tx * 16 + 1, y + ty * 16 + 1, 14, 14), 1)def mainLoop():global dirKeyState, map2d# 相关参数while True:for event in pygame.event.get():if event.type == pygame.QUIT:exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:dirKeyState[0] = 1elif event.key == pygame.K_DOWN:dirKeyState[1] = 1elif event.key == pygame.K_LEFT:dirKeyState[2] = 1elif event.key == pygame.K_RIGHT:dirKeyState[3] = 1elif event.key == pygame.K_r:readMap() # 读取地图elif event.key == pygame.K_w:writeMap() # 保存地图elif event.type == pygame.KEYUP:if event.key == pygame.K_UP:dirKeyState[0] = 0elif event.key == pygame.K_DOWN:dirKeyState[1] = 0elif event.key == pygame.K_LEFT:dirKeyState[2] = 0elif event.key == pygame.K_RIGHT:dirKeyState[3] = 0elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos() # 获得当前鼠标坐标map_x = mouse_x + (-x)map_y = mouse_y + (-y)cell_x = int(map_x / 16)cell_y = int(map_y / 16)if pygame.mouse.get_pressed() == (1, 0, 0): # 鼠标左键按下map2d[cell_x][cell_y] = 1if pygame.mouse.get_pressed() == (0, 0, 1): # 鼠标左键按下map2d[cell_x][cell_y] = 0pygame.time.delay(32)# 逻辑更新moveMap()# 绘图更新winSur.blit(mapImg, (x, y))drawMap()pygame.display.flip()if __name__ == '__main__':init()mainLoop()
python游戏开发实战:行走系统之地图编辑器相关推荐
- 微信小游戏开发实战教程15-关卡编辑器的制作以及关卡分享功能的实现
微信小游戏开发实战系列的第15篇. 本节主要内容有游戏中的关卡编辑器的实现思路以及如何利用分享功能将自己制作的关卡与好友分享. 如果你没有任何的游戏开发经验,欢迎阅读我的"人人都能做游戏&q ...
- python游戏开发实战:三阶拼图
一.介绍 本篇文章将使用pygame开发一个拼图小游戏以使读者了解pygame游戏开发的大概流程. 游戏代码几乎没有任何封装,为的就是给读者呈现一个清晰的执行流程. 游戏截图: 二.游戏代码 1.需要 ...
- python游戏开发实战:酷跑游戏
一.游戏运行效果 二.简介 游戏操作: 跳跃:空格或继续游戏 前进:D 后退:A 这个项目是我为了快速熟悉pygame写来练手的.项目结构与代码组织方面还存在一些问题.我会在后续的文章中做出改进. 下 ...
- python游戏开发实战:网络游戏Demo(客户端)
一.运行效果 二.介绍 源码github:https://github.com/zxf20180725/pygame-online-demo.git 这只是一个简单的联网程序Demo,代码有很多不严谨 ...
- python游戏开发实战:梦幻西游背包系统
一.效果 整理背包演示 物品叠加演示 拖动窗口演示 二.源码 代码挺多的,我就不贴在博客里了,大家直接在百度网盘下载吧: 链接:https://pan.baidu.com/s/13CUF4cxtQBK ...
- python游戏开发实战:游戏按钮
一.效果 二.简介 游戏中,按钮是必不可少的控件.但是pygame并没有给我们提供相关的功能.那么只能自己写一个啦. 演示工程的下载地址:https://pan.baidu.com/s/1dCgCs8 ...
- python游戏开发实战:视频转彩色字符动画
一.效果 原图: 转换后: 效果可通过代码开头几行的参数调节 二.代码 开头几行代码,自己看着调整,把效果调到最佳就ok. 依赖库: pip install opencv-python pip ins ...
- 小学生python游戏开发pygame5--title地图调用
小学生python游戏开发pygame5--title地图调用 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 import log ...
- 适合python游戏开发的库你知道几个?
python游戏开发的库 01 PyGame 官网: https://www.pygame.org/docs/ 概述: Pygame 是一组专为编写视频游戏而设计的 Python 模块. 它在优秀的 ...
- 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)
文章目录 一.前言 二.实现方案 1.无主之地,第一人称视角 2.我之前做的摇杆控制 3.第一人称视角 + 摇杆控制 三.开始实战 1.资源获取:Unity AssetStore 2.Low Poly ...
最新文章
- jquery自动补全
- centos 对已有卷扩容_CentOS LVM 新加硬盘,扩容逻辑卷步骤
- Java学习笔记1.1.2 搭建Java开发环境 - 安装配置JDK
- 前端那些事之Nuxt.js
- jQuery中的join方法
- MySQL数据库定期自动备份(定时任务)
- 关于集训7教机房没网络 问题的解决方案
- 使用SpringBoot+RabbitMQ框架集成例程
- 关于南京市大学生办理住房补贴的流程示意图
- 从西洋跳棋开始机器学习
- Windows出现“未连接到互联网代理服务器出现问题,或者地址有误。问题解决办法”
- B2B企业做好SEM竞价推广的要点介绍
- Windows Server 2012 R2 Backup 裸机恢复
- Python利用hadoop Streaming编写的Map-Reduce程序命令运行和本地调试运行
- php eot 变量,在EOT内插入带有PHP变量的python代码
- oracle48108,​记一次oracle连接数暴涨hang分析经验
- [UOJ198][CTSC2016]时空旅行
- js中for-in的用法
- CF1341B Nastya and Door 题解
- CSDN邀您加入GitChat,让知识变现!
热门文章
- SpringBoot邮件发送
- 项目中使用docker部署xxl-job
- 2014年蓝桥杯预赛 C/C++本科B组 解题报告 史丰收速算
- .bat 常用命令
- struct files_struct和struct fdtable
- c++控制台游戏-小镇物语正式版 V1.7.2 [可存档!!!]
- 第1章 Python基础
- 上海计算机一级考试理论,上海市计算机一级考试理论部分(上).doc
- 13天Java进阶笔记-day11-网络编程和NIO
- Stata:数据包络分析(DEA)