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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
跳转到指定楼层
1
发表于 2012-6-2 01:31:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

点评

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

评分

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

查看全部评分

Lv1.梦旅人

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
帖子
161
2
发表于 2012-6-3 12:17:42 | 只看该作者
楼主,这个怎么用啊? 如何调分辨率啥的?
真实的我不是这样子的~@
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-2 11:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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