铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3714|回复: 10

[通用] LUA版,点XX退出

[复制链接]
发表于 2010-3-16 19:22 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 jy02785317 于 2010-8-18 11:12 编辑

首先需要修改
  1. 雪莓  19:02:30
  2. 修改api函数如下

  3. // 得到前面按下的字符
  4. int JY_GetKey()
  5. {
  6.     SDL_Event event;
  7.         int keyPress=-1;
  8.         int x,y;
  9.     while(SDL_PollEvent(&event)){   
  10.                 switch(event.type){
  11.                 case SDL_QUIT:
  12.                         if (MessageBox(NULL,"are you sure to quit?","make sure!",MB_ICONQUESTION|MB_OKCANCEL)==IDOK){
  13.                                 ExitGame();       //释放游戏数据
  14.                                 ExitSDL();        //退出SDL
  15.                                 return 0;
  16.                         }
  17.             break;


  18. 只给出了一部分
复制代码
这样在点击XX时就会弹出对话框询问是否退出

当然,我觉得其实应该返回一个特定的数值,让lua去处理,去询问是否退出,这样做更好一些
但是,lib.GetKey()在脚本里没有被封装,大多数时直接使用lib.GetKey(),只有需要等待按键时,才使用WaitKey(),所以,如果要交给lua处理,脚本里需要修改的地方就有点多了(我自己写的不少小游戏里都是直接用的lib.GetKey())....所以,偷懒就直接在c里处理了

[发帖际遇]: jy02785317协助郭靖守护襄阳多年,得郭靖称赞,增加声望4。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-3-16 19:38 | 显示全部楼层
原帖由 jy02785317 于 2010-3-16 19:22 发表
首先需要修改雪莓  19:02:30
修改api函数如下

// 得到前面按下的字符
int JY_GetKey()
{
    SDL_Event event;
        int keyPress=-1;
        int x,y;
    while(SDL_PollEvent(&event)){   
                switch(event.type) ...


LZ的方法或许不对,出现内存错误
  1.         case SDL_QUIT:
  2.             if (MessageBox(NULL,"Are You Sure to Quit","Confirm",MB_ICONQUESTION|MB_OKCANCEL)==IDOK){
  3.                 ExitGame();       //释放游戏数据
  4.                 //ExitSDL();        //退出SDL
  5.                 //return 0;
  6.             }
  7.             break;
复制代码

注释掉两句似乎可以解决,但是不知道是否完全清干净内存了

[发帖际遇]: aawc1144相助张召重对抗陈家洛,不料落入红花会埋伏,被打得落荒而逃,损失银两18。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-3-16 19:41 | 显示全部楼层
我都直接按alt+ctrl+del關閉
不這樣做,速度實在是......

[发帖际遇]: gn0811替小昭千里送信给张无忌,赶到光明顶得到奖励银两33。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-3-17 00:10 | 显示全部楼层
007测试员酷呆了,这么细的问题~
原来按X没反应,要键盘“离开游戏”才退出

为什么注释了下面两句,反而能清除内存??
//ExitSDL();        //退出SDL
//return 0;

alt+ctrl+del
太幽默了


[发帖际遇]: 夏海抓了很多毒物给阿紫练功,获奖赏银两29两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-3-17 00:41 | 显示全部楼层
to LS

没看清黄大的话,仔细再看一遍吧~~

另外gn的做法很正确,我也是这么做的
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-7 14:34 | 显示全部楼层
我又来挖坟了,确实现在苍炎和龙的传人都不能点X退出,加这个就好用了
既然已经是强制非法退出了,那么释放资源之后为什么还要return 0;呢, 改成 exit (1);   不就好了么
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-10 12:42 | 显示全部楼层
本帖最后由 else 于 2011-12-11 16:35 编辑

回复 jy02785317 的帖子

  其实,C里面只返回特定值,而在GetKey函数上面封一层还是比较简单的
C里面只需这样


  1. while(SDL_PollEvent(&event)){   
  2.   switch(event.type){   
  3.         case SDL_QUIT:
  4.    return g_ExitEventCode;
  5.             break;
复制代码

LUA里面是这样


  1. GetKey = lib.GetKey;
  2. lib.GetKey = function(...)
  3.   local key = GetKey(...);
  4.   if (key == -2) then
  5.    -- 加入某些可以退出的代码
  6.   end
  7.   return key;
  8. end
复制代码

至于可以退出的LUA代码,一开始我想是这样
  1. JY.Status = GAME_END;
复制代码

在Game_Cycle里可以退出;但是在菜单里,对话中和战斗中都不能立即起作用。这些地方用的是while true do 循环,没有特定条件是不能退出的。如果能把它们改成while JY.Status ~=GAME_END do 就好了,可惜在jymodify里面不能做这么大的改动。
后来发现下面的语句是有效的,但是不知道系统资源能不能清除,还没时间看。
  1. coroutine.yield();
复制代码

另外,在退出时加上一个可以反悔的菜单是好的。最后LUA端的CODE大概是这样,
  1. local GetKey = lib.GetKey;
  2. lib.GetKey = function(...)
  3.   local key = GetKey(...);
  4.   if (key == -2) then
  5.    local menu={  {"按错了..",nil,1}, {"离开游戏",nil,1}};
  6.    local menux=CC.ScreenW-4*CC.StartMenuFontSize-2*CC.MenuBorderPixel
  7.    local menuReturn=ShowMenu(menu,2,0,menux,20,0,0,0,1,CC.DefaultFont,C_ORANGE, C_WHITE)
  8.    if menuReturn == 2 then
  9.     coroutine.yield();
  10.    end
  11.   end
  12.   return key;
  13. end;
复制代码

菜单还有些小问题,在没有菜单的情况下弹出不能清除,得走一步才行,先这样,没时间了。

只要一点就退出的话只要下面这样

  1. GetKey = lib.GetKey;
  2. lib.GetKey = function(...)
  3.   local key = GetKey(...);
  4.   if (key == -2) then
  5.    coroutine.yield();
  6.   end
  7.   return key;
  8. end;
复制代码

评分

参与人数 1声望 +5 收起 理由
winson7891 + 5 期待完善版本

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-11 20:09 | 显示全部楼层
这确实是个问题
以前每次都要任务管理器~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-11 16:19 | 显示全部楼层
回复 else 的帖子

高手= =。。。。完全看不懂思密达-。-
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-17 12:19 | 显示全部楼层
LUA版以后都改成点XX退出吧,支持
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-19 20:35 | 显示全部楼层
实际上我上个帖子里的 “coroutine.yield(); ” 出错了,是个出错退出,在debug.txt里有。
可以用 os.exit() 退出,没有出错信息,但是貌似不会回到C中继续执行。
所以我认为最理想的在lua中退出的方式还是应该利用 “JY.Status = GAME_END; ” 来正常退出,可是这样就必须修改大部分 while true do 循环为 while JY.Status ~=GAME_END do 。



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-12-22 13:01

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表