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