[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[已解决] 请问,怎么让李寻欢小图标,在菜菜城背景地图里走动起来?

本帖最后由 zzz19760225 于 2024-9-13 16:23 编辑

HOPE2021老师的代码改了一下,组合游戏背景图和游戏人物图,想让人物图随着鼠标走动起来(以前游戏也是那么样的吧)。
但是鼠标获取的坐标pos.x和pos.y不能直接做图片参数,就换成int a,b,结果还是不行。求教如何把鼠标坐标信息输出到图片坐标参数??
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main(void)
  7. {
  8.     initgraph(640, 480);// 初始化图形界面
  9.     IMAGE img0;
  10.     loadimage(&img0,"菜菜城1.jpg",640,480);
  11.     putimage(0, 0, &img0);
  12. int a;
  13. int b;
  14.   HANDLE hOut = NULL;
  15.   HANDLE hIn = NULL;//定义句柄变量
  16.   INPUT_RECORD mouseRecord;//定义输入事件结构体
  17.   DWORD res;//用于存储读取记录
  18.   COORD pos;//用于存储鼠标当前位置
  19.   hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄
  20.   hIn = GetStdHandle(STD_INPUT_HANDLE);//获取标准输入句柄
  21.      while (1)
  22. {
  23.       ReadConsoleInput(hIn, &mouseRecord, 1, &res);//读取输入事件
  24.       pos = mouseRecord.Event.MouseEvent.dwMousePosition;//获取鼠标当前位置
  25.       if (mouseRecord.EventType == MOUSE_EVENT)//如果当前事件是鼠标事件
  26.   {  if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)//单击鼠标左键
  27.           {  a=pos.X;b=pos.Y                                                                                                                             }}
  28. }
  29. IMAGE img;
  30.         loadimage(&img, "李寻欢1.png", 100, 100);
  31.         putimage(%d,%d, &img,a,b);
  32.    CloseHandle(hOut);
  33.    CloseHandle(hIn);//关闭句柄
  34.     closegraph();    // 关闭窗口
  35.     return 0;
  36. }
复制代码

只能斜着步进增量,要是能跟着鼠标按下起点,鼠标移动线,到鼠标松开为目标结束点,那样去移动就好了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);// 初始化图形界面
  9.     int a=10;
  10.     int b=10;
  11.       IMAGE img0;
  12.       loadimage(&img0,"菜菜城1.jpg",640,480);
  13.       putimage(0, 0, &img0);
  14. IMAGE img;
  15.          loadimage(&img, "李寻欢1.png", 100, 100);
  16.       while (!kbhit()) {// 无限循环,直到用户按下ESC键  
  17.         MOUSEMSG msg = GetMouseMsg();// 鼠标状态
  18.         if (msg.uMsg == WM_LBUTTONDOWN) {// 检查是否有鼠标点击   
  19.                    a=a+10;b=b+10;
  20.           putimage(a,b,&img);  
  21.    
  22.    }
  23. }
  24.    closegraph();    // 关闭窗口
  25.    return 0;
  26. }
复制代码

可以试试用winapi
GetCursorPos和ScreenToClient

只能斜着步进增量明显是因为你固定了增量(那个变量a)

试试看下面行否,按着鼠标左键不放然后移动鼠标会跟随,松开后停止跟随
我数学和物理和脑子都不好,想不出啥好方法改变增量,只能这样了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);// 初始化图形界面
  9.     int a=10;
  10.     int b=10;
  11.       IMAGE img0;
  12.       loadimage(&img0,"菜菜城1.jpg",640,480);
  13.       putimage(0, 0, &img0);
  14. IMAGE img;
  15.          loadimage(&img, "李寻欢1.png", 100, 100);
  16. HWND wdhd;
  17. POINT poi;
  18. ExMessage exmsg;
  19. LONG posX,posY,imgX,imgY;
  20. imgX=0;
  21. imgY=0;
  22. int aaa=0;//移动开关
  23. double c=0.2;//移动百分比
  24. wdhd=GetHWnd();//获取窗口句柄
  25. putimage(0,0,&img);
  26.       while (!kbhit()) {// 无限循环,直到用户按下ESC键  
  27. if(peekmessage(&exmsg,EX_MOUSE)){
  28. if(WM_LBUTTONDOWN==exmsg.message){aaa=1;}//开启移动
  29. if(WM_LBUTTONUP==exmsg.message){aaa=0;}//关闭移动
  30. }
  31. if(aaa){
  32. GetCursorPos(&poi);//获取当前光标位置
  33. ScreenToClient(wdhd,&poi);//转换为客户区位置
  34. posX=poi.x>0?poi.x:0;
  35. posX=posX>640?640:posX;
  36. posY=poi.y>0?poi.y:0;
  37. posY=posY>480?480:posY;
  38. posX=posX-imgX;//横向移动距离
  39. posY=posY-imgY;//纵向移动距离
  40. imgX=(LONG)(imgX+posX*c);
  41. imgY=(LONG)(imgY+posY*c);
  42. if(imgX > 640){imgX=640;}
  43. if(imgX < 0){imgX=0;}
  44. if(imgY > 480){imgY=480;}
  45. if(imgY < 0){imgY=0;}
  46. putimage((int)imgX,(int)imgY,&img);
  47. }
  48. }
  49.    closegraph();    // 关闭窗口
  50.    return 0;
  51. }
复制代码
1

评分人数

    • zzz19760225: 可以运行,谢谢大侠的代码技术 + 1

TOP

本帖最后由 zzz19760225 于 2024-9-11 17:29 编辑


上一图你的代码效果
下一图尝试



你代码里的组合关系,我用到鼠标坐标,看能不能先试试走直角什么的,结果不按要求来。这种情况下去,头发掉光是难免的啊。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);// 初始化图形界面
  9.       IMAGE img0;
  10.       loadimage(&img0,"菜菜城1.jpg",640,480);
  11.       putimage(0, 0, &img0);
  12. IMAGE img;
  13.          loadimage(&img, "李寻欢1.png", 10, 10);
  14.       while (!kbhit()) {// 无限循环,直到用户按下ESC键  
  15.         MOUSEMSG msg = GetMouseMsg();// 鼠标状态
  16. for(int b = 0 ; b < msg.y ; b=b+20 ){
  17. for(int a = 0 ; a < msg.x ; a=a+10 ){
  18.         if (msg.uMsg == WM_LBUTTONDOWN) {// 检查是否有鼠标点击  
  19.                   putimage(a,b,&img);
  20.   Sleep(50);
  21. }}}
  22. }
  23.    closegraph();    // 关闭窗口
  24.    return 0;
  25. }
复制代码
下图
想做试验一样拼凑,但是怎么拼凑的忘记了,只是人物图画可以追着鼠标走,形态是需要的内容,但是老是追着走的,无法进行开关操作,也是问题。
(我不知道是如何达到这个效果的,如何进行重复实现。是如何,为什么,会达到这个效果的。有没有可能更进一步达到可控的目的,需要就可以追鼠标跑,不需要的时候有个打招呼的开关)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);// 初始化图形界面
  9. int b = 0 ;
  10. int a = 0 ;
  11. int c = a ;
  12. int d = b ;
  13.       IMAGE img0;
  14.       loadimage(&img0,"菜菜城1.jpg",640,480);
  15.       putimage(0, 0, &img0);
  16.    IMAGE img;
  17.        loadimage(&img, "李寻欢1.png", 10, 10);
  18.       while (1) {
  19.       MOUSEMSG msg = GetMouseMsg();// 鼠标状态
  20. b = msg.y ;
  21. a = msg.x ;
  22. Sleep(150);
  23.         if (msg.uMsg == WM_LBUTTONDOWN) {// 检查是否有鼠标点击  
  24.         c=msg.x;
  25.     d=msg.y;
  26. }
  27.       putimage(a,b,&img);
  28.   }
  29.    closegraph();    // 关闭窗口
  30.    return 0;
  31. }
复制代码

TOP

小游戏可以考虑用.net做 gdi+的面向对象比纯过程的gdi好用些 在winform里集成的也比较好 效率也不会差c++太多 还可以用vs编辑
你好

TOP

本帖最后由 zzz19760225 于 2024-9-18 11:00 编辑

回复 4# jyswjjgdwtdtj
谢谢你的建议,
我有机会试试,方便用的工具会加快工作效率。(方便好用会容易接受,尤其对学习有障碍的人来说。尤其是看到linux前面加.小点点的文件,以前看到.net当作是一个库,没有当作可以使用的软件,个人感觉有点反人类,不是说人家技术,是从用户角度瞎说而已,有些设置,从人操作控制机器世界通用效率考虑的角度,是完全没必要的。中国得有自己的人类软件机器世界啊)

这里的图片移动,是想做个广义自由度的连环画,可以当图片显示的,可以组合图片的,企图接近flash那种的想法。
结果遇到了gif动画,产生显示难度大山,于是就用文件夹里图片显示。搜索相关内容,看到李寻欢的C语言内容,就想到像素游戏,如大航海,以及中国自己的像素大航海游戏,或叫郑和之四海大明什么的一类。以及批处理勇士大闯关,于是试一下。这几天得了FIVE66和HOPE2021,还有f开头flashercs的2点阵代码,提供的开源搜索,其余的搜索抄写,不断拼凑组合代码。尤其是心里想着那事怎么解决,连觉都睡不好了,精神也变差。所以这方面暂时小心谨慎去尝试,至少要一个月做一个事情单元,这样不容易掉头发。
如果能做成一个通用的,以WIN和LINUX显示图片的功能,做成的显存点像素阵列,做简易通用的类DOS存取点像素游戏模式,然后做简单的像素游戏,降低制作难度,也是可以的。(需要信息储存取和显存两个阵列,加上手动和程序开关,到手动自动组合的。以及一体数量数字进制和点像素自造字符集,需要很久吧)
----------------------------------------------------------------------------------------------------------------------------------------------------------


抄写的,可以方向键移动人物图片。(问题还是five66说的那个图片绘制的内存占用,其是否清除的隐患,easyx到底能不能不断绘图。或者需要一个试验)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);    // 创建窗口
  9.       IMAGE img0;
  10.       loadimage(&img0,"菜菜城1.jpg",640,480);
  11.       IMAGE img;
  12.       loadimage(&img, "李寻欢1.png", 30, 30);    // 加载图片
  13.       int x = 100, y = 100;    // 初始位置
  14.     while(1)    // 直到键盘有输入
  15.     {
  16.       Sleep(50);
  17.       if(GetAsyncKeyState(VK_LEFT))   {    x -= 10;   } // 左移 // 如果按下左键
  18.       if(GetAsyncKeyState(VK_RIGHT)) {    x += 10;   } // 右移// 如果按下右键
  19.       if(GetAsyncKeyState(VK_UP))      {    y -= 10;    }// 上移// 如果按下上键
  20.       if(GetAsyncKeyState(VK_DOWN)) {    y += 10;   } // 下移// 如果按下下键
  21.       putimage(0, 0, &img0);
  22.       putimage(x, y, &img);    // 绘制图片
  23.     }
  24.     closegraph();    // 关闭窗口
  25.     return 0;
  26. }
复制代码
后面触发剧情的地区刷怪或宝物,与连环画的文字按钮可以合为一个:屏幕画面的量化区域鼠标和键盘触发机关开关。

用文件夹图片动画化模式,速度立马变慢了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);      
  9.       IMAGE img0;
  10.       loadimage(&img0,"菜菜城1.jpg",640,480);
  11.       IMAGE img;
  12.       //loadimage(&img, "李寻欢1.png", 20, 20);   
  13.       int x = 100, y = 100;    // 初始位置
  14.       char filePath[1024];     // 文件路径数组
  15.       int n = 1;  
  16.     while(1)   
  17.     {
  18.       Sleep(50);
  19.       if(GetAsyncKeyState(VK_LEFT))  {    x -= 10;   } // 左移 // 如果按下左键
  20.       if(GetAsyncKeyState(VK_RIGHT)) {    x += 10;   } // 右移 // 如果按下右键
  21.       if(GetAsyncKeyState(VK_UP))    {    y -= 10;   } // 上移 // 如果按下上键
  22.       if(GetAsyncKeyState(VK_DOWN))  {    y += 10;   } // 下移 // 如果按下下键
  23.       putimage(0, 0, &img0);
  24.         sprintf(filePath, "%s\\%d.png", "李寻欢", n); //本文件夹里下一层文件夹“李寻欢”
  25.         IMAGE img;
  26.         loadimage(&img, filePath,20,20);              //图片的大小
  27.         putimage(x, y, &img);                         //图片的竖横量
  28.         Sleep(100);
  29.         n = (n % 4) + 1;       //递增图片索引, 假设文件名是1.png, 2.png, ..., 假设最多有4张图片
  30.     }
  31.     closegraph();   
  32.     return 0;
  33. }
复制代码


中外大航海的明大航海,与其后的西欧大航海两个游戏概念空间。
主要是明大航海的先期部分丰富的游戏假想(一个大洲上有凶残无比的猫象,还有一个大洲有专门吓唬人的霸王怪兽),以及游戏开局一历史闻名的宝船。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.     initgraph(640, 480);      
  9.       IMAGE img0;
  10.       loadimage(&img0,"中国世界地图1.1.png",640,480);
  11.       IMAGE img1;
  12.       loadimage(&img1,"猫象1.png",50,50);
  13.   
  14.       IMAGE img2;
  15.       loadimage(&img2,"怪兽1.jpg",50,50);
  16.    
  17.       IMAGE img;
  18.       loadimage(&img, "宝船1.jpg", 20, 20);   
  19.       int x = 400, y = 230;    // 初始位置
  20.     while(1)   
  21.     {
  22.       Sleep(50);
  23.       if(GetAsyncKeyState(VK_LEFT))  {    x -= 10;   } // 左移 // 如果按下左键
  24.       if(GetAsyncKeyState(VK_RIGHT)) {    x += 10;   } // 右移 // 如果按下右键
  25.       if(GetAsyncKeyState(VK_UP))    {    y -= 10;   } // 上移 // 如果按下上键
  26.       if(GetAsyncKeyState(VK_DOWN))  {    y += 10;   } // 下移 // 如果按下下键
  27.       putimage(0, 0, &img0);
  28.       putimage(150, 250, &img1);  
  29.       putimage(350, 150, &img2);  
  30.       putimage(x, y, &img);   
  31.     }
  32.     closegraph();   
  33.     return 0;
  34. }
复制代码
换成明航海建立的世界海图,比卫星地图感觉上好一些。(或者叫锦衣卫勘图录。如果叫传教士绘图录,其中不应该有传统中文概念命名残留,更不应该缺少宗教人物色彩的地名称呼,不象是传教士搞的,所以个人假设选择为锦衣卫勘图录。主要时间点是宝船资料失火案)

(需要有一个地图边缘出去,循环从地图另一边出来的什么内容。指定航线的线段,键盘和鼠标点击回车,就进退这个航线,以及出航线之外的自由度航行。船怎么不开到陆地上去呢?整个地图一个图层,陆地一个图层,海洋一个图层,比较按钮区域一样,有这个信息,就停止,无法继续计算移动?)
可以从地图一边进,地图另一边出的循环连接。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. int main()
  7. {
  8.       int H0=640;
  9.       int I0=480;
  10.       initgraph(H0, I0);      
  11.       IMAGE img0;
  12.       loadimage(&img0,"明万国图1.jpg",H0,I0);
  13.       IMAGE img1;
  14.       loadimage(&img1,"猫象1.png",50,50);
  15.   
  16.       IMAGE img2;
  17.       loadimage(&img2,"怪兽1.jpg",50,50);
  18.    
  19.       IMAGE img;
  20.       loadimage(&img, "宝船1.jpg", 20, 20);   
  21.       int H = 400, I = 230;    // 初始位置
  22.     while(1)   
  23.     {
  24.       Sleep(50);
  25.       if(H<0)  {H=H0;  }  //四个方向的地图边界过渡,从地图一边出去,另一边进来。
  26.       if(H>H0) {H=0 ;  }
  27.       if(I<0)  {I=I0;  }
  28.       if(I>I0) {I=0 ;  }
  29.       if(GetAsyncKeyState(VK_LEFT))  {    H -= 10;    } // 左移 // 如果按下左键
  30.       if(GetAsyncKeyState(VK_RIGHT)) {    H += 10;    } // 右移 // 如果按下右键
  31.       if(GetAsyncKeyState(VK_UP))    {    I -= 10;    } // 上移 // 如果按下上键
  32.       if(GetAsyncKeyState(VK_DOWN))  {    I += 10;   } // 下移 // 如果按下下键
  33.       putimage(0, 0, &img0);
  34.       putimage(150, 250, &img1);  
  35.       putimage(350, 150, &img2);  
  36.       putimage(H, I, &img);   
  37.     }
  38.     closegraph();   
  39.     return 0;
  40. }
复制代码
需要参考西欧大航海游戏,进行有益补充丰富。
(地图左右可以圆接,但是南北上下,好像不能连接。地图北极往上,不是南极吧。同样,南极往下,不是北极)

如果是多个人物图片,进行剧情程序设定的移动动作,怎么自动呢?(自动显示和消失一个图片,多个图片,循环多个图片)
把小船换成大船,一个操作界面里,方向舵左几右几操作,也是可以类似潜艇游戏一类的微操效应。

简单图片式空战游戏,起飞部分,天空云层图组合海面图,机枪和导弹发射运动部分,降落部分,统计战绩信息列表和游戏记录存取。
游戏是做不完的,要是有个村社网络中心,进行有限有效区域的游戏玩乐游戏交换就好了,通过间接费用完成大部分分配,少部分直接买卖费用(直接税与间接税)。

TOP

本帖最后由 zzz19760225 于 2024-9-23 08:58 编辑
小游戏可以考虑用.net做 gdi+的面向对象比纯过程的gdi好用些 在winform里集成的也比较好 效率也不会差c++太 ...
jyswjjgdwtdtj 发表于 2024-9-11 22:02

Visual Studio Code(微软代码编辑器)  v1.18.0
看到隐藏什么的,我就试着点了一下,结果越点越少,最后变光板了。得会ctrl+shift+p的命令模式,我不会啊。重新安装,也是继承之前的界面模式=光板。

请问,有什么办法好显示那个初始的标题栏操作条的?




alt按钮
产品文档->网页帮助官方主页->用户界面——介绍 VS Code 编辑器的基本 UI、命令和功能。:
“您还可以使用“视图:切换菜单栏”命令隐藏 Windows 和 Linux 上的菜单栏。此命令设置窗口菜单栏可见性从classic到compact,导致菜单栏移入活动栏。要将菜单栏返回到该classic位置,可以再次运行“视图:切换菜单栏”命令。”

-------------------------------------------------------------------------
C语言读取二进制流gif,进行gif播放的问题。最好是有一种影片模式,可以文字插入修改,可以截取部分,可以有声音,关键是:可以当作图片使用,散装的ff那类影片数据空间内容的图片。
所以目的不应该是播放动画gif,而是文件二进制流的ff影视单元,如何图片式可用。需要三个内容,一个是二进制,这样通用;二是那个ff什么的影片信息数据模式,三是图片化可用(什么,为什么图片就不可以发出声音)。
文件本身需要具有那种结构功能,这种结构功能通过图片这个开关打开,并随着图片关闭而关闭,原理上是可以的。
如果能解决类gif动画或影视单元化,连环画就差不多了。
ffmpeg,在图片的位置读取数值,进行同等空间输出。图片和ffmpeng两个对接就可以了。把ff再散一下,简化输入的形式,文字,绘画或截取影视的单元,原有或后加的声音处理部分。类flash的功能模仿,是有可能的吧。同理是DOS功能需求的模仿,这种模仿反而脱离了原有dos系统的硬件历史内容,bios内容,相对简化的C语言通用化。
如果ffmpeg是二进制流,那么可不可以用所谓的句柄指向指示开关,输出到不同的文字,图片和影视,声音,,然后时空上集中到一个屏幕位置输出。如果可以,这事是可以试着做的。
或者这样想,文件的形式是已有集合,还有未有集合,已有集合的单元找遍了,功能不够用,可以模仿和想象一个虚假外壳的名义内容,通过物质技术劳动去重视,实现其,这样把未有的名义想象假想梦想单元,劳动改造为已有内容,就可以修补需求一点了。
如果按照功能需求的集散,不用ffmpeg呢,就是单纯的声音,图片影视动画,文字,三个程序单元的集合集成呢。低配版,怎么简单怎么来,便于大部分人理解认识制造使用。(要考虑的一个内容是影视内容截取,那么需要再有一个截取的数据文件,与影声文三合一配合起来)
超出年代的相对长远技术,与年代技术里通用,组用,专用的类集合关联关系。
吃快食与满满吃的(胃就那么大,吃饱了换人),利益比较下的选择趋向趋势习惯。

TOP

返回列表