设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

以一个程序设计的角度来看这个RPG引擎

查看数: 6792 | 评论数: 31 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2013-5-9 13:07

正文摘要:

本帖最后由 爆发的妞 于 2013-6-21 10:55 编辑 小弟在学习这个rpg marker 引擎, 感觉有好多值得学习的地方。 问的也都是一些基础简单的问题。 小弟有个想法, 有好多高手经验都比较丰富。 对于引擎里面的脚本 ...

回复

灼眼的夏娜 发表于 2013-6-22 13:03:18
大概渲染流程

def 渲染(list)
  list.sort_by_z.each{|d| if d.is_a?(Viewport) then 渲染(d.childrens) else d.render(...)}
end

点评

thanks,让我越来越了解xp的运行机制了。 我建立了一个群, 想邀请你进来。 323876830,欢迎你的加入。  发表于 2013-6-22 13:33
爆发的妞 发表于 2013-6-22 12:56:29
灼眼的夏娜 发表于 2013-6-22 12:42
viewport没对sprite进行属性管理(但管理了 sprite的渲染(根据sprite的各种属性进行渲染  ...

恩。谢谢你的回答。 我说的意思就是对sprite进行管理。
就类似于我上面说的spriteManager的概念。
有没有这方面的代码可以参考下。
因为看了tilemap的第三方实现,了解到xp的三层是个逻辑三层,
而不是地图的三层,只是对layer中的图片进行了绘制,而layer是一个
sprite,所以猜想是viewport对sprite进行了管理。 是根据z轴进行绘制的。
然后最外层, 是对viewport进行绘制的,也是根据z轴。
这方面有什么参考吗?这样我也可以少走点弯路。 谢谢啦。
灼眼的夏娜 发表于 2013-6-22 12:42:30
爆发的妞 发表于 2013-6-22 12:04
谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里 ...

viewport没对sprite进行属性管理(但管理了 sprite的渲染(根据sprite的各种属性进行渲染
爆发的妞 发表于 2013-6-22 12:04:25
灼眼的夏娜 发表于 2013-6-22 11:29
继承自Object和Viewport是否能够统一处理没有必然联系(

继承自Object,Sprite也可以再Viewport的容器里( ...

谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里面。
但是viewport并没有对他进行管理啊。 有没有伪代码, 可以
看看。 谢谢啦。
灼眼的夏娜 发表于 2013-6-22 11:29:35
继承自Object和Viewport是否能够统一处理没有必然联系(

继承自Object,Sprite也可以再Viewport的容器里(~
爆发的妞 发表于 2013-6-21 10:54:06
个位高人,小弟在做地图的绘制的时候遇到个问题,
我简单的描述一下吧:
看代码,可以了解到 sprite,plane和window是展示在
对应的viewport视口上面的。
但通篇都没有看到对于viewport和sprite等的绘制部分,
全是update逻辑处理。
我猜想一下他们是不是这样处理的, 每次new新建一个viewport
视口的时候,就在viewportManager(暂定视口管理器)添加一个,
然后 sprite也是如此, 有一个spriteManager来管理他们, 其他同理,
那么就是先根据viewport视口的z轴判断进行绘制, 然后再绘制viewport
视口内的 sprite等等(也是根据z轴来判断绘制), 如果rm内部这样来做的
话,逻辑倒也说的清除, 但是参考help(帮助文档),发现 sprite,plane和window
是继承object(基类的),而不是一个viewport视口能够统一处理的类,例如 baseSprite。
难道绘制的时候还判断了下实例, 这个真的不得而知, 不知道我的猜测有无道理。
如果有哪位同学知道的,可以赐教下。 谢谢啦。
爆发的妞 发表于 2013-6-20 17:17:04
本帖最后由 爆发的妞 于 2013-6-21 17:41 编辑

需要用到数据库中的图块的数据,直接解析生成的文件, 貌似没有那么容易,
结构不太明白,还需要深入学习。所以就简单的在工程中输出了。
需要用到的同学,可以拿去

代码如下:
RUBY 代码复制
  1. #输出Tilesets
  2.     #创建一个可写文件流
  3.     fh = File.new(sprintf("Data/Tilesets.rx"), "w")
  4.     #输出地图数据
  5.     size = $data_tilesets.size - 1
  6.     for i in 1..size
  7.         tileset = $data_tilesets[i]
  8.         tileset_name = tileset.tileset_name
  9.         autotile_names = tileset.autotile_names
  10.         panorama_name = tileset.panorama_name
  11.         panorama_hue = tileset.panorama_hue
  12.         fog_name = tileset.fog_name
  13.         fog_hue = tileset.fog_hue
  14.         fog_opacity = tileset.fog_opacity
  15.         fog_blend_type = tileset.fog_blend_type
  16.         fog_zoom = tileset.fog_zoom
  17.         fog_sx = tileset.fog_sx
  18.         fog_sy = tileset.fog_sy
  19.         battleback_name = tileset.battleback_name
  20.         passages = tileset.passages
  21.         priorities = tileset.priorities
  22.         terrain_tags = tileset.terrain_tags
  23.         fh.puts i
  24.         fh.puts 'tileset_name  %s.png'% [tileset_name]
  25.         fh.print 'autotile_names  '
  26.         for i in 0..autotile_names.size
  27.             if autotile_names[i].nil?
  28.               fh.print ','
  29.             else
  30.               fh.print '%s.png,'% [autotile_names[i]]
  31.             end
  32.         end
  33.         fh.puts ''
  34.         passages_size = passages.xsize
  35.         fh.print 'passages  '
  36.         for i in 0..passages_size
  37.             fh.print '%s,'% [passages[i]]
  38.         end
  39.         fh.puts ''
  40.         priorities_size = priorities.xsize
  41.         fh.print 'priorities  '
  42.         for i in 0..priorities_size
  43.           if i==priorities_size
  44.             fh.print '%s'% [priorities[i]]
  45.           elsif i==0
  46.             fh.print '%s,'% [5]
  47.           else
  48.             fh.print '%s,'% [priorities[i]]
  49.           end
  50.         end
  51.        fh.puts ''
  52.     end
  53.     fh.close #关闭文件流


下面的代码是对应地图图块的数据输出,
代码如下:
RUBY 代码复制
  1. #创建一个可写文件流
  2.     fh = File.new(sprintf("Data/Map%03d.rx", @map_id), "w")
  3.     #输出地图数据
  4.     for i in 0..2
  5.       xsize = @map.data.xsize
  6.       #print xsize
  7.       ysize = @map.data.ysize
  8.       #print ysize
  9.       fh.puts '[w = %s][h = %s]'% [xsize,ysize]
  10.       for line in 0...ysize
  11.         for col in 0...xsize
  12.            tile_id = @map.data[col, line, i]
  13.            if tile_id == nil
  14.               #fh.puts "[%s][%s][%s]=%s" % [col, line,i,'空'] #写入数据
  15.               #print "[%s][%s][0]=%s" % [col, line,'空']
  16.               fh.print "%s," % ['空']
  17.             else
  18.               #fh.puts "[%s][%s][%s]=%s" % [col, line,i,tile_id] #写入数据
  19.               #print "[%s][%s][0]=%s" % [col, line,tile_id]
  20.               if col==xsize-1
  21.                  fh.print "%s" % [tile_id]
  22.               else
  23.                  fh.print "%s," % [tile_id]
  24.               end
  25.             end
  26.           end
  27.           fh.puts ''
  28.         end
  29.         fh.puts ''
  30.      end
  31.     fh.close #关闭文件流


后续还会解析其他的数据,感兴趣的可以,共同研究
爆发的妞 发表于 2013-6-4 09:06:25
恶魔般的天使 发表于 2013-6-3 18:08
不懂楼主表达什么意思

呵呵。等你重写一下引擎,你就明白了。
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-12 04:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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