Project1

标题: 请问一下Sprite类和Viewport类的关系 [打印本页]

作者: 泉塚四季    时间: 2014-7-6 21:02
标题: 请问一下Sprite类和Viewport类的关系
本帖最后由 泉塚四季 于 2014-7-6 21:04 编辑

我写了一个显示Sprite的脚本,设置了Sprite的Bitmap,但是我发现Sprite的坐标如果是某些特殊的数值时(Bitmap只有一部分在游戏画面中)Sprite就无法显示了。尝试了一下发现给Sprite加上一个Viewport问题就解决了,但是我搞不太懂两者之间的关系,所以想要请问一下其中的原理,也就是说Bitmap的大小、Sprite的位置满足什么条件的时候Sprite是无法在画面中显示的,必须加上Viewport。
更进一步,加入Viewport以后是否还会产生类似的情况?(明明坐标在画面中了,但是就是不显示)

另外如果Sprite没有指定Viewport的时候它使用的Viewport是什么呢?还是说他没有使用Viewport?没有Viewport的Sprite的Z坐标高度默认又是多少呢?
作者: taroxd    时间: 2014-7-6 21:12
F1:

Sprite.new([viewport])
生成一个精灵对象。必要时指定一个显示端口(Viewport 显示端口类 )。


不必要时,显示端口可以理解为全屏。至于z么……你自己p一个看看吧……我猜100……

也就是说Bitmap的大小、Sprite的位置满足什么条件的时候Sprite是无法在画面中显示的,必须加上Viewport。

会么……为什么我没有遇到……你确定没有超出屏幕么。
Viewport主要有两个作用,一个是z值,一个是限制图片显示的区域。
比如你要让一个图片只在一个方形区域内显示,你就可以用viewport。
调整z值的用法参考Spriteset_Map

↑ 其实我也不知道,上面的都是瞎扯
作者: 泉塚四季    时间: 2014-7-6 21:13
taroxd 发表于 2014-7-6 21:12
不必要时,显示端口可以理解为全屏。至于z么……你自己p一个看看吧……我猜100……

测试代码

  1. class Sprite_4j < Sprite
  2.   def initialize(viewport=nil)
  3.     super(viewport)
  4.     self.bitmap = Cache.battleback2("brick")
  5.     self.x = self.y = -1   
  6.   end
  7.   def dispose
  8.     self.bitmap.dispose   if self.bitmap
  9.     self.viewport.dispose if self.viewport
  10.     super
  11.   end
  12. end

  13. $载入Viewport = true

  14. class Scene_Map
  15.   alias qz4j_start start
  16.   def start
  17.     @test_viewport = Viewport.new if $载入Viewport
  18.     @test_viewport.z = 1000 if @test_viewport
  19.     qz4j_start
  20.     @test_sprite = Sprite_4j.new(@test_viewport)
  21.   end
  22.   alias qz4j_update update
  23.   def update
  24.     qz4j_update
  25.     @test_sprite.update
  26.   end
  27.   alias qz4j_terminate terminate
  28.   def terminate
  29.     qz4j_terminate
  30.     @test_sprite.dispose
  31.   end
  32.   
  33. end
复制代码

作者: taroxd    时间: 2014-7-6 21:15
泉塚四季 发表于 2014-7-6 21:13
测试代码


未载入Viewport的时候z值太低呗……有啥好解释的

RUBY 代码复制
  1. @test_sprite = Sprite_4j.new
  2.     @test_sprite.z = 1000


就可以了
作者: 泉塚四季    时间: 2014-7-6 21:19
taroxd 发表于 2014-7-6 21:15
未载入Viewport的时候z值太低呗……有啥好解释的

    @test_sprite = Sprite_4j.new

测试代码2,只是修改了Sprite的坐标而已

  1. class Sprite_4j < Sprite
  2.   def initialize(viewport=nil)
  3.     super(viewport)
  4.     self.bitmap = Cache.battleback2("brick")
  5.     self.x = self.y = 0   
  6.   end
  7.   def dispose
  8.     self.bitmap.dispose   if self.bitmap
  9.     self.viewport.dispose if self.viewport
  10.     super
  11.   end
  12. end

  13. $载入Viewport = false

  14. class Scene_Map
  15.   alias qz4j_start start
  16.   def start
  17.     @test_viewport = Viewport.new if $载入Viewport
  18.     @test_viewport.z = 1000 if @test_viewport
  19.     qz4j_start
  20.     @test_sprite = Sprite_4j.new(@test_viewport)
  21.   end
  22.   alias qz4j_update update
  23.   def update
  24.     qz4j_update
  25.     @test_sprite.update
  26.   end
  27.   alias qz4j_terminate terminate
  28.   def terminate
  29.     qz4j_terminate
  30.     @test_sprite.dispose
  31.   end
  32.   
  33. end
复制代码

作者: 泉塚四季    时间: 2014-7-6 21:25
taroxd 发表于 2014-7-6 21:15
未载入Viewport的时候z值太低呗……有啥好解释的

    @test_sprite = Sprite_4j.new

测试代码3,Z坐标本身不变,但是对精灵的影响却发生了改变
  1. class Sprite_4j < Sprite
  2.   def initialize(viewport=nil)
  3.     super(viewport)
  4.     self.bitmap = Cache.battleback2("brick")
  5.     self.x = self.y = -10
  6.   end
  7.   def update
  8.     self.x += 1
  9.     self.y += 1
  10.     p self.z
  11.   end
  12.   def dispose
  13.     self.bitmap.dispose   if self.bitmap
  14.     self.viewport.dispose if self.viewport
  15.     super
  16.   end
  17. end
  18. class Scene_Map
  19.   alias qz4j_start start
  20.   def start
  21.     qz4j_start
  22.     @test_sprite = Sprite_4j.new
  23.   end
  24.   alias qz4j_update update
  25.   def update
  26.     qz4j_update
  27.     @test_sprite.update
  28.   end
  29.   alias qz4j_terminate terminate
  30.   def terminate
  31.     qz4j_terminate
  32.     @test_sprite.dispose
  33.   end
  34.   
  35. end
复制代码

作者: taroxd    时间: 2014-7-6 21:26
本帖最后由 taroxd 于 2014-7-6 21:29 编辑
泉塚四季 发表于 2014-7-6 21:25
测试代码3,Z坐标本身不变,但是对精灵的影响却发生了改变

显示端口的 Z 坐标。数值愈大的平面愈靠近玩家。

Z 坐标相同的精灵,Y坐标愈大的会愈靠近玩家。若 Y 坐标也相同,最后生成的对象则会最靠近玩家。


我想起来了……想起战斗测试的怪物前后问题,然后翻了翻F1……果然是这样

@熊喵酱 结贴




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