发新话题
打印

[求助]关于策略游戏的人物移动?

[求助]关于策略游戏的人物移动?

大家都应该玩过策略游戏吧,那些每回合走方格的动作如何能做到?

TOP

难。走方块不难,但是RTS走方块就很难。你看连星际里的小可怜走路都比较白痴……到War3才解决问题 先看看那个问场景移动问题的贴,后面有说最简单的鼠控 再看看下面的A*的贴,介绍了A*寻路,很着重讲解了即时策略的寻路

TOP

你误会了,我不是要做那种即时策略,我是要做那中回合策略的那种!

TOP

呵呵,楼上,道理是一样的,同样都是搜索最短路径

TOP

恩,想知道什么呢? 比如,求某角色当前移动范围?

TOP

是,你都应该玩过跑格仔的回合策略游戏吧!那些没回合能够移动的范围是怎么做的?(在线等待)

TOP

- -计算……
假如有一张 xmax * ymax 大小的地图(2维数组表示) ,每个格子都有一个标志位,开始置为该格的行动力消耗。 现计算第 x,y 格一个行动力 N的角色的移动范围: 首先自己占地x,y格置0,可以达到。
我们开始N次循环:每次把当前的边缘所有格子行动力消耗-1,直到行动力消耗=0,就把该格置为“可到达”并且扩展边缘。
N次之后,图上所有可以到的地方标志都是0。

TOP

怎么说呢,就像这样:

如下表: 1是草地,2是树林,3是山脉。
1 2 1 1 1 1 1 2 1 2 2 1 1 1 1 1 2 2 3 1 1 1 1 1
现在我们在A处有一个移动力 4的单位:
1 2 1 1 1 1 1 2 1 2 2 1 1 1 A 1 2 2 3 1 1 1 1 1
第一轮循环: 1 2 1 1 1 1 1 2 0 2 2 1 1 0 A 0 2 2 3 1 0 1 1 1
第2轮循环: 1 2 0 1 1 1 1 1 0 1 2 1 0 0 A 0 1 2 3 0 0 0 1 1
第3轮循环: 1 1 0 0 1 1 0 0 0 0 2 1 0 0 A 0 0 2 2 0 0 0 0 1
第4轮循环:如图为0的区域都是可以走的。 0 0 0 0 0 1 0 0 0 0 1 1 0 0 A 0 0 1 1 0 0 0 0 0
具体算法方面,自己设计拉…… 我是把所有当前边界格子保存到一个Object里,每轮所有边界权-1,如果权=0 ,该边界被移除,同时相邻的没有检测过的格子入Object。

TOP

这样做太复杂了吧 ,发我要做的文件给你,请指教,这个文件我是修改你的贴子代码改的,想改成用鼠标控制,就是在范围内,按下鼠标让主角移动到指定的位置!并可以得到主角在场景的位置.谢谢!http://www.xinmaa.com/1.fla

TOP

那张脸有什么用啊? 1 对于主角来说,他的_parent就是场景,所以主角在场景中的位置就是他的 _x 和_y。鼠标在场景中的位置就是 _root.场景._xmouse 和_ymouse。在主角身上也可写为:_parent._xmouse这样。 2 你这张图 - -本身就是凸多边形……所以不需要考虑障碍 3 所以照着做到26楼可以完成一半。
但是点击不准确。也就是说,要求到哪格他不一定到那格。 [upload=fla]viewfile.asp?ID=89257[/upload]

附件

200411611251784936.swf (2.4 KB)

2004-1-16 19:25, 下载次数: 68

20041161125745868.fla (41.5 KB)

2004-1-16 19:25, 下载次数: 80

TOP

为什么会移动不准呢?
你看看我写的移动策略:不停的移动,直到超过目标点就停下来。(我把那贴修改了一下,应该是超过或者等于)问题是你的策略不是真实移动而是按格移动,所以不准确:比如我叫他上移一格的话,如果点到他上面那格的中间偏右一点,他就移动到右上方的格子了。
怎么修改呢?我们通过取整,把目标修改为实际那格的中心点。
首先在初始化的时候得到一个标准位置: xBase =_x ; yBase =_y; 这个 xBase 和 yBase 肯定是某格中心,因为主角一开始就停在上面。
你主角的注册点正好是主角的中心,那么每格的范围就是 中心 +/- speed/2
引用:
onClipEvent(mouseDown){ //注意_xmouse是相对于场景的 var x = _parent._xmouse- xBase; var y = _parent._ymouse- yBase; if(x>0) x = int((x+ speed/2)/speed); else x = int((x - speed/2)/speed); if(y>0) y = int((y+speed/2)/speed); else y = int((y- speed/2)/speed); var tarX = x*speed +xBase ; var tarY = y*speed +yBase ; trace(x+ " "+y); }
圆整就这么做。
= =还有一个问题就是……你的格子数据都是小数啊……flash计算小数误差很大,会自动圆成某些数的……所以移动函数还需要一些误差消除……我这里允许误差在1/4步长之内。
看文件把…… [upload=fla]viewfile.asp?ID=89271[/upload]

附件

200411612192535779.fla (36 KB)

2004-1-16 20:19, 下载次数: 79

200411612193472473.swf (2.48 KB)

2004-1-16 20:19, 下载次数: 58

TOP

对不起,那张面就是主角的位置,我是想(点击了范围内的方格,那张面就移动到那个位置),还是谢谢你的帮忙!

TOP

你把那张面复制到主角的mc里面啊

TOP

路还很长,走好 slg的精髓在于平衡。。。虽然没玩过eq,不过仇恨列表真的是个好创意,slg里面能加进去就能平衡好多

TOP

版主大人,小弟要做的效果是这样的,但是不知道怎么会跑到其他地方了,请帮忙!还请版主把代码的说明标明一下,小弟对as不是那么熟悉的,谢谢帮忙! http://www.xinmaa.com/2.fla


[flash=500,350]http://www.xinmaa.com/2.swf[/flash]

TOP

引用:
以下是引用八格四在2004-1-17 22:23:31的发言: 路还很长,走好 slg的精髓在于平衡。。。虽然没玩过eq,不过仇恨列表真的是个好创意,slg里面能加进去就能平衡好多
虽然没有玩过eq(EverQuest?)不过很想知道什么是仇恨列表?

TOP

= =你那个新的格子都没有对准啊……那怎么按格子走啊? 这里是不按格子走的。
mc的层次关系没搞懂啊……再看一次那个贴把…… [upload=fla]viewfile.asp?ID=89764[/upload]

附件

20041181831181434.fla (42.5 KB)

2004-1-19 02:31, 下载次数: 76

TOP

看来版主一直是误会了我的意思,请看这个flash [flash=500,350]http://www.xinmaa.com/flash/rpg.swf[/flash]
我是想用户按下移动后,显示可以移动的范围,当选择移动的地方后,主角移动到那个地方,移动范围消失,用户再按移动后又显示移动范围,再选择移动!还是谢谢帮忙
原文件在这里

http://www.xinmaa.com/flash/rpg.fla

TOP

= = 那个跟我上面那个贴一点关系都没有……根本就是不能用…… 这种游戏……只能照着我一开始回复的那个算法……
呼……先放放罢……我有一个slg的库,写了一天,半成品,以后有时间完成了之后放出来
还是建议自己写的试试,不要怕麻烦~~

TOP

那么先谢你了~~~我先写其他的登录呀什么的,以后还要大哥你帮忙~~~谢谢~~~~

TOP

问题都解决了!我找到了方法!

[upload=fla]viewfile.asp?ID=91067[/upload]

附件

200413110513011063.fla (16.5 KB)

2004-1-31 18:51, 下载次数: 77

TOP

好!

TOP

if (tarX !=undefined){
                //trace(tarX+ " "+_x);
                if(tarX > _x+ speed/4) {
                        xinc = speed;
                        if(_x+xinc >= tarX) tarX = null;
                }else if(tarX < _x-speed/4){
                        xinc=-1*speed;
                        if(_x+xinc <= tarX) tarX = null;
                }
        }
        if (tarY !=undefined){
                if(tarY > _y+ speed/4) {
                        yinc = speed;
                        if(_y+yinc >= tarY) tarY = null;
                }else if(tarY < _y -speed/4){
                        yinc=-1*speed;
                        if(_y+yinc <= tarY) tarY = null;
                }
        }
这代码中的tarY和tarX是指代什么,看不懂,谁教教我

TOP

发新话题