QT实现简单的2d游戏地图编辑器
我写的这个地图编辑器主要实现了用键盘配合鼠标点击屏幕,间接生成一个二维数组,再将这个二维数组写入到文件中的操作,以直观、方便地对二维数组进行更改,以用作2d游戏的地图数组。
该程序最多向数组中添加19种(0-18)不同的数据。
运行效果:
创建初始地图界面:
地图编辑界面:
将地图数据写入到文件后地图信息界面:
除基本功能外,在程序中还实现了在按下移动鼠标左键时添加数据、按下移动鼠标右键时删除数据、自定义地图大小、使用文件对话框选择要保存的文件路径、将地图文件另存为、查看当前地图信息的功能。
虽然这些功能看似很多,且拥有这些功能的编辑器已经可以将地图数据用在2d小游戏的地图上,但我知道,这些距离一个专业、商业的2d编辑器还有着很远的差距。即使将比较对象换做“成熟好用功能齐全的2d编辑器”,该程序依然差了很多。
比如可以缩放编辑界面大小功能、自定义数值对应自定义颜色功能、添加数值功能、添加图片代表数值功能、添加背景图功能、选区设置数值功能等,这些功能的实现都是很复杂的,也是现在的我没有办法做到的。
编译环境:
Windows Qt 5.9.0 Qt Creator 4.3.0
思路:
将鼠标坐标分为地图宽高相乘个格子的区域,结构数组存储所有格子的格子坐标和对应的数值的信息,鼠标在点击时,将该区域格子在结构数组中的信息根据当前所选键值改变,并将数组中的信息按照颜色对应关系绘制矩形和数字到界面上。
使用键盘的0-9键代表0-9的地图数组中的数值,a-i代表10到18的地图数组中的数值,鼠标右键代表预设的地图默认数值。
下面展示程序的主要代码,如果你想查看项目的所有代码,可以私信博主发给你。
代码:
MainWindow.h 创建初始地图界面类头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
MainWindow.cpp 创建初始地图界面类函数实现:
#include "MainWindow.h"
#include "ui_widget.h"
#include <QPushButton>
#include "mainfrom.h"
#include <QMouseEvent> //鼠标事件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置固定窗口大小
setFixedSize(900,600);
//设置标题
setWindowTitle("2d地图编辑器");
//监听确定按钮点击
connect(ui->pushButton,&QPushButton::clicked,[=](){
this->close(); //当前窗口关闭
//将文本框中的内容转换为数字传入新窗口对象构造函数中
MainFrom *from = new MainFrom(ui->lineEdit->text().toInt(), ui->lineEdit_2->text().toInt(), ui->lineEdit_3->text().toInt());
from->show(); //打开新窗口界面
});
}
Widget::~Widget()
{
delete ui;
}
mainfrom.h 地图编辑界面类头文件:
#ifndef MAINFROM_H
#define MAINFROM_H
#include <QMainWindow>
#include <QPainter> //画家类
#include <QLabel> //标签
#include <QMouseEvent> //鼠标事件
#include <Qvector> //动态数组
class MainFrom : public QMainWindow
{
Q_OBJECT
private:
//绘图事件
void paintEvent(QPaintEvent *);
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//键盘事件
void keyPressEvent(QKeyEvent *ev);
int MX = 0, MY = 0; //最大宽高
//创建标签控件
QLabel *lab = new QLabel(this);
int mi = 0, mj = 0; //用于循环和确定地图坐标
int key = 0; //用于控制绘制的物体的属性的键值
struct DataAttr //数据值和颜色结构
#ifndef MAINFROM_H
#define MAINFROM_H
#include <QMainWindow>
#include <QPainter> //画家类
#include <QLabel> //标签
#include <QMouseEvent> //鼠标事件
#include <Qvector> //动态数组
class MainFrom : public QMainWindow
{
Q_OBJECT
private:
//绘图事件
void paintEvent(QPaintEvent *);
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//键盘事件
void keyPressEvent(QKeyEvent *ev);
int MX = 0, MY = 0; //最大宽高
//创建标签控件
QLabel *lab = new QLabel(this);
int mi = 0, mj = 0; //用于循环和确定地图坐标
int key = 0; //用于控制绘制的物体的属性的键值
struct DataAttr //数据值和颜色结构