📄 editor.c
字号:
/*
MapEdit.c
地图编辑器
最后修改: 2007-06-19
*/
#include <stdio.h>
#include <bios.h>
#include "graph.h"
#include "mouse.h"
#include "char.h"
#include "map.h"
char g_byFlag=0; /* 1-地图已被修改, 0-地图未修改 */
char m_szPath[17]="maps\\"; /* 存储文件名 */
void TryDraw(int nX1, int nY1, int nX2, int nY2, char byValue) /* 画地图元素但不保存 */
{
int i, j;
for(i=nX1;i<=nX2;i++)
{
for(j=nY1;j<=nY2;j++)
{
DrawMapUnit(i, j, byValue);
}
}
Rect(nX1*8, nY1*8, nX2*8+7, nY2*8+7, YELLOW);
}
void Restore(int nX1, int nY1, int nX2, int nY2) /* 还原 TryDraw 所做 */
{
int i, j;
for(i=nX1;i<=nX2;i++)
{
for(j=nY1;j<=nY2;j++)
{
RestoreMapUnit(i, j);
}
}
DrawBase();
}
void RealDraw(int nX1, int nY1, int nX2, int nY2, char byValue) /* 保存更改 */
{
int i, j;
for(i=nX1;i<=nX2;i++)
{
for(j=nY1;j<=nY2;j++)
{
SetMap(i, j, byValue);
}
}
/* 老家 */
SetMap(29, 59, 0);
SetMap(30, 59, 0);
/* 玩家出生点 */
SetMap(26, 58, 0);
SetMap(26, 59, 0);
SetMap(27, 58, 0);
SetMap(27, 59, 0);
SetMap(32, 58, 0);
SetMap(32, 59, 0);
SetMap(33, 58, 0);
SetMap(33, 59, 0);
/* 敌方出生点 */
SetMap( 0, 0, 0);
SetMap( 0, 1, 0);
SetMap( 1, 0, 0);
SetMap( 1, 1, 0);
SetMap(29, 0, 0);
SetMap(29, 1, 0);
SetMap(30, 0, 0);
SetMap(30, 1, 0);
SetMap(58, 0, 0);
SetMap(58, 1, 0);
SetMap(59, 0, 0);
SetMap(59, 1, 0);
g_byFlag=1;
}
void ShowMsg(char szMsg[]) /* 显示提示信息 */
{
Box(488, 370, 631, 415, WHITE);
OutTextXY(491, 373, 628, 388, szMsg, BLUE, -1);
}
char GetPath() /* 等待用户输入文件名并获取 */
{
int key, i=0;
char ch, chr[2];
key=bioskey(0);
while(i<=12)
{
if(key==0x011b) /* ESC */
{
return 0;
}
else if(key==0x1c0d) /* Enter */
{
if(i>0) break;
}
else if(key==0x0e08) /* BackSpace */
{
if(i>0)
{
i--;
Box(491+i*8, 389, 506+i*8, 404, WHITE);
}
}
else
{
ch=key&0x00ff; /* 取低八位 */
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'||(ch>='0'&&ch<='9')||ch=='.'))
{
if(i<12){
m_szPath[i+5]=ch;
chr[0]=ch;
chr[1]='\0';
OutTextXY(491+i*8, 389, 506+i*8, 404, chr, BLUE, -1);
i++;
}
}
}
key=bioskey(0);
}
m_szPath[i+5]='\0';
return 1;
}
char SaveMap() /* 保存地图,保存成功 1, 未保存返回 0 */
{
FILE *temp;
int key;
ShowMsg("请输入文件名:");
if(GetPath()==0)
{
ShowMsg("取消保存");
return 0;
}
temp=fopen(m_szPath, "rb");
if(temp!=NULL)
{
fclose(temp);
ShowMsg("覆盖文件(Y/N)?");
key=bioskey(0);
while(key!=0x1559&&key!=0x1579&&key!=0x314e&&key!=0x316e)
{
key=bioskey(0);
}
if(key==0x314e||key==0x316e)
{
ShowMsg("取消保存");
return 0;
}
}
if(!WriteMap(m_szPath))
{
ShowMsg("保存失败");
return 0;
}
ShowMsg("保存成功");
g_byFlag=0;
return 1;
}
char AskSave() /* 询问是否保存, 保存成功或用户选择不保存返回 1, 其它情况返回 0 */
{
int key;
if(g_byFlag==0)
{
return 1;
}
ShowMsg("保存地图吗(Y/N)?");
key=bioskey(0);
while(key!=0x1559&&key!=0x1579&&key!=0x314e&&key!=0x316e)
{
key=bioskey(0);
}
if(key==0x314e||key==0x316e)
{
return 1;
}
else
{
return SaveMap();
}
}
void LoadMap() /* 打开地图文件并读入 */
{
FILE *p;
ShowMsg("请输入文件名:");
if(GetPath()==0)
{
ShowMsg("取消打开");
return;
}
if(ReadMap(m_szPath)==0)
{
ShowMsg("打开失败!");
return;
}
DrawMap();
ShowMsg(m_szPath);
g_byFlag=0;
}
void NewMap() /* 新建地图 */
{
int i, j;
for(i=0;i<60;i++)
{
for(j=0;j<60;j++)
{
SetMap(i, j, 0);
}
}
DrawMap();
RealDraw(28, 58, 28, 59, 1);
RealDraw(29, 58, 30, 58, 1);
RealDraw(31, 58, 31, 59, 1);
Restore(28, 58, 31, 59);
ShowMsg("新地图");
g_byFlag=0;
}
void Init() /* 初始化 */
{
InitGraph();
InstallMouse(0, 0, 479, 479);
OpenCharSet();
Box(480, 0, 639, 479, WHITE);
OutTextXY(497, 17, 640, 32, "请使用数字键选择", BLACK, -1);
OutTextXY(531, 33, 640, 48, "0 -->", BLACK, -1);
DrawMapUnit(72, 5, 0);
OutTextXY(531, 49, 640, 64, "1 -->", BLACK, -1);
DrawMapUnit(72, 7, 1);
OutTextXY(531, 65, 640, 80, "2 -->", BLACK, -1);
DrawMapUnit(72, 9, 2);
OutTextXY(531, 81, 640, 96, "3 -->", BLACK, -1);
DrawMapUnit(72, 11, 3);
OutTextXY(531, 97, 640, 112, "4 -->", BLACK, -1);
DrawMapUnit(72, 13, 4);
OutTextXY(513, 129, 640, 144, "鼠标左键:画图", BLACK, -1);
OutTextXY(513, 145, 640, 160, "鼠标右键:清除", BLACK, -1);
OutTextXY(513, 177, 640, 192, "增大尺寸: +", BLACK, -1);
OutTextXY(513, 193, 640, 208, "减少尺寸: -", BLACK, -1);
OutTextXY(513, 241, 640, 256, "新建地图: F1", BLACK, -1);
OutTextXY(513, 257, 640, 272, "保存地图: F2", BLACK, -1);
OutTextXY(513, 273, 640, 288, "打开地图: F3", BLACK, -1);
OutTextXY(513, 289, 640, 300, "退出程序: ESC", BLACK, -1);
OutTextXY(491, 417, 640, 432, "坦克大战地图编辑器", BLACK, -1);
OutTextXY(491, 433, 640, 448, "v1.0 final", BLACK, -1);
OutTextXY(491, 449, 640, 464, "作者:溪流", BLACK, -1);
NewMap();
}
int main()
{
int x=0, y=0;
int lx0, ly0, llastx=0, llasty=0, lx, ly;
int type=1, size=1, key;
Init();
while(1)
{
/* 鼠标操作 */
GetMousePosition(&x, &y);
lx=x/8;
ly=y/8;
if(lx>60-size)
{
lx=60-size;
x=480-8*size+1;
SetMousePosition(x, y);
}
if(ly>60-size)
{
ly=60-size;
y=480-8*size+1;
SetMousePosition(x, y);
}
if(GetButtonState(LBUTTON)==PRESSED&&GetButtonState(RBUTTON)==RELEASED)
{
RealDraw(lx, ly, lx+size-1, ly+size-1, type);
}
else if(GetButtonState(LBUTTON)==RELEASED&&GetButtonState(RBUTTON)==PRESSED)
{
RealDraw(lx, ly, lx+size-1, ly+size-1, 0);
}
if(lx!=llastx||ly!=llasty)
{
Restore(llastx, llasty, llastx+size-1, llasty+size-1);
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
llastx=lx;
llasty=ly;
}
/* 键盘操作 */
if(bioskey(1))
{
key=bioskey(0);
switch(key)
{
case 0x0d3d: /* + */
if(size<5)
{
size++;
if(lx>60-size)
{
lx=60-size;
x=480-8*size+1;
SetMousePosition(x, y);
}
if(ly>60-size)
{
ly=60-size;
y=480-8*size+1;
SetMousePosition(x, y);
}
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
llastx=lx;
llasty=ly;
}
break;
case 0x0c2d: /* - */
if(size>1)
{
size--;
Restore(llastx+size, llasty, llastx+size, llasty+size);
Restore(llastx, llasty+size, llastx+size, llasty+size);
Restore(llastx+size, llasty+size, llastx+size, llasty+size);
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
}
break;
case 0x0b30: /* 0 */
type=0;
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
break;
case 0x0231: /* 1 */
type=1;
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
break;
case 0x0332: /* 2 */
type=2;
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
break;
case 0x0433: /* 3 */
type=3;
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
break;
case 0x0534: /* 4 */
type=4;
TryDraw(lx, ly, lx+size-1, ly+size-1, type);
break;
case 0x3b00: /* F1 */
if(AskSave())
NewMap();
break;
case 0x3c00: /* F2 */
SaveMap();
break;
case 0x3d00: /* F3 */
if(AskSave())
LoadMap();
break;
case 0x011b: /* ESC */
if(AskSave())
{
CloseCharSet();
CloseGraph();
return 0;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -