铁血丹心

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

问一下pascal复刻版第三类事件触发的问题

[复制链接]
发表于 2011-5-5 22:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 怪羊基德 于 2011-5-6 01:29 编辑

我最近想重温一下再战江湖以及再破菠萝。dos版运行不了,所以就下了复刻版玩
但是复刻版有一个比较麻烦的问题:每次人物行走到第3类事件触发点(而又没有触发)时就会停下来,得松开方向键再按下方向键才能继续移动。比如说再战江湖里面的山洞随机遇山贼,菠萝里面的随机遇敌。

我想尝试着修改源码解决这个问题。先想到是由于procedure CheckEvent3中的function WaitAnyKey导致的(checkevent中这个个waitanykey原本好像是用来防止按得太快错过事件)。但是我把checkevent3 中的那句waitanykey删掉以后问题依然没有解决。还是会停一下。

哪位高手指点一下,这个移动中停一下是怎么导致的?lua版和原版好像没有这个问题。后来基于Pascal版的前传好像也没有这个问题。是不是与50指令有关?应该怎么解决?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-5-5 22:42 | 显示全部楼层
第一,waitanykey有2个地方
第二,注意事件触发那(几)个功能,文件是及时读取的,由于没有预读,所以会有停顿
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-5-6 01:29 | 显示全部楼层
明白了,原來是procedure CallEvent後面的這個SDL_EnableKeyRepeat(50, 30)惹得祸。看到这个函数名还以为是允许按键。网上查了一下才知道原来是设定按键间隔......
另外,把事件全部在启动时预读果然可以在触发点的时候快不少。
多谢解答!!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-5-6 02:33 | 显示全部楼层
我在google code里面建了一个工程,看看能不能把多人的修改都提交进去
http://code.google.com/p/kys-jedisdl/

点评

琢磨了以下,没有弄明白这个东西是干什么用的。好像是做api的。他可以把多人的修改汇合吗?我非计算机科班出生,彻底不明白这个  发表于 2011-5-6 18:26
兼容嘛~?  发表于 2011-5-6 02:37
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-5-6 03:25 | 显示全部楼层
本帖最后由 怪羊基德 于 2011-5-6 04:17 编辑

晕,现在随机遇敌打完仗后就死机。。
终于搞定了!!居然都4点了...
把procedure CallEvent后面的四行代码
InitialScence;
  redraw;
  sdl_updaterect(screen, 0, 0, screen.w, screen.h);
  SDL_EnableKeyRepeat(50, 30);

全部移动到战斗事件(function instruct_6)后面就好了。(其他包括开箱子、子地图内出现消失物体什么的事件后面也加上这段)
这样,只有在触发这些有必要重汇地图或重新定义鼠标的事件后,才重汇地图以及重新定义鼠标有效间隔。就不会造成走路卡了。

至于预读事件信息,貌似影响很小。

点评

应该是不会闪的,我记错了~  发表于 2011-5-6 13:24
为什么原来的不需要,但你改后才需要呢,有没有想过这问题。另外,redraw跟updaterect有没有重复,不会闪屏么  发表于 2011-5-6 13:24
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-5-6 14:34 | 显示全部楼层
本帖最后由 怪羊基德 于 2011-5-6 18:56 编辑

不是我改后才需要呀。我后面说的这个就是针对原始的程序而言。本来重汇地图语句和重新定义按键在calevent后面,这样无论触发什么事件都会运行这两句。而这两句话会使得连续按键中断,因此就导致了我一开始说的问题。
但是这两句话又不能直接删掉。一方面,战斗指令会让连续按键永久失效,所以后面必须用sdl-EnableKey重新允许连续按键。另一方面,有些事件比如说开宝箱会使屏幕中贴图改变,所以此时必须重汇,否则无法看到改变。
基于以上几点,我就把本来放在事件之后重置语句放在一些具体的指令后面,这就解决了在事件触发点走过时卡的问题(此时压根没有运行那两句导致卡的命令,当然就不会卡了)。

现在玩起来比较正常了,终于可以去好好重温当年的感觉了


NameSDL_EnableKeyRepeat- Set keyboard repeat rate.
Synopsis#include "SDL.h"
int SDL_EnableKeyRepeat(int delay, int interval);
DescriptionEnables or disables the keyboard repeat rate. delay specifies how long the key must be pressed before it begins repeating, it then repeats at the speed specified by interval. Both delay and interval are expressed in milliseconds.
Setting delay to 0 disables key repeating completely. Good default values are SDL_DEFAULT_REPEAT_DELAY and SDL_DEFAULT_REPEAT_INTERVAL.
Return ValueReturns 0 on success and -1 on failure.
戰鬥中會把key repeating關掉,所以戰鬥結束後要重新打開

点评

对呀,就是这样。我估计作者把重置的功能放到整个事件的最后是为了提高效率,因为这样一个事件只用执行一次这个语句。但是忽略了那个语句在重新定义按键的时候会把按键中断。我做的事情就是你说的在战斗指令后面加上   发表于 2011-5-7 23:46
为什么不在战斗中修改呢~战斗关掉key repeat,没有复位,就是战斗那个功能的错了~  发表于 2011-5-7 21:11
SDL_EnableKeyRepeat这个函数定义后就会一直有效,知道下一个SDL_EnableKeyRepeat重新定义。所以当判断3类时间无明显效果后,反而不需要这个函数  发表于 2011-5-6 18:19
SDL_EnableKeyRepeat(delay,repeat)这个函数的作用是按下键后delay的时间开始进入连续按键,并且连续按键的频率是repeat。  发表于 2011-5-6 18:18
不是,是战斗中有地方会重新定义SDL_EnableKeyRepeat,以致于战斗结束后就不能正常行走。所以必须加上那两句重新定义连续按键。  发表于 2011-5-6 18:16
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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