|
|
游戏编程,技术讨论 第五章 : unit design
[复制链接]
|
|
|
发表于 23-5-2008 05:57 PM
|
显示全部楼层
回复 78# tensaix2j 的帖子
這個我覺得就用你的tile array咯
你build你的map時一定會有個2-dimension的array來define每一個tile應該放什么的吧
就用那個來查看下一個行走的tile是什么樣的terrain |
|
|
|
|
|
|
|
|
|
|
发表于 23-5-2008 08:53 PM
|
显示全部楼层
terrain,要看你要做的是2D还是3D的游戏啰,2D的一般上都是用tile,不然就是free form + bounding box或者polygon。也就是像整个地图使用手绘的,然后第二层是树木、建筑物,而这些树木和建筑物都有个bounding box或者polygon围绕着,当玩家(或NPC)移动时,就检测是否和这些bounding box发生碰撞,然后再检测物件是在polygon 外(可以移动)还是在里面或者和polygon边缘接触(无法移动)。更进一步的,可以检测物件移动方向和polygon edge normal 的方向,可以做出sliding效果,就好像玩家碰撞物件后会自动滑向一边,避开物件之类的。这个方法可以产生比较自然和多样化的地形。
要研究tile base地形的,你可以去下载RPG Maker来玩玩,包给你许多启发。
3D的除了刚才所说的Polygon/bounding box之外,还可以靠检测构成地面的model 的polygon surface 的normal,如果地面倾斜度超过一定的角度,就不能通过。还有,被附上特定texture的polygon也可以被设定为不能通过(水面,墙壁等)也是一个方法。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-5-2008 04:40 PM
|
显示全部楼层
原帖由 Squall_Chua 于 23-5-2008 05:54 PM 发表 
我有想過這個問題了
我想到的解決方法是如果它要到的位子被其他object占據的話
它會找個離那個位子最近的地方停下來
還有它在行走時如果碰上前面的object的話
我看得出你的implementation是等前面那個object走開 ...
关于那个 四方的 tile ,如何 弄圆一点。。。
用了一个搞笑的方法,要不要看看。。 
test04
[ 本帖最后由 tensaix2j 于 24-5-2008 04:42 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-5-2008 04:41 PM
|
显示全部楼层
原帖由 Squall_Chua 于 23-5-2008 05:57 PM 发表 
這個我覺得就用你的tile array咯
你build你的map時一定會有個2-dimension的array來define每一個tile應該放什么的吧
就用那個來查看下一個行走的tile是什么樣的terrain
这正是我要做的,
你们还有什么其它的想法吗? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 24-5-2008 04:44 PM
|
显示全部楼层
原帖由 geekman 于 23-5-2008 08:53 PM 发表 
terrain,要看你要做的是2D还是3D的游戏啰,2D的一般上都是用tile,不然就是free form + bounding box或者polygon。也就是像整个地图使用手绘的,然后第二层是树木、建筑物,而这些树木和建筑物都有个bounding box或 ...
会研究看看。。。  |
|
|
|
|
|
|
|
|
|
|
发表于 24-5-2008 06:52 PM
|
显示全部楼层
回复 83# tensaix2j 的帖子
打開來看時我還以為你是用rounded rectangle畫的
去翻你的sprite來看就知道是用image畫的
效果是感覺不錯了
但是卻又慢了 |
|
|
|
|
|
|
|
|
|
|
发表于 27-5-2008 07:51 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 27-5-2008 10:51 PM
|
显示全部楼层
谢谢 jangan兄。。。 哈哈。。。难得
分享更新
test05
成功完成 初步的 障碍绕道,简单的障碍可以绕过,
复杂的就比较困难 ,本来想 implement A*的, 但 后来发现会很慢。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 29-5-2008 09:38 AM
|
显示全部楼层
|
tensaix2j兄 , 你的程式是用TCL写的吧?请问要如何运行你的程式? 要先安装TCL ? |
|
|
|
|
|
|
|
|
|
|
发表于 29-5-2008 09:44 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 29-5-2008 08:19 PM
|
显示全部楼层
回复 88# tensaix2j 的帖子
我的电脑最近坏了
所以没办法继续做
不过我之前用C++写了A* algorithm
我觉得走得很快啊
而且还是刚写出来的draft version
还没有optimize的
你是怎么样让那些sprite走path finding的?
只要让它们走一次path finding algorithm其实就够了 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 29-5-2008 08:39 PM
|
显示全部楼层
#回 文世杰
是的, 是 tcl 没错。
不需安装tcl 。因为我在test01 有送 interpretor (大概 1.3 mb)
tcl 就是有这个 packaging 方便的好处, 基本上可以 只package 有用到的 libraries as 一个 kit, 跟interpretor一起package 。。就变成一个 self contained 的 package 了
第二个好处是,有一个 tcl byte code compiler。可以增加performance
http://www.usenix.org/publicatio ... rs/lewis/index.html
第三个好处是 需要什么extended library ,可以很简单的 用 C 弄出来。丢进它library 的folder 就可以了
第四个好处, 基本上 大多数的 linux distro 都有 tcl 。
你只需要 把 extended library 丢进 /usr/share/tcl 里头。就可以用了。
从何开始?
这里
http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html
[ 本帖最后由 tensaix2j 于 29-5-2008 08:57 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 29-5-2008 08:56 PM
|
显示全部楼层
原帖由 Squall_Chua 于 29-5-2008 08:19 PM 发表 
我的电脑最近坏了
所以没办法继续做
不过我之前用C++写了A* algorithm
我觉得走得很快啊
而且还是刚写出来的draft version
还没有optimize的
你是怎么样让那些sprite走path finding的?
只要让它们走一次path ...
一次够吗?
因为 ,半途可能会遇到 阻拦。
而且,你是给一个物件, 还是一群的物件做 A*
不过 跟你聊聊下, 突然想到 另一个 叫做
greedy search 的 algorithm ,可能可以试试看。。。
基本上 greedy search 就是 只用 A* 里用的 cost component,
[ 本帖最后由 tensaix2j 于 29-5-2008 10:19 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 30-5-2008 10:54 PM
|
显示全部楼层
回复 93# tensaix2j 的帖子
我的想法是当你click的时候
先找出一条path出来
放在那个object的一个list里面
让它跟着那条路走
如果中途遇到障碍的话
就从它的list中找出个下一个没有障碍的位置
做一个短途的path finding
也就是简单的绕路而已
或者是碰到会移动的object的话
你也可以选择等一等
我觉得酱子应该会好很多了
只用cost来算的话
这个就是Dijkstra's algorithm
不过它不适合在这种grid上面做path finding
A* 因为有heuristic cost
所以应该会比较快
你可以写两个出来比较看看的
我觉得Dijkstra's algorithm比较适合用在graph上面
而A*比较适合用在这种2-dimensional grid上面
我不久前就想过了它们的分别
以上是我得到的结论
 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 31-5-2008 12:00 AM
|
显示全部楼层
说的有道理
不过 要怎么尽快 知道 “此路不通”
因为 A* 若没找到 目的地的话, 就会一直expand search node 到怎个map。 |
|
|
|
|
|
|
|
|
|
|
发表于 2-6-2008 12:38 PM
|
显示全部楼层
回复 95# tensaix2j 的帖子
這種shortest path algorithm就是這樣的啦
如果你要optimize的話
可能你可以放一個maximum distance進去
如果超過預定的距離的話就不要繼續search了
這個你可以用heuristic cost來預測
不過數目可能要大一點
 |
|
|
|
|
|
|
|
|
|
|
发表于 21-6-2008 12:20 PM
|
显示全部楼层
分享以下以前做游戏的一点记忆。。。
在地图上,人物先 ‘霸位’ 把要去的地方霸住,让别人不能去,
直到完全站在新的地方,才把没有用到的放开
[0] [1] [2] [3] [4]
[1] [A] [A] [3] [4]
[2] [A] [A] [3] [4]
[3] [1] [2] [3] [4]
如果 A 要从 1,1 到 1,3
[0] [1] [2] [3] [4]
[1] [A] [A] [A] [4]
[2] [A] [A] [A] [4]
[3] [1] [2] [3] [4]
然后
[0] [1] [2] [3] [4]
[1] [1] [A] [A] [A]
[2] [1] [A] [A] [A]
[3] [1] [2] [3] [4]
最后是停止
[0] [1] [2] [3] [4]
[1] [1] [2] [A] [A]
[2] [1] [2] [A] [A]
[3] [1] [2] [3] [4]
而移动的路线需要每一步都计算,
从目前的位置到终点的 ‘最佳’ 路径,直横斜,
甚至需要 ‘命令’ 别的物体移动让位。。。
不在交叉路口设定 way point node 是为了让地图的 editor 比较简单。
而高低地则以 1 个 level 的差距可以 ‘走’ 2 个则不可以走。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 14-7-2008 03:08 PM
|
显示全部楼层
謝謝樓上的分享。。。
我的這個 RTS 要 暫停一下。。。
現在 在 想著 一個東西。。
是有關 socket 的。
我想請問關于 socket server/client 在 游戲上的 protocol
基本上 我有一個 socket server 還有 multiple clients,
就說 10 個好了。。。
請教的是, 游戲上, 你們會怎么安排 什么時候該send packet
例如
我的想法
某 玩家A 按了 個 左鍵keydown 。。。。 就send 一個packet
{ userA left down} 給server, server 就送給其它玩家。。。
別個users 收到這些 packet, 就在自己的機器上控制玩家A的avatar 。。
玩家 A, release W 建key, 又在 send 一個 。。。
{ userA left up } 的packet , 然后 , 別人收到后就停止玩家A的avatar。。。
問題來了。。。
若 keyup的那個packet 失蹤了。。。
其他玩家是否看到 玩家A的avatar 不停的走呢??
還是有其他做法? |
|
|
|
|
|
|
|
|
|
|
发表于 15-7-2008 05:44 PM
|
显示全部楼层
回复 98# tensaix2j 的帖子
server/client的東西我也不是很懂該怎麼design
不過如果如你上面說的只有10個client的話
那麼你可以考慮用tcp connection
雖然可能會慢一點
不過沒有packet loss的危險
對於比較大型的server就不行了
只能用udp
但是要怎麼synchronize我也不是很懂
又要顧及delay |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 15-7-2008 08:26 PM
|
显示全部楼层
基本上我是不論 tcp 或 udp 。。
因為 玩家 A 有可能 按了鍵后,keydown event send 出去后
其他玩家都 收到了 這個event 的packet。。
玩家A 突然 disconnect
那么 其他玩家 再也不會收到 玩家A 的keyup event packet。。
那么 就 看到 玩家 A 一直 不停的走。。。
這個情況 就是沒有packet loss ,但還是出狀況 |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|