自己倒腾漂亮的地图,像Fantansy Map (http://www.fantasticmaps.com/)用PS做地图教程太难学,于是乎果断放弃了。Inkarnate 是一个很好的选项
好在inkarnate艺术风格过硬,细节处理很好,十分钟就可以上手
**但是 ** free版本基本就是一个摆设
25美元的年费让我烦恼,虽可以导出图片,不能导出到自己的引擎
不愿花这笔钱,又想自己倒腾漂亮的地图,能不能用pyqt 实现基本的地图编辑功能,答案是能,而且代码量非常少(小于500行)
要求如下:
- 我要有一个可以自动缩放的大地图
- 元素可以按照isometric 或者 tile的格式进行正确叠放
- 界面上的任意sprite item都支持拖动,自定义显示顺序重排
- 支持任意数量的sprite items
- sprite item 分组预览等等
Sprite libraries素材按照用途分类
比如 decor small 包含的一些小部件,已经相当全面,如果自己有好的素材,亦可以自行添加,找这些图片已经要了我的老命了
sprite item 继承自 ImageGraphicItem,用于加载sprite item图片
class ImageGraphicItem(QGraphicsPixmapItem):
def __init__(self, filename ="",parent=None):
super().__init__(parent)
self.filename = filename
self.pix = QPixmap(filename)
self.width = self.pix.width()
self.height = self.pix.height()
self.setPixmap(self.pix) # 设置图元
self.setFlag(QGraphicsItem.ItemIsSelectable) # ***设置图元是可以被选择的
self.setFlag(QGraphicsItem.ItemIsMovable) # ***设置图元是可以被移动的
self.setFlag(QGraphicsItem.ItemIsFocusable)
在继承一个Scene(QGraphicsScene),一个View(QGraphicsView)
View 要支持 drag&drop ,需要对dragEnterEvent,dragMoveEvent,dropEvent三个函数进行override
def dragEnterEvent(self, event):
if event.mimeData().hasFormat(
"application/x-qabstractitemmodeldatalist"
):
event.acceptProposedAction()
def dragMoveEvent(self, event):
if event.mimeData().hasFormat(
"application/x-qabstractitemmodeldatalist"
):
event.acceptProposedAction()
def dropEvent(self, event):
sp = self.mapToScene(event.pos())
dummy_model = QStandardItemModel()
dummy_model.dropMimeData(
event.mimeData(), event.dropAction(), 0, 0, QModelIndex()
)
for r in range(dummy_model.rowCount()):
for c in range(dummy_model.columnCount()):
ix = dummy_model.index(r,c)
filename = ix.data()
item = ImageGraphicItem(filename)
item.setPos(sp)
self.scene().addItem(item)
self.update()
界面如下
操作说明:
从tiles中加载sprite item库,
右键:移动sprite item
中键:移动画布
鼠标滚轮:缩放画布
菜单里导入/导出
出一张跑团地图,可以素材是黑白的,效果不太亮眼,不过一切都是free的
说明
为了能运行本案例,请自行安装python环境 和相关依赖包,具体配置和安装在本文中不涉及也无需涉及,本案例不支大部分智能设备
算法未经严格优化,只为了说明算法的使用方法
本案例应用于非严肃领域,数值结果和算法探讨请@我,如需转载请注明