自制编辑动画小软件

博主分享了使用C++编写的一款简易动画编辑软件,名为Manexe。该软件包含动画编辑、撤销、重做、保存等功能,并支持有限的颜色选择和页面管理。尽管功能简单,但展示了C++在图形界面应用开发上的潜力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

繁忙学习之余,编个小软件玩玩~

本人利用C++编写了一个还算完整的动画编辑软件(就是一个cpp文件),

编得还算成功,所以写个博客班门弄斧分享分享~

名为“Manexe”

源代码如下

#include<conio.h>
#include<bits/stdc++.h>
#include<windows.h>
#include<ctime>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//KEY_DOWN(MOUSE_MOVED)
using namespace std;//GetCursorPos(&p)
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
//GetAsyncKeyState('W') & 0x8000
double x,y; 
inline void gt(int y,int x){
	COORD c;
	c.X=x;
	c.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
inline void getAddofMouse() {
/**/POINT pt;HWND h=GetForegroundWindow(); GetCursorPos(&pt); ScreenToClient(h,&pt);
/**/x=double(pt.y)/16,y=double(pt.x)/8;
/**/return;
}
int n=1,k=1,cl=15;
bool dl=1;
struct exe{
	int ki,xi,yi,c1,c2;
	exe(){}
	exe(int K,int X,int Y,int C,int Cl){
		ki=K,xi=X,yi=Y,c1=C,c2=Cl;
	}
};
vector<exe>fl;
int m;
struct itn{int dc[25][55];itn(){memset(dc,0,sizeof(dc));}};
vector<itn>v;
inline int read(){
	int x=0;char s=getchar();
	while(s<'0'||s>'9')s=getchar();
	while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
	return x;
}
inline void write(int nm){
	int u=0;
	bool op=0;
	for(int i=5;i>=0;i--){
		u=nm/int(pow(10,i));
		nm%=int(pow(10,i));
		if(u>0)op=1;
		if(op)putchar(char(u+48));
	}
	if(!op)putchar('0');
}
string c="Untitled.txt";
inline void putt(){
	gt(20,0);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
	puts("eraser");
	gt(20,6);
	for(int i=1;i<=15;i++){
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),i*16);
		putchar(' ');
	}
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
	puts("o打开 s保存 d删除当前页 r运行 c复制");
	for(int i=1;i<=5+cl;i++)putchar(' ');
	puts("^                  ");
	gt(0,50);
	puts("页数");
	gt(0,54);write(n);
	puts("       ");
	gt(1,50);
	write(k);
	puts("页       ");
	gt(2,50);
	puts("文件:");
	gt(2,55);
	puts(c.c_str());
	gt(2,55+c.size());
	puts("          ");
	gt(10,50);
	puts("z撤销 y重做");
	gt(11,50);
	puts("/、*换颜色(橡皮)");
	gt(12,50);
	puts("+、-翻下一/上一页");
	gt(14,50);
	int ui=14;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),ui);
	puts("............."); 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
	gt(15,50);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12);
	puts("2019新年快乐!"); 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
	gt(16,50);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),ui);
	puts("'''''''''''''"); 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
	gt(22,0);
}
inline void getf(){
	freopen(c.c_str(),"r",stdin);
	if(scanf("%d",&n)==1){
		v.clear();
		k=1;
		for(int o=0;o<n;o++){
			itn vi;
			for(int i=1;i<=20;i++)
				for(int j=1;j<=50;j++)
					vi.dc[i][j]=read();
			v.push_back(vi);
		}
	}
	else n=1;
	freopen("CON","r",stdin);
	return;
}
inline void putf(){
	freopen(c.c_str(),"w",stdout);
	write(n);
	putchar('\n');
	for(int o=0;o<n;o++){
		for(int i=1;i<=20;i++){
			for(int j=1;j<=50;j++)write(v[o].dc[i][j]),putchar(' ');
			putchar('\n');
		}
	}
	freopen("CON","w",stdout);
	//exit(0);
	return;
}
inline void puta(){
	gt(0,0);
	for(int i=1;i<=20;i++){
		for(int j=1;j<=50;j++){
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),v[k-1].dc[i][j]*16);
			putchar(' ');
		}
		putchar('\n');
	}
}
inline void run()
{
	int u=k;
	for(k=1;k<=n;k++){
		puta();
		Sleep(80);
	}
	k=u;
	puta();
	return;
}
int main()
{
	v.push_back(itn());
	fl.push_back(exe(1,0,0,0,0));
	while(1){
		if(dl)dl=0,putt();
		if(kbhit()){
			char cc;
			cc=getch();
			if(cc=='o'){
				char ss[20];
				gt(22,0);
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
				putchar('n'),putchar('a'),putchar('m'),putchar('e'),putchar(':');
				gets(ss);
				gt(22,0);
				for(int i=1;i<=20;i++)putchar(' ');
				c=ss;
				c+=".txt";
				getf();
				dl=1;
				puta();
			}
			if(cc=='s'){
				gt(22,0);
				putchar(' ');
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
				putf();
				gt(22,0);
			}
			if(cc=='d'){
				n--;
				if(n>0)v.erase(v.begin()+k-1,v.begin()+k);
				n=max(n,1);
				k=min(n,k);
				putt();
				puta();
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
				gt(22,0);
				putchar('f');
				fl.erase(fl.begin()+m+1,fl.end());
			}
			if(cc=='c'){
				if(k>1)v[k-1]=v[k-2];
				puta();
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
				gt(22,0);
				putchar('f');
				fl.erase(fl.begin()+m+1,fl.end());
			}
			if(cc=='z'){
				if(m>0){
					if(fl[m].ki<=v.size()){
						v[fl[m].ki-1].dc[fl[m].xi][fl[m].yi]=fl[m].c1;
						if(k!=fl[m].ki)k=fl[m].ki,puta(),putt();
						else{
							gt(fl[m].xi-1,fl[m].yi-1);
							SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),fl[m].c1*16);
							putchar(' ');
						}
						m--;
						SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
						gt(22,0);
						putchar('f');
					}
					else{
						fl.erase(fl.begin()+m,fl.begin()+m+1);
						m--;
					}
				}
			}
			if(cc=='y'){
				if(m<fl.size()-1){
					m++;
					v[fl[m].ki-1].dc[fl[m].xi][fl[m].yi]=fl[m].c2;
					if(k!=fl[m].ki)k=fl[m].ki,puta(),putt();
					else{
						gt(fl[m].xi-1,fl[m].yi-1);
						SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),fl[m].c2*16);
						putchar(' ');
					}
				}
			}
			if(cc==char(72)||cc=='+'){	
				k=min(k+1,200);
				if(k>n){
					n=k,v.push_back(itn());
					SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
					gt(22,0);
					putchar('f');
					fl.erase(fl.begin()+m+1,fl.end());
				}
				puta(),putt();
			}
			if(cc==char(80)||cc=='-')k=max(k-1,1),puta(),putt();
			if(cc==char(75)||cc=='/')cl=max(cl-1,0),putt();
			if(cc==char(77)||cc=='*')cl=min(cl+1,15),putt();
			if(cc=='r'){
				run();
			}
		}
		if(KEY_DOWN(MOUSE_MOVED)){
			getAddofMouse();
			if(int(x)<=19&&int(x)>=0&&int(y)<=49&&int(y)>=0){
				if(v[k-1].dc[int(x)+1][int(y)+1]!=cl){
					if(fl.size()>m+1)fl.erase(fl.begin()+m+1,fl.end());
					fl.push_back(exe(k,int(x)+1,int(y)+1,v[k-1].dc[int(x)+1][int(y)+1],cl));
					m=fl.size()-1;
				}
				v[k-1].dc[int(x)+1][int(y)+1]=cl;
				gt(int(x),int(y));
				if(cl==0) putchar(' ');
				else {
					SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),cl*16);
					putchar(' ');
				}
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
				gt(22,0);
				putchar('f');
			}
		}
		while(kbhit())char e=getch();
		gt(19,50);
	}
	return 0;
}

运行如下

*“运行”就是播放当前动画    *“f”表示未保存

由于本人知识的局限性,它只有1000像素连老年机都不如,而且只有15种颜色,运行得还有点慢,还有很大改进空间呐~

各位读者可以复制下去玩玩,各位大佬也可以复制下去改进改进(发布一定要跟我说,因为原型是我的程序)~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值