Project1

标题: 关于精灵Sprite的问题 [打印本页]

作者: redant    时间: 2009-4-26 20:20
标题: 关于精灵Sprite的问题
试验人家的五子棋脚本
@white = Sprite.new
@white.bitmap = Bitmap.new("Graphics/Pictures/white")
@white .z = 9999

  1. Bitmap
  2. 位图的类。所谓位图即表示图像其本身。

  3. 为了在画面中显示位图必需要使用精灵(Sprite)等。
复制代码


范例中棋子使用的 @black=Bitmap.new('Graphics/Pictures/black') 就没有精灵

如果用 for i in 1..255
         @white= Sprite.new
做的话
就会依次出现


白棋子有

白棋子也还有

白棋子消失了 = =

请问这是什么原因 和http://rpg.blue/web/htm/news747.htm有关系么?
是不是RM 隔段时间就会清除不用的精灵?

如果要用 @white = Sprite.new
@white.bitmap = Bitmap.new("Graphics/Pictures/white")
的方法 实现棋子放下不消失的效果 怎么弄?

顺便请教 Input.press? Input.trigger? Input.repeat?
三者的区别

工程:http://rpg.blue/upload_program/d/redant_五子_121177227.rar
[LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: hitlerson    时间: 2009-4-26 20:35
用数组啊用数组
你这样重定义@white,老的sprite就没了,就向你说的,过会RM会给清理掉。

按下,触发,再次触发 [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: redant    时间: 2009-4-26 21:14

for i in 1..255
      @white= Sprite.new
      @white.z =9999
      @white.bitmap=Bitmap.new('Graphics/Pictures/white')
      @white.x =144+32*(@st_x-1)
      @white.y = 32*(@st_y-1)
  end

就会出现 图上 过一会儿 才消失掉的效果

用@white的话 是马上消失  (白棋子永远是一个)
作者: redant    时间: 2009-4-26 21:16

for i in 1..255
      @white= Sprite.new
      @white.z =9999
      @white.bitmap=Bitmap.new('Graphics/Pictures/white')
      @white.x =144+32*(@st_x-1)
      @white.y = 32*(@st_y-1)
  end

就会出现 图上 过一会儿 才消失掉的效果

用@white的话 是马上消失  (白棋子永远是一个)
作者: 紫苏    时间: 2009-4-26 21:30
上面只用一个 @sprite 的时候,落子的时候直接移动了 @sprite 指向的 Sprite 对象,就相当于拿起了你之前落的那一子移动到了别处;
循环产生 Sprite 数组那一段,一开始生成 100 多个 Sprite 在同一点上,下面 pawn_move 里面每次落子都把那 100 多个精灵重新指向到新的对象,这样之前的 100 多个对象都失去了引用,所以会被 Ruby 的垃圾回收机制回收~
这个机制是这样的:
当没有引用(或是说引用的生命周期结束了)保存某对象的时候,该对象占用的内存就会自动被回收,这种机制可以让写程序的人不用考虑堆中的内存泄漏问题~
Sprite.new         # <--- 无引用
spr = Sprite.new   # <--- 有引用
spr = Sprite.new # 第一个 Sprite 对象
spr = Sprite.new # 重新指向第二个 Sprite 对象,第一个 Sprite 对象失去了引用


当然也有例外——如果使用了 WeekRef 将引用设置为一个“弱引用”的话,即便这个引用仍然指向某个对象,该对象还是会被回收~

第二个问题 F1 帮助文档中说的还是比较清楚的:

press? 判断是否按下:
举个例子:调试运行游戏工程时,地图中按住 F9,这时 DEBUG 用的窗口出现了,按 X ,窗口消失但马上又出现了,这就是因为 F9 一直处于按下状态,所以 press? 一直返回 true

trigger? 仅仅判断按下的瞬间:
也就是第一次按下时返回 true,之后即便还是按下状态也会返回 false~
像在地图上按住 X 弹出菜单,弹出之后 X 虽然还是按下状态,但 trigger? 返回的已经是 false 了,否则菜单就会一直重复打开/关闭

repeat? 判断某键是否按下一段时间后仍然按下:
Window_Selectable 有这个函数的应用,方向键按住一段时间后就会迅速往一个方向切换选项~ [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~ [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: tommay    时间: 2009-4-26 21:32
再次受教了,原来Input.press? Input.trigger? Input.repeat? 这个一直搞不清楚
作者: kwong7086    时间: 2009-4-26 21:58
提示: 作者被禁止或删除 内容自动屏蔽




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