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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 爆发的妞
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
11
 楼主| 发表于 2013-5-17 17:22:39 | 显示全部楼层
Sion 发表于 2013-5-17 15:59
因为只看过ACE的脚本,所以不是很肯定。那个 tile_id 是图块的索引,就是32*32的小格子从左到右一 ...

谢谢你的回复。
我看 tile_id不是单纯的% or / 得到对应图片的位置等等。
上段代码给我的意思是 在384之前的图块是自动元件的,
在384之后, 是正常的。 就是搞不清他的值区域的意思。
然后怎么绘制一张自动元件的图块呢?怎么得到是自动元件的
哪个图块?
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
12
 楼主| 发表于 2013-5-24 09:26:24 | 显示全部楼层
小里程碑,移动设备,完美实现,行走地图

device-2013-05-24-092320.png (37.7 KB, 下载次数: 19)

device-2013-05-24-092320.png
rm for android (原生开发)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
13
 楼主| 发表于 2013-6-3 13:23:20 | 显示全部楼层
当添加其他角色的时候, 当主角行走的时候, 其他角色会有稍微的偏移现象,
查了好久,发现数据显示都是正常的,百思不得其解, 最后发现是Sprite_Character
里面出了问题。
他的update绘制方法:
主要逻辑是这样的,
1.首先super,调用父类的update
2.然后
    # 设置脚本的坐标
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
设置位置等。

这就产生问题了, 当逻辑执行完,要绘制的时候,
第一帧没有进行相应的变化, 而是等下一帧才变化。
有一帧的延迟。
做法是把super放到方法最后执行。
rm没有这个问题,我重写的会有这个问题。

device-2013-06-03-131436.png (46.43 KB, 下载次数: 15)

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

使用道具 举报

Lv1.梦旅人

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

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
142 小时
注册时间
2013-4-13
帖子
92
15
 楼主| 发表于 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
16
 楼主| 发表于 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
17
 楼主| 发表于 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
18
 楼主| 发表于 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
在线时间
142 小时
注册时间
2013-4-13
帖子
92
19
 楼主| 发表于 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 (原生开发)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-11 01:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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