查看: 4220|回复: 2

[讨论] [Plane类]RMXP Plane精灵[Tilemap折腾第二弹]

[复制链接]
梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
回帖
218
发表于 2012-6-2 01:31:59 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 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类了。支持高分辨率。雾图形用这个没问题,不过远景图我没有测试。

[pre lang="ruby" line="1"]class Sprite_Plane < Sprite
  def initialize(viewport)
    super(viewport)
    self.z=viewport.z
    @plane_bmp=nil # original plane bmp, for self.bitmap stores tiled bitmap
    @contents = Bitmap.new(viewport.rect.width, viewport.rect.height)
    self.bitmap=nil
  end
  
  # 外部使用。内部没有用到所以不需要alias
  def bitmap
    return @plane_bmp
  end
  
  alias bmp_set bitmap= # 内部使用,真实修改bitmap
  def bitmap=(bmp) # 外部使用,先赋值给@plane_bmp再刷新
    @plane_bmp = bmp
    refresh
  end
  
  def dispose
    @contents.dispose
  end
  
  # 坐标的处理
  alias ox_set ox=
  def ox=(x)
    self.ox_set(x % @plane_bmp.width) rescue self.ox_set(x)
  end
  
  alias oy_set oy=
  def oy=(y)
    self.oy_set(y % @plane_bmp.height) rescue self.oy_set(y)
  end
  
  def refresh
      @contents.clear
      return if @plane_bmp == nil

      cw=(@plane_bmp.width*self.zoom_x).to_i
      ch=(@plane_bmp.height*self.zoom_y).to_i
      @n_w = @contents.width / cw + 3
      @n_h = @contents.height / ch + 3
      
      # 预处理缩放后的图片
      tmp = Bitmap.new(cw, ch)
      tmp.stretch_blt(tmp.rect, @plane_bmp, @plane_bmp.rect)
      
      # 平铺
      for x in 0..@n_w
        for y in 0..@n_h
          @contents.blt(x * cw, y * ch, tmp, tmp.rect)
        end
      end
      
      # 将处理好的图形传给bitmap
      self.bmp_set(@contents)
      tmp.dispose
  end  
end[/pre]

refresh函数其实就是某侠的count_wh

前两天卡在了Bitmap的处理上。因为脚本能直接修改self.bitmap,而sprite显示的部分正是self.bitmap ,我需要在脚本写bitmap以后把单个的雾图形处理成平铺的图形,然后把新的图形放在self.bitmap里面让内部函数去显示。
这样就得把脚本读写的和实际用的bitmap分开…………但是直接改def bitmap或者def bitmap=都会冲突。
最后终于想到用alias

点评

alias guard?求指教。现在的【大冒险】工程脚本里面可是有海量的alias所以完全不能F12的  发表于 2012-6-2 09:43
赞Plane强化…… 话说如果有F12的需求可以考虑alias guard  发表于 2012-6-2 06:29

评分

参与人数 2星屑 +146 收起 理由
凌童鞋 + 132
晴兰 + 14 塞糖

查看全部评分

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
回帖
132
发表于 2012-6-3 12:17:42 | 显示全部楼层
楼主,这个怎么用啊? 如何调分辨率啥的?
真实的我不是这样子的~@
回复

使用道具 举报

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
回帖
218
 楼主| 发表于 2012-6-3 18:49:04 | 显示全部楼层
用法:把出现Plane的地方都改成Sprite_Plane,或者直接把这个类名字改成Plane就好了……汗
因为这个Plane的大小和初始化时使用的Viewport是一样大的,而不是原来的固定640*480 所以可以兼容分辨率脚本所做的修改。

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

点评

错了 是Plane = class Sprite_Plane < Plane; ...; self; end;  发表于 2012-6-6 19:25
Plane = Sprite_Plane; 噗 还有Plane = class Sprite_Plane; ...; self; end;  发表于 2012-6-6 19:24
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部