Project1

标题: 求助吖!怎么在一个window里加入图片? [打印本页]

作者: 冰舞蝶恋    时间: 2011-3-15 20:07
标题: 求助吖!怎么在一个window里加入图片?
如果用显示图片,那么退出后又怎么消除?
求助呀………………
看了一些原脚本和大神们写的都还是毫无头绪吖……dsu_plus_rewardpost_czw
作者: 蕾米莉亚·斯卡雷特    时间: 2011-3-15 20:35
表示没看明白. 在 Window 这个类里面显示一个图片么??
作者: 冰舞蝶恋    时间: 2011-3-15 20:39
回复 蕾米莉亚·斯卡雷特 的帖子

嗯嗯!!
作者: Grief_Seed    时间: 2011-3-15 21:08
self.contents = Bitmap.new(filename)


作者: wbsy8241    时间: 2011-3-15 21:23
class Window
  alias old_initialize initialize
  def initialize
    old_initialize
    @sprite = Sprite.new
  end
  alias old_dispose dispose
  def dispose
    old_dispose
    @sprite.dispose
  end
end
作者: 一箭烂YiJL    时间: 2011-3-15 21:33
方法有二:
一:
self.contents = Bitmap.new(参数)
# 此方法会把写出来的文字、图片覆盖
二:
xxx = Sprite.new
xxx.bitmap = Bitmap.new(参数)
# 此方法不会把window里面的东西覆盖,然而需要:
xxx.x = self.x + 32   # 还是16?(为了对准窗口内)
xxx.x = self.y + 32   # 还是16?(为了对准窗口内)
xxx.z = 101
作者: 蕾米莉亚·斯卡雷特    时间: 2011-3-15 21:35
写法1: 使用 Bitmap 的 blt
   Window类的 update 或者 refresh 里添加

   self.contents.blt(0, 0, Cache.system("IconSet"), Rect.new(0, 0, 384, 416), 128)
   其中的 Cache.system("IconSet") 表示加载一个在 system目录下的 IconSet 文件.
               Rect.new(0, 0, 384, 416) 表示截取这个文件 (0, 0) 开始, 到 (384, 416) 之间的矩形部分.

方法二: 使用 Sprite
    在任意地方(一般是 initialize) 里添加:

    @bitmap = Sprite.new()
    @bitmap.bitmap = Cache.system("IconSet")
    @bitmap.x = 0
    @bitmap.y = 0
    @bitmap.z = 3
    @bitmap.opacity  = 128

     然后再不需要这个图片的时候, 使用
     @bitmap.bitmap.dispose
     @bitmap.dispose
     释放图片.
作者: 一箭烂YiJL    时间: 2011-3-15 21:49
回复 蕾米莉亚·斯卡雷特 的帖子

其实原意并不是直接(new)改动的= =
blt这个搬字过纸的方法, 搬了半透明图案进无透明图案会令无透明图案清除...(好头疼= =)。
用sprite的方法x坐标和y坐标应该要:
sprite.x = self.x + 32;sprite.y = self.y + 32   # 32是窗口边,还是16?
记得window的z坐标好像是100?(以前偶尔的测试...)所以应该要sprite.z = 101。

个人感觉Cache的方法名很乱,我倒不如Bitmap.new("Graphics/System/IconSet")
特别是少得用的图案不要用Cache, 反而耗内存.
作者: 爱丽丝·玛格特罗依德    时间: 2011-3-15 21:56
Cache 有 Hash 来维护, 对于加载次数多的图片, 使用 Cache 来加载更加节约内存.

直接使用 new 来加载的话, 加载一次内存添加一次. 虽然有 GC 的帮忙, 不过能避免的话, 总是好的.

对于第一次加载的 Bitmap , 最多内存消耗比直接使用 Bitmap.new 大那么一点点.

总体感觉 Cache 还是不错的.
作者: 一箭烂YiJL    时间: 2011-3-15 22:11
回复 爱丽丝·玛格特罗依德 的帖子

用得少也就是用一下就被dispose掉(dispose会在内存消失?),
这样一直放在Cache的哈希里面不占内存么?
如果Cache也能个别式的clear就好了。
(GC也只限制在Cache.clear中)

其实如果再好一些的话,可以:
@sprite = Sprite.new(Viewport.new(self.x + 32, self.y + 32, self.width-32, self,height-32))
用viewport来锁定显示范围为window。
作者: 爱丽丝·玛格特罗依德    时间: 2011-3-15 22:14
回复 一箭烂YiJL 的帖子

Cache 里的 Bitmap 在外部调用 dispose 的话, 只会将引用计数器减1 , 计时器等于 0 的话, 就真正的释放掉.

以上是个人的想法. Cache 没细看. 设计上应该是这样的.
作者: 冰舞蝶恋    时间: 2011-3-15 22:47
天哪……咱一点也没看懂…………倒是剑兰神给的第二种方法,为什么闪一下就消失了捏…………?谢谢。
作者: 爱丽丝·玛格特罗依德    时间: 2011-3-15 22:49
@XXX 应该要添加这个.

不然就是局部变量, 方法结束后会被 RM 释放掉.
作者: 一箭烂YiJL    时间: 2011-3-16 07:18
好~于是整合起来就:
    @sprite = Sprite.new(Viewport.new(self.x + 32, self.y + 32, self.width-64, self,height-64))
    @sprite.bitmap = Cache.system("IconSet")     # ←如果图片经常用的话

    @sprite.bitmap = Bitmap.new("Graphics/System/IconSet")
    # ↑图片用一次的话↑,还有路径是"/"而不是平常的"\"我想可能因为正则的关系吧~
    @sprite.x = self.x + 32
    @sprite.y = self.y + 32
    @sprite.z = 101

释放:
    @sprite.bitmap.dispose       # 这个需要么?
    @sprite.dispose                  # 我一向只用这个...
作者: fux2    时间: 2011-3-16 08:54
回复 冰舞蝶恋 的帖子

窗口工作大致分三阶段,
1.初始化(initialize)
创建一个sprite
@spritefux=Sprite.new
@spritefux.bitmap=Bitmap.new("graph...地址")
2.刷新(update或refresh)
@spritefux.update
3.释放(dispose)
@spritefux.bitmap.dispose
@spritefux.dispose
.
.
以上三个步骤分别插入相应的window过程
作者: 冰舞蝶恋    时间: 2011-3-16 12:39
回复 爱丽丝·玛格特罗依德 的帖子

感谢前辈…………话说怎样让窗口结束之后消失呐……?


冰舞蝶恋于2011-3-16 20:15补充以下内容:
呃,懂了,谢谢各位前辈,咱该认可谁呢…………?




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