Project1

标题: 求教一个效果的实现方法,SLG用 [打印本页]

作者: Innelysion    时间: 2011-4-19 16:45
标题: 求教一个效果的实现方法,SLG用
本帖最后由 Innelysion 于 2011-4-19 16:46 编辑



如上图那样,类似flash_data的样子,但可用自定义的不同图片(能用动画/循环图片的话更好)而且不会掉帧得太厉害……球实现方法或制作思路,先谢了……
作者: moy    时间: 2011-4-19 19:58
不太理解什么意思...不过可以参考一些现成的战棋脚本看看人家怎么写的.
作者: 禾西    时间: 2011-4-20 06:30
有些東西因為太簡單而大家不屑于使用,我們只好把他放在黑幕當中~
http://rpg.blue/thread-84595-1-1.html
當然,速度沒有經過優化。
影響幀率的最大兇手是 zoom、angle、和 mirror,你把某四行注釋掉還是很快的。二十五個動畫左右不怎麼掉幀,一百個大概還能有15幀- -b
作者: Innelysion    时间: 2011-4-20 17:20
本帖最后由 Innelysion 于 2011-4-20 17:21 编辑

>moy
就是地图图块上附带一层或数层额外的图形,必要的时候描绘出来或者事先全部生成,必要时再显示出来,用于标示特殊地区或移动攻击范围啥的……自带的flash_data因为找不到比较完善的tilemap重写所以难以达到需要的效果……

>禾西
啊啊禾西大已经救过我不止一次了vT
这个动画加强脚本已经在用了!一些界面和特效类的地方能极大提高视觉效果(差点想做全动画菜单)!!但像这些用处一次要大量生成该怎么写,还有脚本里的坐标是相对于屏幕的,怎么能让其锚定在图块上……

我还有另外一种想法是在整个地图上覆盖额外几层自动元件(4帧动画已经够了),需要的时候显示其中的一部分。不过还是那个……写脚本苦手vT

作者: 禾西    时间: 2011-4-21 12:06
站上有重寫 tilemap 的范例- -。
不過其實生成一個和地圖等大的viewport,把viewport的x值和y值和地圖的display_x、display_y掛鉤(計算程序在Spriteset_Map中),然後用這個viewport來生成批量動畫(雙重的 for 語句),然後就可以了。viewport移動,內部的sprite也會移動的。

當然還能用自動元件做,怎麼修改地圖元件,看遠景圖做地圖的教程吧,置頂帖有傳送門。
作者: 心雪    时间: 2011-4-21 16:03
本帖最后由 心雪 于 2011-4-21 16:29 编辑
  1. class Game_Character
  2.   #------------------------------------------------------
  3.   # ● 可以到达的位置
  4.   # ! 返回数组
  5.   # ! 递归调用
  6.   # x 当前x坐标
  7.   # y 当前y坐标
  8.   # s 当前步数
  9.   # a 当前数组 初始调用设置为nil
  10.   #------------------------------------------------------
  11.   def can_get(x = @x,y = @y,s = 10,a = nil)
  12.     #如果当前位置被用更少的步数走过,返回
  13.     if a == nil
  14.       a = Table.new($game_map.width,$game_map.height)
  15.       for i in 0...a.xsize
  16.         for j in 0...a.ysize
  17.           a[i,j] = -1
  18.         end
  19.       end
  20.     end
  21.     if a[x,y] != nil
  22.       if a[x,y] >= s
  23.         return a
  24.       end
  25.     end
  26.     #如果步数用尽,返回
  27.     if s < 0
  28.       return a
  29.     end
  30.     #添加当前位置
  31.     a[x,y] = s
  32.     #如果右方可以通行
  33.     if x < $game_map.width - 1
  34.       if passable?(x,y,6)
  35.         can_get(x+1,y,s-1,a)
  36.       end
  37.     end
  38.     #如果左方可以通行
  39.     if x > 0
  40.       if passable?(x,y,4) && x > 0
  41.         can_get(x-1,y,s-1,a)
  42.       end
  43.     end
  44.     #如果上方可以通行
  45.     if y < $game_map.height - 1
  46.       if passable?(x,y,2)
  47.         can_get(x,y+1,s-1,a)
  48.       end
  49.     end
  50.     #如果下方可以通行
  51.     if passable?(x,y,8) && y > 0
  52.       can_get(x,y-1,s-1,a)
  53.     end
  54.     return a
  55.   end
  56. end
  57. class Game_Map
  58.   attr :color_area
  59.   attr :need_refresh_color,true
  60.   alias _snow_heart_setup setup
  61.   def setup(*arg)
  62.     _snow_heart_setup(*arg)
  63.     @color_area = Table.new(width,height)
  64.     @need_refresh_color = false
  65.   end
  66.   def color_area=(v)
  67.     @color_area = v
  68.     @need_refresh_color = true
  69.   end
  70. end
  71.   
  72. class Spriteset_Map
  73.   alias _snow_heart_initialize_ initialize
  74.   def initialize
  75.     _snow_heart_initialize_
  76.     @color_sprite = []
  77.   end
  78.   alias _snow_heart_update_ update
  79.   def update
  80.     update_color
  81.     _snow_heart_update_
  82.   end
  83.   def update_color
  84.     #刷新图片,添加动画可以在这里写
  85.     if $game_map.need_refresh_color
  86.       refresh_color
  87.       $game_map.need_refresh_color = false
  88.     end
  89.   end
  90.   def refresh_color
  91.     for i in @color_sprite
  92.       i.dispose
  93.     end
  94.     for i in 0...$game_map.color_area.xsize
  95.       for j in 0...$game_map.color_area.ysize
  96.         if $game_map.color_area[i,j] > 0
  97.           sc = Sprite.new(@viewport1)
  98.           sc.z = 0
  99.           sc.bitmap = Bitmap.new(32,32)
  100.           sc.bitmap.fill_rect(0,0,32,32,Color.new(0,0,255,128)) #此处可修改风格
  101.           sc.x = (i*128 - $game_map.display_x + 3) / 4 + 16
  102.           sc.y = (j*128 - $game_map.display_y + 3) / 4 + 32
  103.           sc.ox = 16
  104.           sc.oy = 32
  105.           @color_sprite.push(sc)
  106.         end
  107.       end
  108.     end
  109.   end
  110. end
复制代码
制作SLG是个非常麻烦的工程……Good Luck
测试方法:
$game_map.color_area = $game_player.can_get
把脚本从VX改到XP好纠结=,=
------------------------------------------------------------
发现一错误……已修改,注释不小心写错了导致转成XP脚本时写错方向……看来注释也是不能马虎呢~
作者: Innelysion    时间: 2011-4-22 17:38
谢谢禾西和心雪的指点,今天一早等小圆脸等到忘记看了,脚本和思路收回去慢慢磨……
自己用RM做SLG的确是太蛋痛了,到时看看ttp://www.hitpoints.net/tcv2/index.html这个软件好不好用……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1