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

Project1

 找回密码
 注册会员
搜索
查看: 6795|回复: 31
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
跳转到指定楼层
1
发表于 2013-5-9 13:07:51 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 爆发的妞 于 2013-6-21 10:55 编辑

小弟在学习这个rpg marker 引擎, 感觉有好多值得学习的地方。
问的也都是一些基础简单的问题。
小弟有个想法, 有好多高手经验都比较丰富。 对于引擎里面的脚本
都比较熟悉。 能否写出来让更多的学习引擎设计和开发的朋友学习。
无论你是搞 ruby or lua or java or c# or object-c 各种语言的同学,
或是 xp or vx or ae ,
或是 搞 工具 or 引擎 or 策划 or美术 , 有想法都可以写出来。

我也会不定期写一些自己的理解, 望大家指正。

朋友们, 别客气, 自己的心得什么的都可以提出来。。。

讨论问题列表:
1.在事件里面添加脚本合适吗?  2# ~ 4#
2. xp 脚本引擎 整体结构类图分析,只有地图场景的分析。 战斗场景类似。 5# ~ 7#
3.在移动设备上,fps之痛?  9# ~ 16#
4.地图的tile_id数值是怎么使用的, 分自动元件? 26#
5.问一下,Input里面的代码是怎么个实现的,有没有伪代码之类的可以参考?  未解决
6.小里程碑,移动设备,完美实现,行走地图
7.主角移动, 其他角色有略微的偏移的问题。
8.解析数据库的图块数据和地图中对应的图块数据  25#
9.viewport视口,sprite等绘制问题 27# 未解决

小弟创建了一个 6R移动交流群, 旨在对移动游戏制作有兴趣的同学加入,
群号:323876830 没有验证,可直接加入
群公告: 请发6R帖子地址寻求帮助或讨论, 禁止灌水, 共同学习
所以嘛, 请爱灌水的同学绕路了。。

评分

参与人数 1星屑 +60 收起 理由
Raiku + 60 态度良好~不过我不是触手只能看看了.

查看全部评分

rm for android (原生开发)

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
32
发表于 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
RMXP&RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
31
 楼主| 发表于 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轴。
这方面有什么参考吗?这样我也可以少走点弯路。 谢谢啦。
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
30
发表于 2013-6-22 12:42:30 | 只看该作者
爆发的妞 发表于 2013-6-22 12:04
谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里 ...

viewport没对sprite进行属性管理(但管理了 sprite的渲染(根据sprite的各种属性进行渲染
RMXP&RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
29
 楼主| 发表于 2013-6-22 12:04:25 | 只看该作者
灼眼的夏娜 发表于 2013-6-22 11:29
继承自Object和Viewport是否能够统一处理没有必然联系(

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

谢谢高人指点。 不过我还是没明白他的结构。
sprite只是引用了viewport,就是说在某一个viewport视口里面。
但是viewport并没有对他进行管理啊。 有没有伪代码, 可以
看看。 谢谢啦。
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
28
发表于 2013-6-22 11:29:35 | 只看该作者
继承自Object和Viewport是否能够统一处理没有必然联系(

继承自Object,Sprite也可以再Viewport的容器里(~
RMXP&RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
27
 楼主| 发表于 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。
难道绘制的时候还判断了下实例, 这个真的不得而知, 不知道我的猜测有无道理。
如果有哪位同学知道的,可以赐教下。 谢谢啦。
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
26
 楼主| 发表于 2013-6-20 19:23:11 | 只看该作者
本帖最后由 爆发的妞 于 2013-6-20 19:43 编辑

rm for android (原生开发)
地图展示,不过不包含优先级的功能绘制



调了一下fps,和有对话脚本的图

device-2013-06-20-191050.png (218.96 KB, 下载次数: 13)

device-2013-06-20-191050.png

device-2013-06-20-194202.png (170.44 KB, 下载次数: 16)

device-2013-06-20-194202.png
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
25
 楼主| 发表于 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 #关闭文件流


后续还会解析其他的数据,感兴趣的可以,共同研究
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
24
 楼主| 发表于 2013-6-4 09:06:25 | 只看该作者
恶魔般的天使 发表于 2013-6-3 18:08
不懂楼主表达什么意思

呵呵。等你重写一下引擎,你就明白了。
rm for android (原生开发)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-5-12 17:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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