[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程批处理在线视频分享
返回列表 发帖

powerimg一款图显脚本解释器

本帖最后由 happy886rr 于 2016-11-27 20:05 编辑
POWERIMG.EXE
_____________________________________________________________________________
powerimg是一款强大的控制台图显脚本解释器,支持jpg、png、bmp等多种图片格式
该脚本解析器具有类似批处理的标签、跳转、循环、CALL等语法。完全是逐行解释
逐行运行,与批处理的解释机制非常相似,但语法风格略有不同,所有关键字一律
只有3个字符。
_____________________________________________________________________________
下载图片存为a.zip解压即是。

-----------------------------------------------------------------------------
主要关键字:(不区分大小写)
"add", "rot", "zom", "rev", "alp", "arg", "img", "slp", "lib", "jmp", "pos",
"exi", "pau", "cls", "tit", "mod", "cot", "mvw", "cal", "eof", "ech", "cur"

ROT [旋转中心x坐标] [旋转中心y坐标] [初始相位角度值] [角度增量]
ZOM [缩放中心x坐标] [缩放中心y坐标] [横向缩放率] [纵向缩放率] [横向缩放率增量] [纵向缩放率增量]
REV [模式值(-2到2)]
ALP [模式值( 0或1)] [R] [G] [B]
ADD [x坐标增量] [y坐标增量] [宽度大小增量] [高度大小增量] [x剪切坐标增量] [y剪切坐标增量] [显示的长度增量] [显示的高度增量]
ARG [x坐标] [y坐标] [宽度大小] [高度大小] [x剪切坐标] [y剪切坐标] [显示的长度] [显示的高度]
IMG [图片名]
JMP [#标签名]
CAL [#标签名]
COT [1|2|4|8] [1|2|4|8] [1|2|4|8] [16|32|64|128]
POS [x] [y]
MVW [x] [y]
CUR [光标尺寸]
SLP [延时毫秒]

其余ECH、PAU、TIT、CLS、EXI、MOD、CAL、均同批处理的echo, pause, title, cls,
exit, mode, con, call.
-----------------------------------------------------------------------------
注释符格式:

行注释  //        行内容
段注释  /*     
                段内容
        */
-----------------------------------------------------------------------------
自然宏命令:

||start the img script   //每个powerimg脚本必须有的,脚本的开始标记
||using desktop window   //使用桌面而非控制台来显示
||hide the cursor        //隐藏光标
||end the img script     //脚本的结束
||eof
-----------------------------------------------------------------------------
库调用格式:
LIB ||[库文件路径]  [参数1] |[参数2]
-----------------------------------------------------------------------------
百叶窗示例:
//////////////////////////////////////////////////////
Shutter effects

//////////////////////////////////////////////////////

||start img script
||hide the cursor

[
        [
                ADD 0 -50
                ARG 0 500, 0 0, 0 0, 500 50
                IMG test.jpg
                ADD 0 -50
                ARG 0 550, 500 50
                IMG
                SLP 3
        ]10
        ADD 0 0, 0 0, 0 50
]18,-1

||eof
-----------------------------------------------------------------------------
旋转图片示例:
//////////////////////////////////////////////////////
Rote effects

//////////////////////////////////////////////////////

||start img script
||hide the cursor

[
        ROT 0 0,  0 10
        IMG test.jpg
        SLP 3
]18,-1

||eof
-----------------------------------------------------------------------------
标签的使用:
//在批处理中:代表标签的开始,但在powerimg中#才是一个标签的开始,goto用JMP代替

//////////////////////////////////////////////////////
Label effects

//////////////////////////////////////////////////////

||start img script
||hide the cursor
#start
        ECH 你好!
        EOF
JMP #start
CAL #start

||eof
-----------------------------------------------------------------------------
循环的使用:
//在powerimg中中括号就是循环,括号后的数字就是循环的次数

//////////////////////////////////////////////////////
For effects

//////////////////////////////////////////////////////

||start img script
||hide the cursor

[
        ECH 循环内容

//8代表循环8次
]8

||eof
-----------------------------------------------------------------------------
英译:
THE CONSOLE DISPLAYS A PICTURE SCRIPT, VERSION 1.0
COPYRIGHT@2016~2018 BY HAPPY
POWERIMG.EXE

USAGE: powerimg [scriptfile]
-----------------------------------------------------------------------------
11/27/2016


核心源码:
  1. /*
  2. THE CONSOLE DISPLAYS A PICTURE SCRIPT, VERSION 1.0
  3. POWERIMG.EXE
  4. COPYRIGHT@2016~2018 BY HAPPY
  5. LINK: -lgdi32 -lgdiplus -lole32 -lmsimg32
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <stdbool.h>
  12. #include <windows.h>
  13. #include <wincon.h>
  14. #include <gdiplus\gdiplus.h>
  15. #include <io.h>
  16. #include <conio.h>
  17. #include <math.h>
  18. #include <time.h>
  19. //定义π值
  20. #define M_PI 3.14159265358979323846
  21. //定义移位嵌套层数
  22. #define LOOP_LEVELS 16
  23. //限制解释关键词数量                        
  24. #define SENSITIVE_NUM 22
  25. //添加关键词(请用小写定义),解释时不区分大小写。
  26. static const char* KEY_WORDS[]={"add", "rot", "zom", "rev", "alp", "arg", "img", "slp", "lib", "jmp", "pos", "exi", "pau", "cls", "tit", "mod", "cot", "mvw", "cal", "eof", "ech", "cur"};
  27. //申明函数
  28. HWND    WINAPI GetConsoleWindow();
  29. BOOL    WINAPI AlphaBlend(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
  30. BOOL    WINAPI TransparentBlt(HDC,int,int,int,int,HDC,int,int,int,int,UINT);
  31. int     Drawgif(HWND hCMD, wchar_t* gifFile, int cmd_x,  int cmd_y, int size_W, int size_H, int CYCtimes, int playSpeed);
  32. int     FileScript(char* sfile, char* LIB_ARGS[16]);
  33. WCHAR*  AnsiToWCHAR(const char* str);
  34. //定义接收整形容器
  35. int   ATOI[16]={0};
  36. //定义旋转器
  37. int   ROTE[16]={0};
  38. //定义缩放器
  39. float ZOOM[16]={0};
  40. //定义反转器
  41. int   REVE[16]={0};
  42. //定义透明器
  43. int   ALPH[16]={0};
  44. //设主句柄
  45. HWND  hCMD;
  46. //图形结构体
  47. typedef struct{
  48. HBITMAP hBitmap;
  49. int Width;
  50. int Height;
  51. }IMAGE;
  52. //整形结构体
  53. typedef struct{
  54. int x;
  55. int y;
  56. }RPOINT;
  57. //比率结构体
  58. typedef struct{
  59. float x;
  60. float y;
  61. }RATE;
  62. //移位结构体
  63. typedef struct{
  64. long FTEL;
  65. int  CYCL;
  66. int  CADD;
  67. int  LNUM;
  68. //定义嵌套累加器
  69. int  ADD[16];
  70. }fori;
  71. /***************图形函数群***************/
  72. //图形旋转
  73. int RotateDC(HDC hdc, int angle, RPOINT rpoint)  
  74. {
  75. if(angle==0){return 1;}
  76. XFORM Matrix;
  77. double rad =-angle/180.0*M_PI;
  78. Matrix.eM11 = (float)cos(rad);  
  79. Matrix.eM12 = (float)sin(rad);  
  80. Matrix.eM21 =-(float)sin(rad);  
  81. Matrix.eM22 = (float)cos(rad);  
  82. Matrix.eDx  = (float)(rpoint.x-cos(rad)*rpoint.x+sin(rad)*rpoint.y);  
  83. Matrix.eDy  = (float)(rpoint.y-cos(rad)*rpoint.y-sin(rad)*rpoint.x);
  84. SetGraphicsMode(hdc, GM_ADVANCED);
  85. SetWorldTransform(hdc, &Matrix);
  86. return 0;  
  87. }
  88. //图形缩放
  89. int ZoomDC(HDC hdc, RATE rate, RPOINT rpoint)  
  90. {
  91. XFORM Matrix;
  92. Matrix.eM11 = (float)rate.x;  
  93. Matrix.eM12 = (float)0;  
  94. Matrix.eM21 = (float)0;  
  95. Matrix.eM22 = (float)rate.y;  
  96. Matrix.eDx  = (float)(rpoint.x-rate.x*rpoint.x);  
  97. Matrix.eDy  = (float)(rpoint.y-rate.y*rpoint.y);
  98. SetGraphicsMode(hdc, GM_ADVANCED);
  99. SetWorldTransform(hdc, &Matrix);
  100. return 0;  
  101. }
  102. //图形反转
  103. int ReverseDC(HDC hdc, int reverse_mode, IMAGE img)
  104. {
  105. XFORM Matrix;
  106. if      (reverse_mode== 1){
  107. Matrix.eM11 =-(float)1;  
  108. Matrix.eM12 = (float)0;  
  109. Matrix.eM21 = (float)0;  
  110. Matrix.eM22 = (float)1;  
  111. Matrix.eDx  = (float)img.Width;  
  112. Matrix.eDy  = (float)0;
  113. }else if(reverse_mode== 2){
  114. Matrix.eM11 = (float)1;  
  115. Matrix.eM12 = (float)0;  
  116. Matrix.eM21 = (float)0;  
  117. Matrix.eM22 =-(float)1;  
  118. Matrix.eDx  = (float)0;  
  119. Matrix.eDy  = img.Height;
  120. }else if(reverse_mode== 0){
  121. Matrix.eM11 =-(float)1;  
  122. Matrix.eM12 = (float)0;  
  123. Matrix.eM21 = (float)0;  
  124. Matrix.eM22 =-(float)1;  
  125. Matrix.eDx  = (float)img.Width;  
  126. Matrix.eDy  = (float)img.Height;
  127. }else if(reverse_mode==-1){
  128. Matrix.eM11 = (float)0;  
  129. Matrix.eM12 = (float)1;  
  130. Matrix.eM21 = (float)1;  
  131. Matrix.eM22 = (float)0;  
  132. Matrix.eDx  = (float)0;  
  133. Matrix.eDy  = (float)0;
  134. }else if(reverse_mode==-2){
  135. Matrix.eM11 = (float)0;  
  136. Matrix.eM12 = (float)1;  
  137. Matrix.eM21 =-(float)1;  
  138. Matrix.eM22 = (float)0;  
  139. Matrix.eDx  = (float)img.Height;  
  140. Matrix.eDy  = (float)0;
  141. }
  142. SetGraphicsMode(hdc, GM_ADVANCED);
  143. SetWorldTransform(hdc, &Matrix);
  144. return 0;  
  145. }
  146. //图形加载
  147. IMAGE LoadImg(char* imgFile, int _nWidth, int _nHeight)
  148. {
  149. GpImage*     thisImage;
  150. GpGraphics*  graphics=NULL;
  151. ULONG_PTR    gdiplusToken;
  152. IMAGE       _img;
  153. GdiplusStartupInput GSI={1, NULL, false, false};
  154. HDC hdc=GetDC(NULL);
  155. HDC hdcMem=CreateCompatibleDC(hdc);
  156. GdiplusStartup(&gdiplusToken, &GSI, NULL);   
  157. GdipLoadImageFromFile(AnsiToWCHAR(imgFile), &thisImage);
  158. GdipGetImageWidth(thisImage, &_img.Width);
  159. GdipGetImageHeight(thisImage, &_img.Height);
  160. if      (_nWidth !=0 && _nHeight==0){
  161. _img.Height=(int)( (_img.Height*1.0 / _img.Width) * (_nWidth ) );
  162. _img.Width =_nWidth;
  163. }else if(_nWidth ==0 && _nHeight!=0){
  164. _img.Width =(int)( (_img.Width*1.0 / _img.Height) * (_nHeight) );
  165. _img.Height=_nHeight;
  166. }else if(_nWidth !=0 && _nHeight!=0){
  167. _img.Width =_nWidth;
  168. _img.Height=_nHeight;
  169. }
  170. _img.hBitmap=CreateCompatibleBitmap(hdc, _img.Width, _img.Height);
  171. SelectObject(hdcMem, _img.hBitmap);
  172. GdipCreateFromHDC(hdcMem, &graphics);
  173. GdipDrawImageRectI(graphics, thisImage, 0, 0, _img.Width, _img.Height);
  174. GdipDisposeImage(thisImage);
  175. GdipDeleteGraphics(graphics);
  176. DeleteDC (hdcMem);
  177. ReleaseDC(NULL, hdc);
  178. GdiplusShutdown(gdiplusToken);
  179. return _img;
  180. }
  181. //绘图函数
  182. int DrawImg(
  183. char* imgfile,           //图形文件
  184. int cmd_x,  int cmd_y,   //相对于cmd窗口位置
  185. int size_W, int size_H,  //图片的显示宽高
  186. int src_x,  int src_y,   //对相原图 截取位置
  187. int disp_W, int disp_H,  //要显示多少宽高
  188. fori* FORI[LOOP_LEVELS], //循环结构体指针
  189. int KLevel               //循环层号
  190. ){
  191. IMAGE P=LoadImg(imgfile, size_W, size_H);
  192. HDC   hCUR=GetDC(hCMD);
  193. HDC   hSRC=CreateCompatibleDC(hCUR);
  194. SelectObject(hSRC, P.hBitmap);
  195. if(ROTE[0]!=0){
  196. RPOINT rpoint={ROTE[1], ROTE[2]};
  197. RotateDC(hCUR, ROTE[3]+ROTE[0]*ROTE[4], rpoint);
  198. }
  199. if(ZOOM[0]!=0){
  200. RPOINT rpoint={(int)ZOOM[1], (int)ZOOM[2]};
  201. if(
  202. (ZOOM[3]+ZOOM[0]*ZOOM[5])<0 ||
  203. (ZOOM[4]+ZOOM[0]*ZOOM[6])<0
  204. ){
  205. return 1;
  206. }
  207. RATE rate={ZOOM[3]+ZOOM[0]*ZOOM[5], ZOOM[4]+ZOOM[0]*ZOOM[6]};
  208. ZoomDC(hCUR, rate, rpoint);
  209. }
  210. if(REVE[0]!=0){
  211. ReverseDC(hCUR, REVE[1], P);
  212. }
  213. if(FORI[KLevel]->ADD[0]!=0){
  214. int i=0;
  215. for(i=0; i<=KLevel; i++){
  216. cmd_x +=FORI[i]->ADD[0] * FORI[i]->ADD[1], cmd_y += FORI[i]->ADD[0] * FORI[i]->ADD[2];
  217. size_W+=FORI[i]->ADD[0] * FORI[i]->ADD[3], size_H+= FORI[i]->ADD[0] * FORI[i]->ADD[4];
  218. src_x +=FORI[i]->ADD[0] * FORI[i]->ADD[5], src_y += FORI[i]->ADD[0] * FORI[i]->ADD[6];
  219. disp_W+=FORI[i]->ADD[0] * FORI[i]->ADD[7], disp_H+= FORI[i]->ADD[0] * FORI[i]->ADD[8];
  220. }
  221. }
  222. disp_W=(disp_W<=0) ?P.Width  :disp_W;
  223. disp_H=(disp_H<=0) ?P.Height :disp_H;
  224. if      (ALPH[0]==1 && ALPH[1]==1){
  225. TransparentBlt(hCUR, cmd_x, cmd_y, disp_W, disp_H, hSRC, src_x, src_y, P.Width, P.Height, RGB(ALPH[2],ALPH[3],ALPH[4]));
  226. }else if(ALPH[0]==1 && ALPH[1]==0){
  227. BLENDFUNCTION blendFunction={0, 0, (ALPH[2]==0)?-1:ALPH[2], 1};
  228. AlphaBlend(hCUR, cmd_x, cmd_y, disp_W, disp_H, hSRC, src_x, src_y, P.Width, P.Height, blendFunction);
  229. }else if(ALPH[0]==0){
  230. BitBlt(hCUR, cmd_x, cmd_y, disp_W, disp_H, hSRC, src_x, src_y, SRCCOPY);
  231. }
  232. ROTE[0]=ZOOM[0]=REVE[0]=ALPH[0]=0;
  233. FORI[KLevel]->ADD[0]=0;
  234. DeleteObject(P.hBitmap);
  235. ReleaseDC(hCMD, hCUR);
  236. DeleteDC(hSRC);
  237. return 0;
  238. }
  239. //擦图函数
  240. int CleanImg(
  241. HWND  hd,                   //句柄
  242. LONG  cmd_x,  LONG  cmd_y,  //起始擦除点,相对于cmd窗口位置的
  243. LONG  size_W, LONG  size_H, //要擦除的宽高尺寸
  244. BOOL  mode,
  245. fori* FORI[LOOP_LEVELS],    //循环结构体指针
  246. int KLevel                  //循环层号
  247. ){
  248. RECT  z={cmd_x+FORI[KLevel]->ADD[0]*FORI[KLevel]->ADD[1], cmd_y+FORI[KLevel]->ADD[0]*FORI[KLevel]->ADD[2], cmd_x+size_W+FORI[KLevel]->ADD[0]*FORI[KLevel]->ADD[3], cmd_y+size_H+FORI[KLevel]->ADD[0]*FORI[KLevel]->ADD[4]};
  249. if(mode){
  250. InvalidateRect(hd, &z, FALSE);
  251. }else{
  252. InvalidateRect(hd, NULL, FALSE);
  253. }
  254. return 0;
  255. }
  256. /***************功能函数群***************/
  257. //子串查找,忽略大小写
  258. char* stristr(const char* str1, const char* str2)
  259. {
  260.         char* cp=(char *)str1;
  261.         char* s1, *s2;
  262.         if(!*str2){return (char *)str1;}
  263. while(*cp){
  264.                 s1=cp;
  265.                 s2=(char *)str2;
  266.                 while(
  267. *s1 &&
  268. *s2 &&
  269. !(_tolower(*s1)-_tolower(*s2))
  270. ){s1++, s2++;}
  271.                 if (!*s2){return cp;}
  272.                 cp++;
  273. }
  274.         return NULL;
  275. }
  276. //转码函数
  277. WCHAR* AnsiToWCHAR(const char* str)
  278. {
  279. if(!str){return NULL;}
  280. int wLen=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, NULL, 0);
  281. WCHAR* wstr=(WCHAR*)malloc(sizeof(WCHAR)*wLen + 1);
  282. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstr, wLen);
  283. wstr[wLen]='\0';
  284. return wstr;
  285. }
  286. //显示光标
  287. void DispyCursor(int size,bool mode)
  288. {
  289. CONSOLE_CURSOR_INFO cursor_info ={(DWORD)size, mode};
  290. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
  291. return;
  292. }
  293. //移动光标
  294. int SetPos(int x,int y)
  295. {
  296. COORD pos;
  297. HANDLE hOutput;
  298. pos.X=x, pos.Y=y;
  299. hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  300. SetConsoleCursorPosition(hOutput,pos);
  301. return 0;
  302. }
  303. //测空字符
  304. inline bool isNULL(const char c){
  305. if(
  306. c=='\t' ||
  307. c==' '  ||
  308. c=='\r' ||
  309. c=='\n' ||
  310. c=='\0'
  311. ){
  312. return true;
  313. }
  314. return false;
  315. }
  316. //过滤行TAB缩进或前空格
  317. char* passNULL(char* Str){
  318. if(Str!=NULL){
  319. while(*Str=='\t' ||*Str==' '){Str++;}
  320. }
  321. return Str;
  322. }
  323. //切分参数
  324. int args(char* Str, char* delims, char* ARGS[16], char* LIB_ARGS[16])
  325. {
  326. int i=0;
  327. char* p;
  328. ARGS[i]=strtok(Str, delims);
  329. while(ARGS[i]!=NULL){
  330. if( (p=stristr(ARGS[i], "*"))!=NULL){
  331. ARGS[i]=LIB_ARGS[atoi(p+1)];
  332. }
  333. ARGS[++i]=strtok(NULL, delims);
  334. }
  335. return i;
  336. }
  337. //整化参数
  338. int ATOIargs(int* taner, int MAX_ARGC, int add, char* ARGS[16])
  339. {
  340. int j;
  341. for(j=0; j<16; j++){taner[j]=0;}
  342. for(j=0; j<MAX_ARGC; j++){
  343. taner[j+add]=atoi(ARGS[j]);
  344. }
  345. return 0;
  346. }
  347. //关键词解析函数
  348. int Identify_KeyWords(const char* Line)
  349. {
  350. int i, SN;
  351. for(SN=0; SN<SENSITIVE_NUM; SN++){
  352. for(i=0; KEY_WORDS[SN][i]!='\0'; i++){
  353. if(
  354. Line[i]   !=KEY_WORDS[SN][i] &&
  355. Line[i]+32!=KEY_WORDS[SN][i]
  356. ){
  357. break;
  358. }
  359. }
  360. if(
  361. KEY_WORDS[SN][i]=='\0' &&
  362. isNULL(Line[i])
  363. ){
  364. return SN;
  365. }
  366. }
  367. return 255;
  368. }
  369. //绘图函数
  370. int Shell_IMG(char* imgfile, fori* FORI[LOOP_LEVELS], int KLevel, int LineNUM)
  371. {
  372. //为空则表示擦除
  373. if(
  374. imgfile==NULL      ||
  375. isNULL(imgfile[0])
  376. ){
  377. if(ATOI[0]==0){
  378. CleanImg(hCMD, 0, 0, 0, 0, FALSE, FORI, KLevel);
  379. }else{
  380. CleanImg(hCMD, ATOI[1], ATOI[2], ATOI[3], ATOI[4], TRUE, FORI, KLevel);
  381. }
  382. //否则为图片显示
  383. }else{
  384. if(access(imgfile, 0)==-1){
  385. fprintf(stdout, "[%d]:图片不存在。\n", LineNUM);
  386. exit(1);
  387. }
  388. DrawImg(imgfile,  ATOI[1], ATOI[2], ATOI[3], ATOI[4], ATOI[5], ATOI[6], ATOI[7], ATOI[8], FORI, KLevel);
  389. }
  390. return 0;
  391. }
  392. /***************Shell函数群***************/
  393. //清屏函数
  394. int Shell_CLS()
  395. {
  396. HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  397. COORD coordScreen={0,0};
  398. DWORD cCharsWritten;
  399. CONSOLE_SCREEN_BUFFER_INFO csbi;
  400. GetConsoleScreenBufferInfo(hConsole, &csbi);
  401. FillConsoleOutputCharacter(hConsole,       (TCHAR)' ', csbi.dwSize.X*csbi.dwSize.Y, coordScreen, &cCharsWritten);
  402. GetConsoleScreenBufferInfo(hConsole, &csbi);
  403. FillConsoleOutputAttribute(hConsole, csbi.wAttributes, csbi.dwSize.X*csbi.dwSize.Y, coordScreen, &cCharsWritten);
  404. SetConsoleCursorPosition(hConsole,coordScreen);
  405. return 0;
  406. }
  407. //标题函数
  408. int Shell_TITLE(char* Str)
  409. {
  410. SetConsoleTitle(Str);
  411. return 0;
  412. }
  413. //按键函数
  414. int Shell_KEY(clock_t delay)
  415. {
  416. int i,KEY_V,start=clock();
  417. do{
  418. if(kbhit()){
  419. KEY_V=(int)(getch());
  420. if(KEY_V<97){KEY_V+=32;}
  421. return KEY_V;
  422. }
  423. for(i=0;i<=50;i++);
  424. }while((clock()-start)<delay);
  425. return -1;
  426. }
  427. //鼠标点击函数:KEY_V取值1、2对应鼠标左右键点击;当取值为0时则隐藏光标;
  428. int Shell_MOUSE(int KEY_V)
  429. {
  430. if(KEY_V==0){
  431.          CONSOLE_CURSOR_INFO cursor_info={1,0};
  432.          SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
  433. return 0;
  434. }
  435. HANDLE StdIn=GetStdHandle(STD_INPUT_HANDLE);
  436. DWORD  OrgMode, Res;
  437. INPUT_RECORD InR;
  438. GetConsoleMode(StdIn, &OrgMode);
  439. SetConsoleMode(StdIn, OrgMode | ENABLE_WINDOW_INPUT |  ENABLE_MOUSE_INPUT);
  440. for(;;){
  441. ReadConsoleInput(StdIn, &InR, 1, &Res);
  442. if(
  443. InR.Event.MouseEvent.dwEventFlags ==0  &&
  444. InR.Event.MouseEvent.dwButtonState==KEY_V
  445. ){
  446. SetConsoleMode(StdIn, OrgMode);
  447. return (InR.Event.MouseEvent.dwMousePosition.Y)*1000+(InR.Event.MouseEvent.dwMousePosition.X);
  448. }
  449. }
  450. }
  451. //窗口大小
  452. int Shell_MODE_CON(int x, int y)
  453. {
  454. HANDLE StdOut=GetStdHandle(STD_OUTPUT_HANDLE);
  455. CONSOLE_SCREEN_BUFFER_INFO scbi;
  456. COORD size={x, 300};
  457. GetConsoleScreenBufferInfo(StdOut, &scbi);
  458. SetConsoleScreenBufferSize(StdOut, size);
  459. SMALL_RECT rc={0, 0, x-1, y-1};
  460. SetConsoleWindowInfo(StdOut, 1, &rc);
  461. CloseHandle(StdOut);
  462. return 0;
  463. }
  464. //字体颜色: 1,2,4,8前景;16,32,64,128后景;
  465. int Shell_COLOR(unsigned short A,unsigned short B,unsigned short C,unsigned short D)
  466. {
  467. HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
  468. CONSOLE_SCREEN_BUFFER_INFO csbi;
  469. GetConsoleScreenBufferInfo(handle_out, &csbi);
  470. SetConsoleTextAttribute(handle_out, A | B | C | D);
  471. return 0;
  472. }
  473. //移动窗口
  474. int Shell_MW(int x, int y)
  475. {
  476. HWND cmd=GetConsoleWindow();
  477. SetWindowPos(cmd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);
  478. return 0;
  479. }
  480. /***************解析函数群***************/
  481. //脚本解析函数
  482. int FileScript(char* sfile, char* LIB_ARGS[16])
  483. {
  484. //初始参数 KLevel为当前循环层号;
  485. int i=0, j=0, KLevel=0, Line_LEN=0, MAX_ARGC=0, SN=255;
  486. //读取脚本文件
  487. FILE* fp;
  488. if( (fp=fopen(sfile, "rb"))==NULL ){
  489. fprintf(stdout, "[%d]:读取文件失败。\n", i);
  490. exit(1);
  491. }
  492. //初始化开关参数,SFLAG[0]==1开始; SFLAG[1]==1跳转; SFLAG[2]==1 呼叫归位;
  493. int* SFLAG=(int*)calloc(8, sizeof(int));
  494. //初始化循环结构体
  495. fori* FORI[LOOP_LEVELS];
  496. for(j=0; j<LOOP_LEVELS; j++){
  497. FORI[j]=(fori*)calloc(1, sizeof(FORI));
  498. FORI[j]->FTEL=(long)0;
  499. FORI[j]->CYCL=0;
  500. FORI[j]->LNUM=0;
  501. FORI[j]->CADD=0;
  502. FORI[j]->ADD[16]=(int)calloc(16, sizeof(int));
  503. }
  504. //定义切分字串容器
  505. char* ARGS[16];
  506. for(j=0; j<16; j++){
  507. ARGS[j]=(char*)calloc(128, sizeof(char*));
  508. }
  509. //分配行容器
  510. char* LCache=(char*)calloc(1025, sizeof(char));
  511. //辅助行指针
  512. char* Line;
  513. //标签跳转指针
  514. char* JMP_MARK=(char*)malloc(128*sizeof(char));
  515. //标签呼叫指针
  516. long  CAL_MARK;
  517. while(!feof(fp)){
  518. memset(LCache, 0,  1024*sizeof(char));
  519. fgets(LCache, 1024, fp);
  520. //指针置换
  521. Line=LCache;
  522. //行计数器
  523. i++;
  524. //过滤行TAB缩进或前空格
  525. while(*Line=='\t'|| *Line==' '){Line++;}
  526. //过滤注释符
  527. if(Line[0]=='/' &&Line[1]=='/'){
  528. continue;
  529. }
  530. //过滤段间注释符
  531. if(
  532. (Line[0]=='/' &&Line[1]=='*' )
  533. ){
  534. SFLAG[0]=0;
  535. continue;
  536. }else if(
  537. (Line[0]=='*' &&Line[1]=='/' )
  538. ){
  539. SFLAG[0]=1;
  540. continue;
  541. }else if(Line[0]=='#'){
  542. if(SFLAG[1]==0){
  543. continue;
  544. }else{
  545. j=0;
  546. while(
  547. JMP_MARK[j]==Line[j] ||
  548. JMP_MARK[j]==Line[j]-32
  549. ){j++;}
  550. if( isNULL(JMP_MARK[j]) && isNULL(Line[j]) ){SFLAG[1]=0;}
  551. continue;
  552. }
  553. }
  554. //识别自然宏
  555. if(
  556. (Line[0]=='|') &&
  557. (Line[1]=='|')
  558. ){
  559. if(
  560. stristr(Line+2, "start"  )!=NULL ||
  561. stristr(Line+2, "begin"  )!=NULL ||
  562. stristr(Line+2, "run"    )!=NULL
  563. ){
  564. SFLAG[0]=1;
  565. continue;
  566. }
  567. if(
  568. stristr(Line+2, "end"    )!=NULL ||
  569. stristr(Line+2, "eof"    )!=NULL
  570. ){
  571. return 0;
  572. }
  573. if(
  574. stristr(Line+2, "desktop")!=NULL ||
  575. stristr(Line+2, "desk"   )!=NULL
  576. ){
  577. hCMD=GetDesktopWindow();
  578. continue;
  579. }
  580. if(
  581. stristr(Line+2, "hide"   )!=NULL
  582. ){
  583. DispyCursor(25, FALSE);
  584. }
  585. continue;
  586. }
  587. //开始开关未打开,或遇到空行,或正在执行JMP跳转,则跳过该行
  588. if(
  589. SFLAG[0]==0     ||
  590. isNULL(Line[0]) ||
  591. SFLAG[1]==1
  592. ){continue;}
  593. //解析循环开始标签
  594. if(
  595. (Line[0]=='['   ) &&
  596. (isNULL(Line[1])) //为空则开始循环
  597. ){
  598. FORI[++KLevel]->FTEL=ftell(fp);
  599. FORI[KLevel]->CYCL=0;
  600. FORI[KLevel+1]->CADD=0;
  601. FORI[KLevel]->LNUM=i+1;
  602. continue;
  603. }
  604. //解析循环结束标签
  605. if(Line[0]==']'){
  606. (FORI[KLevel]->CYCL)++;
  607. int TIM=atoi(strtok(Line+1,","));
  608. //移位器嵌套增量
  609. FORI[KLevel+1]->CADD=atoi(strtok(NULL,  ","));
  610. if      ( FORI[KLevel]->CYCL <  TIM+(FORI[KLevel]->CADD)*(FORI[KLevel-1]->CYCL) ){
  611. fseek(fp, FORI[KLevel]->FTEL, SEEK_SET);
  612. i=FORI[KLevel]->LNUM-1;
  613. }else if( FORI[KLevel]->CYCL >= TIM+(FORI[KLevel]->CADD)*(FORI[KLevel-1]->CYCL) ){
  614. FORI[KLevel--]->CYCL=0;
  615. }
  616. continue;
  617. }
  618. //过滤回车符
  619. if((Line_LEN=strlen(Line))==2){
  620. continue;
  621. }else{
  622. Line[Line_LEN-2]='\0';
  623. }
  624. //解析命令行
  625. switch(Identify_KeyWords(Line)){
  626. case 0:
  627. //累加器
  628. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  629. ATOIargs(FORI[KLevel]->ADD, MAX_ARGC, 1, ARGS);
  630. FORI[KLevel]->ADD[0]=FORI[KLevel]->CYCL+1;
  631. break;
  632. case 1:
  633. //旋转器
  634. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  635. ATOIargs(ROTE, MAX_ARGC, 1, ARGS);
  636. ROTE[0]=FORI[KLevel]->CYCL+1;
  637. break;
  638. case 2:
  639. //缩放器
  640. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  641. for(j=0; j<MAX_ARGC; j++){ ZOOM[j+1]=atof(ARGS[j]);}
  642. ZOOM[0]=FORI[KLevel]->CYCL+1;
  643. break;
  644. case 3:
  645. //反转器
  646. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  647. ATOIargs(REVE, MAX_ARGC, 1, ARGS);
  648. REVE[0]=FORI[KLevel]->CYCL+1;
  649. break;
  650. case 4:
  651. //透明器
  652. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  653. ATOIargs(ALPH, MAX_ARGC, 1, ARGS);
  654. ALPH[0]=1;
  655. break;
  656. case 5:
  657. //参数器
  658. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  659. ATOIargs(ATOI, MAX_ARGC, 1, ARGS);
  660. ATOI[0]=1;
  661. break;
  662. case 6:
  663. //绘图器
  664. MAX_ARGC=args(Line+4, " ", ARGS, LIB_ARGS);
  665. Shell_IMG(passNULL(ARGS[0]), FORI, KLevel, i);
  666. break;
  667. case 7:
  668. //延时毫秒
  669. Sleep(atoi(Line+4));
  670. break;
  671. case 8:
  672. //调用LIB脚本库
  673. Line=passNULL(Line+4);
  674. if(Line[0]=='|'&&Line[1]=='|'){
  675. MAX_ARGC=args(Line+2, "|", ARGS, LIB_ARGS);
  676. FileScript(ARGS[0], ARGS);
  677. }else{
  678. fprintf(stdout, "[%d]:缺少库名。\n", i);
  679. exit(1);
  680. }
  681. break;
  682. case 9:
  683. //跳转器
  684. strcpy(JMP_MARK, strupr(passNULL(Line+4)));
  685. i=KLevel=i=SFLAG[0]=0, SFLAG[1]=1;
  686. fseek(fp, 0, SEEK_SET);
  687. break;
  688. case 10:
  689. //移动光标
  690. if(args(Line+4, " ", ARGS, LIB_ARGS) >1){SetPos(atoi(ARGS[0]), atoi(ARGS[1]));}
  691. break;
  692. case 11:
  693. //退出
  694. exit( atoi(Line+4) );
  695. break;
  696. case 12:
  697. //暂停
  698. getch();
  699. break;
  700. case 13:
  701. //清屏
  702. Shell_CLS();
  703. break;
  704. case 14:
  705. //标题
  706. SetConsoleTitle(Line+4);
  707. break;
  708. case 15:
  709. //窗口尺寸
  710. if( args(Line+4, " ", ARGS, LIB_ARGS) >1){Shell_MODE_CON(atoi(ARGS[0]), atoi(ARGS[1]));}
  711. break;
  712. case 16:
  713. //字体颜色
  714. if( args(Line+4, " ", ARGS, LIB_ARGS) >3){Shell_COLOR(atoi(ARGS[0]), atoi(ARGS[1]), atoi(ARGS[2]), atoi(ARGS[3]));}
  715. break;
  716. case 17:
  717. //移动窗口
  718. if( args(Line+4, " ", ARGS, LIB_ARGS) >1){Shell_MW(atoi(ARGS[0]), atoi(ARGS[1]));}
  719. break;
  720. case 18:
  721. //呼叫器
  722. CAL_MARK=ftell(fp);
  723. SFLAG[2]=1;
  724. strcpy(JMP_MARK, strupr(passNULL(Line+4)));
  725. i=KLevel=i=SFLAG[0]=0, SFLAG[1]=1;
  726. fseek(fp, 0, SEEK_SET);
  727. break;
  728. case 19:
  729. //EOF结尾标签
  730. if(SFLAG[2]==1){
  731. fseek(fp, CAL_MARK, SEEK_SET);
  732. SFLAG[2]==0;
  733. }else{
  734. return 0;
  735. }
  736. break;
  737. case 20:
  738. //字符显示函数
  739. fputs(Line+4,stdout);
  740. fputs("\r\n",stdout);
  741. break;
  742. case 21:
  743. //设置光标尺寸
  744. DispyCursor(atoi(Line+4), TRUE);
  745. break;
  746. case 255:
  747. fprintf(stdout, "[%d]:错误指令。\n", i);
  748. exit(1);
  749. break;
  750. }
  751. }
  752. free(SFLAG);
  753. free(FORI);
  754. free(LCache);
  755. fclose(fp);
  756. return 0;
  757. }
  758. /*************MAIN主函数入口*************/
  759. int main(int argc, char** argv)
  760. {
  761. if(argc==2){
  762. //获得控制台窗口句柄
  763. hCMD=GetConsoleWindow();
  764. char* LIB_ARGS[16];
  765. FileScript(argv[1], LIB_ARGS);
  766. return 0;
  767. }
  768. //异常则抛出使用说明
  769. fputs(
  770. "THE CONSOLE DISPLAYS A PICTURE SCRIPT, COPYRIGHT@2016~2018 BY HAPPY\n"
  771. "VERSION 1.0\n"
  772. "usage: powerimg [scriptfile]\n"
  773. ,stdout
  774. );
  775. return 1;
  776. }
复制代码

楼主是第三方专业户了,很好很强大

TOP

回复 3# happy886rr

我只是打发下时间,感谢你的意见。有空我去看看lua和html5

TOP

回复 4# zhangzsky
如果你学了lua游戏开发的话,我想你会被其惊人的功能所震惊,这年头java都得借用lua。当年大话西游就是靠lua开发的。推荐你学学lua游戏制作,那可是一天就能搞出个三国志单机版。我都打算用lua 去做powerimg的解释器核心,但是迫于体积太大,lua有200KB之多。我的做第三方不愿体积超过30KB。

TOP

本帖最后由 zhangzsky 于 2016-11-29 12:39 编辑

回复 5# happy886rr


    起初我只是想偶尔学学bat,然后想着写点什么,后来上班的电脑上到处都是,我基本上就双击下……
所以空出来时间写个游戏什么的锻炼下批处理……
已经跟起初的想法有出入了,自己文化水平有限。看来lua得空就看看也好

TOP

回复 6# zhangzsky
批处理的优势在于批量操作,批量调用exe。
你做游戏,需要的是高效的工具,需要多媒体接口,能播放声音,显示动态画面,能2.5D旋转,这些批处理都不能实现。我觉得你的游戏设计思想很不错,你不应该被工具所局限,用批处理你只能做出那种简单的逐帧动画,但是你学学真正的游戏开发技术,会让你获得新生。

TOP

求exe

TOP

你多大年纪了
我要把你写的所有的都重新写一份
我正在写一款万能p-code虚拟机,
大神,收徒弟嘛,请收下我的膝盖
pm给我联系方式

TOP

回复 8# gfwlxx


    听说他物理很好。
综合型编程论坛
Writing Code That Nobody Else Can Read.

TOP

返回列表