Project1

标题: [Plane类]RMXP Plane精灵[Tilemap折腾第二弹] [打印本页]

作者: viktor    时间: 2012-6-2 01:31
标题: [Plane类]RMXP Plane精灵[Tilemap折腾第二弹]
本帖最后由 viktor 于 2012-6-2 01:39 编辑

因为原始的Plane不能扩分辨率,显示雾图形、全景图都很麻烦。扩分辨率代码里面原来用的是【四重存在】的办法也就是渲染4次……于是想改之。

首先找到了@癫狂侠客 某侠前辈写的Plane类伪代码:http://rpg.blue/thread-208355-1-1.html
感觉很像Sprite的实现(本来就是)
然后,又看到了这个帖子http://rpg.blue/thread-222331-1-1.html @zhangbanxian提到Plane是平铺精灵
于是想用Sprite改一个。
现在已经完工了。以下是代码
可以用来替换原来的Plane类了。支持高分辨率。雾图形用这个没问题,不过远景图我没有测试。

RUBY 代码复制
  1. class Sprite_Plane < Sprite
  2.   def initialize(viewport)
  3.     super(viewport)
  4.     self.z=viewport.z
  5.     @plane_bmp=nil # original plane bmp, for self.bitmap stores tiled bitmap
  6.     @contents = Bitmap.new(viewport.rect.width, viewport.rect.height)
  7.     self.bitmap=nil
  8.   end
  9.  
  10.   # 外部使用。内部没有用到所以不需要alias
  11.   def bitmap
  12.     return @plane_bmp
  13.   end
  14.  
  15.   alias bmp_set bitmap= # 内部使用,真实修改bitmap
  16.   def bitmap=(bmp) # 外部使用,先赋值给@plane_bmp再刷新
  17.     @plane_bmp = bmp
  18.     refresh
  19.   end
  20.  
  21.   def dispose
  22.     @contents.dispose
  23.   end
  24.  
  25.   # 坐标的处理
  26.   alias ox_set ox=
  27.   def ox=(x)
  28.     self.ox_set(x % @plane_bmp.width) rescue self.ox_set(x)
  29.   end
  30.  
  31.   alias oy_set oy=
  32.   def oy=(y)
  33.     self.oy_set(y % @plane_bmp.height) rescue self.oy_set(y)
  34.   end
  35.  
  36.   def refresh
  37.       @contents.clear
  38.       return if @plane_bmp == nil
  39.  
  40.       cw=(@plane_bmp.width*self.zoom_x).to_i
  41.       ch=(@plane_bmp.height*self.zoom_y).to_i
  42.       @n_w = @contents.width / cw + 3
  43.       @n_h = @contents.height / ch + 3
  44.  
  45.       # 预处理缩放后的图片
  46.       tmp = Bitmap.new(cw, ch)
  47.       tmp.stretch_blt(tmp.rect, @plane_bmp, @plane_bmp.rect)
  48.  
  49.       # 平铺
  50.       for x in 0..@n_w
  51.         for y in 0..@n_h
  52.           @contents.blt(x * cw, y * ch, tmp, tmp.rect)
  53.         end
  54.       end
  55.  
  56.       # 将处理好的图形传给bitmap
  57.       self.bmp_set(@contents)
  58.       tmp.dispose
  59.   end  
  60. end


refresh函数其实就是某侠的count_wh

前两天卡在了Bitmap的处理上。因为脚本能直接修改self.bitmap,而sprite显示的部分正是self.bitmap ,我需要在脚本写bitmap以后把单个的雾图形处理成平铺的图形,然后把新的图形放在self.bitmap里面让内部函数去显示。
这样就得把脚本读写的和实际用的bitmap分开…………但是直接改def bitmap或者def bitmap=都会冲突。
最后终于想到用alias
作者: dabojun    时间: 2012-6-3 12:17
楼主,这个怎么用啊? 如何调分辨率啥的?
作者: viktor    时间: 2012-6-3 18:49
用法:把出现Plane的地方都改成Sprite_Plane,或者直接把这个类名字改成Plane就好了……汗
因为这个Plane的大小和初始化时使用的Viewport是一样大的,而不是原来的固定640*480 所以可以兼容分辨率脚本所做的修改。

改分辨率的脚本还在调试中。因为遮挡有问题




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