加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 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类了。支持高分辨率。雾图形用这个没问题,不过远景图我没有测试。
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
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
refresh函数其实就是某侠的count_wh
前两天卡在了Bitmap的处理上。因为脚本能直接修改self.bitmap,而sprite显示的部分正是self.bitmap ,我需要在脚本写bitmap以后把单个的雾图形处理成平铺的图形,然后把新的图形放在self.bitmap里面让内部函数去显示。
这样就得把脚本读写的和实际用的bitmap分开…………但是直接改def bitmap或者def bitmap=都会冲突。
最后终于想到用alias |