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

Project1

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

[已经解决] 请问一下Sprite类和Viewport类的关系

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
269 小时
注册时间
2014-5-9
帖子
127

开拓者

跳转到指定楼层
1
发表于 2014-7-6 21:02:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 泉塚四季 于 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坐标高度默认又是多少呢?
泉眼无声惜细流,树阴照水爱晴柔。
小荷才露尖尖角,早有蜻蜓立上头。

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2014-7-6 21:12:39 | 只看该作者
F1:

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


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

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

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

↑ 其实我也不知道,上面的都是瞎扯

点评

我不知道~~~  发表于 2014-7-6 21:22
试了一下确实是Z的问题,但是为什么精灵的坐标不同默认的Z值也会不同?  发表于 2014-7-6 21:22
解决方法见4L  发表于 2014-7-6 21:17
未指定时的Viewport是nil,无法p出来。出问题的测试代码见3楼  发表于 2014-7-6 21:17
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
269 小时
注册时间
2014-5-9
帖子
127

开拓者

3
 楼主| 发表于 2014-7-6 21:13:30 | 只看该作者
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
复制代码
泉眼无声惜细流,树阴照水爱晴柔。
小荷才露尖尖角,早有蜻蜓立上头。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2014-7-6 21:15:29 | 只看该作者
泉塚四季 发表于 2014-7-6 21:13
测试代码


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

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


就可以了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
269 小时
注册时间
2014-5-9
帖子
127

开拓者

5
 楼主| 发表于 2014-7-6 21:19:33 | 只看该作者
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:21
泉眼无声惜细流,树阴照水爱晴柔。
小荷才露尖尖角,早有蜻蜓立上头。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
269 小时
注册时间
2014-5-9
帖子
127

开拓者

6
 楼主| 发表于 2014-7-6 21:25:02 | 只看该作者
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
复制代码
泉眼无声惜细流,树阴照水爱晴柔。
小荷才露尖尖角,早有蜻蜓立上头。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

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

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

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


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

@熊喵酱 结贴

点评

哦,原来是这个原因。谢谢,问题解决了  发表于 2014-7-6 21:28

评分

参与人数 1星屑 +200 收起 理由
熊喵酱 + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-25 15:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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