瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。

 

左边是游戏地图编辑区,右边是地图缓冲区,解决了地图缓冲区拖动bug,成功使得缓冲区可以更新。

AWSD进行移动

鼠标左右键分别是绘制/拖动

按F1健导出为mapv3.txt

F2清空数组

打印的是游戏数组

easyx开发devcpp 5.11 easyx20220922版本

#include <graphics.h>
#include <stdio.h>
#define ROW 150						// 游戏地图行 
#define COLUMN 150					// 游戏地图列 
//#define ROW 20						// 游戏地图行
//#define COLUMN 20					// 游戏地图列
#define PIXNUM 30						// 一个瓦片边长为 30 像素 
#define SHOWSIZE 10						// 一个视口边长为 5 个瓦片 
#define BUFFERSIZE 3					// 地图缓冲区边长 3 个视口 
#define SHOWSPEED 4						// 游戏地图背景移动速度 
#define SHOWX 300						// 游戏显示区域 
#define SHOWY 300
typedef struct area {
	int lx;								// 左上角坐标
	int ly;
	int rx;								// 右上角坐标
	int ry;
	int high;							// 高度
	int wide;
} area;

typedef struct checkBackgroundBuffer {	// 用于记录缓冲条件的临界数据
	int xmin;
	int ymin;
	int xmax;
	int ymax;
	int adjust;
} bklimit;

typedef struct background {				// 游戏地图背景
	area gamepos;						// 采样区相对于缓冲区的坐标
	area deskpos;						// 改 bug 整理得到一个新结构体,把窗口坐标封装了
	int nowpointx;						// 在整个地图数组映射形成的地图上的坐标
	int nowpointy;
	IMAGE *gamebk;
} bk;

typedef struct backgroundBuffer {							// 游戏背景缓冲区
	area meshpos;
	int meshrow;
	int meshcolumn;
	bklimit bufferlimit;
	IMAGE *mapmesh;											// 缓冲区,长宽各为 3*size*a 个像素
} bkbuffer;
int map[ROW][COLUMN]= {0};
//int map[ROW][COLUMN]= {
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//
//	{0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,1,0,0, 0,0,2,0,2, 0,0,0,0,0},
//	{0,0,0,0,0, 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0,0},
//	{0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0},
//};

int pixnum=PIXNUM;											// 瓦片的大小正方形像素瓦片的边长
int showsize=SHOWSIZE;
int buffersize = BUFFERSIZE;
bk bkgd;													// background
bkbuffer bkgdbu;											// backgroundbuffer
IMAGE b(3*showsize*pixnum,3*showsize*pixnum);				// mapmesh 缓冲区
IMAGE a(showsize*pixnum,showsize*pixnum);					// 采样区,采样的到的图片就是屏幕上的游戏
// 清除地图
void clearmap();
// 保存编辑完的地图
void savemap();
//读取txt字符表格作为背景数组
void loadmap();
//检测背景是否需要更新
bool buchange() {
	bool changeflag=0;
	while(bkgd.gamepos.lx>bkgdbu.bufferlimit.xmax) {		// if else if变 while 解决鼠标拖动,导致的多次平移问题
		bkgd.gamepos.lx-=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.lx+=showsize;
		changeflag=1;
		printf("死循环\n");
	}
	while(bkgd.gamepos.lx<bkgdbu.bufferlimit.xmin) {
		bkgd.gamepos.lx+=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.lx-=showsize;
		changeflag=1;
	}
	while(bkgd.gamepos.ly>bkgdbu.bufferlimit.ymax) {
		bkgd.gamepos.ly-=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.ly+=showsize;
		changeflag=1;
	}
	while(bkgd.gamepos.ly<bkgdbu.bufferlimit.ymin) {
		bkgd.gamepos.ly+=bkgdbu.bufferlimit.adjust;
		bkgdbu.meshpos.ly-=showsize;
		changeflag=1;
	}
	return changeflag;
}
//刷新背景缓冲区
void freshbuffer() {
	SetWorkingImage(bkgdbu.mapmesh);							// 选择缓冲区为更新对象
	for(int i=0; i<bkgdbu.meshrow; i++) {
		for(int j=0; j<bkgdbu.meshcolumn; j++) {
			switch (map[i+bkgdbu.meshpos.ly][j+bkgdbu.meshpos.lx]) {	// 解决x坐标与数组的对应关系 第二个方括号【】是列数,是横坐标x,控制第几列
				case 0:
					setfillcolor(BLACK);						// 二维数组瓦片是 0,则选择黑色瓦片
					break;
				case 1:
					setfillcolor(WHITE);						// 二维数组瓦片是 1,则选择白色瓦片
					break;
				case 2:
					setfillcolor(GREEN);						// 二维数组瓦片是 2,则选择绿色瓦片
					break;
				case 3:
					setfillcolor(BLUE);							// 二维数组瓦片是 3,则选择蓝色瓦片
					break;
			}
			fillrectangle(j*pixnum,i*pixnum,(j+1)*pixnum,(i+1)*pixnum);						// 贴图瓦片
		}
	}
	SetWorkingImage();
}

//刷新屏幕
void show() {
	SetWorkingImage(bkgdbu.mapmesh);														// 从缓冲区采样
	getimage(bkgd.gamebk,bkgd.gamepos.lx,bkgd.gamepos.ly,showsize*pixnum,showsize*pixnum);
	SetWorkingImage();
	putimage(bkgd.deskpos.lx,bkgd.deskpos.ly,bkgd.gamebk);									// 打印采样区,理解连续更新
	putimage(700,pixnum,bkgdbu.mapmesh);
	if(bkgd.gamebk==NULL) {
		printf("图片是空的\n");
	}
	if(bkgdbu.mapmesh==NULL) {
		printf("图片是空的\n");
	}
}

//检测鼠标是否在某一区域
bool checkarea(ExMessage m,area deskpos) {
	if(m.x>deskpos.lx&&m.y>deskpos.ly&&m.x<deskpos.rx&&m.y<deskpos.ry) {
		return true;
	} else {
		return false;
	}
}

//修改背景数组
void draw(ExMessage msg) {
	int mapx=0;																// 在采样区的坐标
	int mapy=0;
	int mapi=0;																// 当前所在的背景数组瓦片坐标
	int mapj=0;
	int allmapi;															// 对应整个数组的坐标
	int allmapj;
	static int oldmapi=0;													// 上一次绘制的背景数组坐标瓦片坐标
	static int oldmapj=0;
	static int drawflag=0;
	if(drawflag==1&&checkarea(msg,bkgd.deskpos)) {
		mapx=msg.x-bkgd.deskpos.lx;											// 相对于游戏窗口左上角的坐标距离
		mapy=msg.y-bkgd.deskpos.ly;
		mapi=(mapy+bkgd.gamepos.ly)/pixnum;									// 整除瓦片边长,算出来是在缓冲区的哪个瓦片
		mapj=(mapx+bkgd.gamepos.lx)/pixnum;
		allmapi=mapi+bkgdbu.meshpos.ly;										// 计算在相对于整个地图数组左上角 (0,0) 的瓦片位置
		allmapj=mapj+bkgdbu.meshpos.lx;
		if(oldmapi!=allmapi||oldmapj!=allmapj) {							// 如果不相同,才进行绘制, 节约运算
			oldmapi=allmapi;
			oldmapj=allmapj;
			map[allmapi][allmapj]=2;										// 缓冲区的那个瓦片坐标实际上是原来完整地图的那个瓦片坐标。
			printf("游戏采样区网格坐标 x = %d,  y = %d\n",mapj,mapi);
			freshbuffer();
		}
	}
	if(msg.message ==WM_LBUTTONDOWN&&checkarea(msg,bkgd.deskpos)) {
		mapx=msg.x-bkgd.deskpos.lx;											// 相对于游戏窗口左上角的坐标距离
		mapy=msg.y-bkgd.deskpos.ly;
		mapi=(mapy+bkgd.gamepos.ly)/pixnum;									// 整除瓦片边长,算出来是在缓冲区的哪个瓦片
		mapj=(mapx+bkgd.gamepos.lx)/pixnum;
		allmapi=mapi+bkgdbu.meshpos.ly;										// 计算在相对于整个地图左上角 (0,0) 的数组瓦片位置
		allmapj=mapj+bkgdbu.meshpos.lx;
		oldmapi=allmapi;
		oldmapj=allmapj;
		map[allmapi][allmapj]=2;
		printf("游戏采样区网格坐标 x = %d,  y = %d\n",mapj,mapi);
		printf("游戏采样区像素坐标 x = %d,  y = %d\n",bkgd.gamepos.lx,bkgd.gamepos.ly);
		printf("游戏缓冲区网格坐标 x = %d,  y = %d\n",bkgdbu.meshpos.lx,bkgdbu.meshpos.ly);
		freshbuffer();
		drawflag=1;
	} else if(msg.message==WM_LBUTTONUP) {
		drawflag=0;
	}
}
// 右键拖动游戏地图——用坐标变换是无解的,因为鼠标位移detalx detaly的范围持续更新给了数据,
void draft(ExMessage msg) {
	static int flag=0;
	static int oldmx=0;														// 鼠标右键时的鼠标像素坐标
	static int oldmy=0;
	static int gamex=bkgd.nowpointx;										// 旧的采样区位置,加上鼠标拖动的位移就是新的采样区位置
	static int gamey=bkgd.nowpointy;
	SetWorkingImage();
	if(msg.message == WM_RBUTTONDOWN&&checkarea(msg,bkgd.deskpos)) {
		flag=1;																// 长按flag
		oldmx=msg.x;														// 记录拖动的起点
		oldmy=msg.y;
		gamex=bkgd.nowpointx;												// 只能使用绝对坐标,相对坐标 bkgd.gamepos.lx 坐标范围是 0-2*showsize*pixnum ,但是相对坐标可以通过记录改写,但是不如绝对坐标直观好写
		gamey=bkgd.nowpointy;
		printf("msg.x = %d,msg.y = %d\n",msg.x,msg.y);
	} else if(flag==1) {
		bkgd.nowpointx =gamex- (msg.x-oldmx);								// 图片移动的距离等于鼠标移动的距离
		bkgd.nowpointy =gamey- (msg.y-oldmy);								// 移动方向和鼠标移动方向相反
		bkgd.gamepos.lx=bkgd.nowpointx-bkgdbu.meshpos.lx*pixnum;			// 绝对坐标和相对坐标的变换,游戏采样区的像素坐标和网格坐标在buchange() 函数里重新分配,保证游戏采样区的像素坐标范围在 0-2*showsize*pixnum 里
		bkgd.gamepos.ly=bkgd.nowpointy-bkgdbu.meshpos.ly*pixnum;			// nowpointx y 像素坐标改变,然后再修改网格坐标,网格坐标修改完,再到buchange()里增加修改绝对像素坐标
//		printf("msg.x = %d,msg.y = %d\n",msg.x,msg.y);
	}
	if(msg.message == WM_RBUTTONUP) {
		flag=0;
	}
}

//按键移动
void move(ExMessage msg) {
	static int flag_a=0;
	static int flag_d=0;
	static int flag_w=0;
	static int flag_s=0;
	static int movespeed=SHOWSPEED;					// 移动速度
	if(msg.message==WM_KEYDOWN) {		// 开始游戏某个方向移动
		switch(msg.vkcode) {
			case 0x41:					// A
				flag_a=movespeed;
				break;
			case 0x44:					// D
				flag_d=movespeed;
				break;
			case 0x57:					// W
				flag_w=movespeed;
				break;
			case 0x53:					// S
				flag_s=movespeed;
				break;
		}
	} else if(msg.message==WM_KEYUP) {	// 取消某一方向的持续移动
		switch(msg.vkcode) {
			case 0x41:					// A
				flag_a=0;
				break;
			case 0x44:					// D
				flag_d=0;
				break;
			case 0x57:					// W
				flag_w=0;
				break;
			case 0x53:					// S
				flag_s=0;
				break;
		}
	}
//	if(>&&<){
//		+=flah_a;
//	}else{
//		+=flag_a;
//	}
	bkgd.gamepos.lx-=flag_a;			// 左移采样区
	bkgd.gamepos.lx+=flag_d;			// 右移采样区
	bkgd.gamepos.ly-=flag_w;			// 上移采样区
	bkgd.gamepos.ly+=flag_s;			// 下移采样区
}

//初始化地图缓冲区
void initbkbuffer() {
	bkgdbu.mapmesh = &b;													// 挂载地图缓冲区
	bkgdbu.meshpos.lx=0;
	bkgdbu.meshpos.ly=0;
	bkgdbu.meshrow=BUFFERSIZE*showsize;
	bkgdbu.meshcolumn=BUFFERSIZE*showsize;
	bkgdbu.bufferlimit.adjust=showsize*pixnum;								// 缓冲区需要更新的临界条件
	bkgdbu.bufferlimit.xmax=2*showsize*pixnum;								// 超过九宫格就立即更新,采样区默认在九宫格的中心
	bkgdbu.bufferlimit.xmin=0;
	bkgdbu.bufferlimit.ymax=2*showsize*pixnum;
	bkgdbu.bufferlimit.xmin=0;
	freshbuffer();
	SetWorkingImage();
//	putimage(700,pixnum,bkgdbu.mapmesh);									// 缓冲区可视化
}
//初始化地图采样区
void initbk() {
	bkgd.gamebk = &a;														// 如果是在这里声明临时变量 a ,函数执行完毕之后,程序就会销毁变量
	bkgd.gamepos.lx=showsize*pixnum;										// 采样区默认位置
	bkgd.gamepos.ly=showsize*pixnum;
	bkgd.nowpointx=bkgd.gamepos.lx;											// 绝对位置,用于解决gamepos 范围在 0~2*showsize*pixnum 导致的笔刷绘制失败bug
	bkgd.nowpointy=bkgd.gamepos.ly;											// 打表检测,读表时发现的绘制位置始终在一个区域内,才发现的这个bug
	bkgd.deskpos.lx=SHOWX;													// 采样之后的粘贴位置
	bkgd.deskpos.ly=SHOWY;
	bkgd.deskpos.rx=bkgd.deskpos.lx+showsize*pixnum;						// 粘贴区域的大小,用于检测鼠标指针是否在该区域内绘制
	bkgd.deskpos.ry=bkgd.deskpos.ly+showsize*pixnum;
	SetWorkingImage(bkgdbu.mapmesh);
	getimage(bkgd.gamebk,bkgd.gamepos.lx,bkgd.gamepos.ly,showsize*pixnum,showsize*pixnum);					// 加载屏幕地图,开始采样
	SetWorkingImage();
	putimage(bkgd.deskpos.lx,bkgd.deskpos.ly,bkgd.gamebk);					// 粘贴采样结果
}

int main() {
	initgraph(1800,800,1);
	setbkcolor(GREEN);
	cleardevice();
	loadmap();																// 加载地图
	clearmap();
	initbkbuffer();
	initbk();
	ExMessage msg;
	while(1) {
		peekmessage(&msg,EX_KEY|EX_MOUSE,true);
		move(msg);															// 键盘awsd检查
		draft(msg);															// 鼠标右键拖动检查
		draw(msg);															// 鼠标左键绘制
		if(buchange()) {
			freshbuffer();													// 刷新九宫格缓冲区
			printf("九宫格已刷新\n");
		}
		if(msg.message==WM_KEYDOWN) {
			if(msg.vkcode==VK_F1) {
				savemap();
			} else if(msg.vkcode== VK_F2) {
				clearmap();
			}
		}
		show();																// 打印缓冲区,打印新的采样结果,更新游戏背景, 结算完毕统一显示
		Sleep(2);
	}

	return 0;
}
//清楚地图 
void clearmap() {
	for(int i=0; i<ROW; i++) {
		for(int j=0; j<COLUMN; j++) {
			if(i==0||j==0) {
				map[i][j]=1;
			} else {
				map[i][j]=0;
			}
		}
	}
	printf("freash gammap\n");
}
// 保存地图
void savemap() {
	FILE* fp;
	fp=fopen("mapv3.txt","w");
	for(int i=0; i<ROW; i++) {
		for(int j=0; j<COLUMN; j++) {
			fprintf(fp," %d",map[i][j]);
		}
		fprintf(fp,"\n");
	}
	fclose(fp);
	printf("save gammap\n");
	for(int i=0; i<ROW; i++) {
		for(int j=0; j<COLUMN; j++) {
			printf(" %d",map[i][j]);
		}
	}
	printf("map 显示已完成\n");
}

//加载地图
void loadmap() {
	FILE* fp;
	fp=fopen("mapv2.txt","r");
	for(int i=0; i<ROW; i++) {
		for(int j=0; j<COLUMN; j++) {
			fscanf(fp," %d",&map[i][j]);
		}
		fscanf(fp,"\n");
	}
	fclose(fp);
	printf("gammap\n");
	for(int i=0; i<ROW; i++) {
		for(int j=0; j<COLUMN; j++) {
			printf(" %d",map[i][j]);
		}
		printf("\n");
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Conditional Image-to-Video Generation with Latent Flow Diffusion Models

1 Title 重试 错误原因 Conditional Image-to-Video Generation with Latent Flow Diffusion Models&#xff08;Haomiao Ni eg&#xff09; 重试 错误原因 重试 错误原因 2 Conclusion This paper propose an approach for cI2V using novel latent flow diffusi…

C++ STL之priority_queue的使用及模拟实现

文章目录 1. 介绍2. priority_queue的使用3. priority_queue的模拟实现 1. 介绍 英文解释&#xff1a; 也就是说&#xff1a; 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆&#xff0c…

伊恩·斯图尔特《改变世界的17个方程》麦克斯韦方程方程笔记

它告诉我们什么&#xff1f; 电和磁并不会随便乱跑。旋转的电场区域会产生垂直于旋转方向的磁场。旋转的磁场区域也会产生垂直于旋转方向的电场&#xff0c;但方向相反。 为什么重要&#xff1f; 这是物理力的第一次重大统一&#xff0c;表明电和磁是密切相关的。 它带来了什么…

数据结构—基础知识(十):树和二叉树(b)

数据结构—基础知识&#xff08;十&#xff09;&#xff1a;树和二叉树(b) 二叉树的定义 二叉树( Binary Tree)是n(n≥0)个结点所构成的集合&#xff0c;它或为空树(n0)&#xff1b;或为非空树&#xff0c;对于非空树T: 有且仅有一个称之为根的结点&#xff1b;根结点以外的…

Oracle错误代码对应原因

Oracle oracle查询列长度太长ORA-01460ORA-01489ORA-01704 oracle查询列长度太长 查询的varchar的列字符串长度超过4000(取决与oracle怎么计算这个字符的长度) 例如&#xff1a; col like ‘%?%’&#xff0c;如果这个like后面的字符串长度超过4000就会报错&#xff0c;其中…

vivado使用注意事项

记得给constrs&#xff08;.xdc&#xff09;限制文件设置为目标文件&#xff08;set as Target Consraint File&#xff09;

计算机网络原理

第一章 认识计算机网络 &#x1f449;计网体系结构 一、计算机网络概述 见x-mind 二、体系结构&参考模型 1.1 分层结构 1.1.1❓❓❓为什么要分层&#xff1f; 发送文件前要完成的工作&#xff1a; 发起通信的计算机必须将数通信的通路进行激活要告诉网络如何识别目的…

springboot120企业级工位管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的企业级工位管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

vue 解决:Module not found: Error: Can‘t resolve ‘vue-router‘ 的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; Module not found: Error: Cant resolve vue-router 中文为&#xff1a; 找不到模块&#xff1a;错误&#xff1a;无法解析“vue-router” 其二、问题描述为&#xff1a; 根据报错的中文信息可知&#xff1a;应该是无法…

项目成本估算基准的常见步骤

项目成本估算基准是指在项目启动阶段确定的用于衡量和控制项目成本的基准。 基准成本是项目成本估算的依据&#xff0c;也是后续成本控制和决策的依据。它为管理层提供项目预算投资方案等关键投资依据&#xff0c;决定资源的分配情况&#xff0c;有助于优化资源使用效率&#x…

B-Tree详解及编码实现

一、概念和特性 1、定义 B-Tree是一种平衡的多叉树&#xff0c;适用于外查找多路搜索树&#xff0c;这种数据结构能够保证数据节点查找、顺序访问、插入、删除的动作&#xff0c;其平均时间复杂读控制在O(logN)内;B树为系统大块数据的读写操作做了优化&#xff0c;少定位记录时…

HCIP 交换

拓扑图&IP划分如下&#xff1a; 第一步&#xff0c;配制VLAN LSW1&#xff0c;LSW2&LSW3同理 检测 LSW1 LSW2 测试

最适合家用的洗地机哪个牌子好?清洁力强的洗地机推荐

随着家用市场的不断壮大&#xff0c;洗地机逐渐为人们熟知。众多厂家为提升深度清洁效果投入大量成本和时间&#xff0c;然而消费者在选择洗地机时往往难以判断品质。无线洗地机市场上涌现多个品牌&#xff0c;如何找到性能优越、实惠耐用的机型呢?在了解洗地机时&#xff0c;…

实战内网穿透NPS搭建过程

前提条件 首先你要有个公网IP的服务器&#xff0c;既然是内网穿透&#xff0c;那必然是通过公网IP或者域名访问本地服务。 官网下载地址 https://github.com/ehang-io/nps/releases 服务端 选择linux_amd64_server.tar.gz 客户端 选择windows_amd64_client.tar.gz 服…

列表的创建与删除

Python 中列表可以动态地添加、修改和删除元素&#xff0c;是 Python 编程中不可或缺的一部分。本文将介绍如何使用 Python 创建和删除列表&#xff0c;以及常用的方法和技巧。 创建列表 在 Python 中&#xff0c;我们可以使用一对方括号 [ ] 来创建一个空列表&#xff0c;也可…

UF_UI_select_with_single_dialog()通过单选对话框选择单个对象。对象可以通过光标或输入名称进行选择。对象被突显出来。

int response0;//返回用户操作类型&#xff0c;点了哪一种返回取消或者确定tag_t objtagNULL_TAG;//输出选择对象tag;double cursor[ 3 ];//输出光标位置tag_t view_tagNULL_TAG;//输出视图tag;UF_UI_select_with_single_dialog("请选择一个对象","获取对象类型…

dolphinscheduler节点二次开发需要改动的部分

dolphinscheduler节点二次开发需要改动的部分 前端 在dolphinscheduler-ui/public/images/task-icons/目录下新增两个节点的logo图片&#xff0c;一个为激活状态的一个为非激活状态的&#xff0c;如下。 修改文件dolphinscheduler-ui/src/views/projects/task/constants/task…

CSS高级技巧导读

1&#xff0c;精灵图 1.1 为什么需要精灵图&#xff1f; 目的&#xff1a;为了有效地减少服务器接收和发送请求的次数&#xff0c;提高页面的加载速度 核心原理&#xff1a;将网页中的一些小背景图像整合到一张大图中&#xff0c;这样服务器只需要一次请求就可以了 1.2 精灵…

centos7.9安装redmine5.1.1

前提&#xff1a; 安装mysql并新建数据库--教程太多了此步骤省略&#xff1b; 用sqlyog连上mysql创建数据库redmine&#xff1b; 1.下载redmine-5.1.1.tar.gz&#xff0c;上传到/usr/local/software目录下&#xff1b; 2.解压 cd /usr/local/software tar -zxvf redmine-5.…

JavaScript进阶:WebAPIs重点知识整理2

目录 1 对节点的相关操作 1.1 查找节点 1.1.1 查找节点的父节点 1.1.2 查找节点的子节点 1.1.3 查找节点的兄弟节点 1.2 新增节点&#xff08;先创建&#xff0c;后追加&#xff09; 1.3 克隆节点 1.4 删除节点 2 M 端&#xff08;移动端&#xff09;事件 3 JS清空表…