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

Project1

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

[已经解决] 人物在星地形的显示问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
100
在线时间
3 小时
注册时间
2017-8-25
帖子
3
跳转到指定楼层
1
发表于 2017-11-18 01:25:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本人算是半个新手吧...   这个问题都困扰我挺久的了,脚本都找好了,就是不知道为什么解决不了。请各位大大指点我一下...

人物走在石头前面时,头被切去了一部分,因为石头的上半部是星形地形(图快在人物上方)。我游戏里的人物,大多都比正常图块大一点点,经常遇到这种头没了一点的情况。
C:\Users\Iris\Desktop\Pic1.png
C:\Users\Iris\Desktop\Pic 2.png

我在网上找到了脚本,是外国人写的。如果我没理解错,应该是说在星星图块那里使用区域地形7,如果人物在那个图快下方,图快不会切去人物的头;如果人物站在星图块里,人物就会被图块遮挡。
  1. ##-----------------------------------------------------------------------------
  2. #  Large Sprite ☆ Display Fix v1.3
  3. #  Created by Neon Black at request of seita
  4. #  v1.4 - 12.18.14 - Added position tuning
  5. #  v1.3 - 1.12.14  - Viewport/position issue fixes
  6. #  v1.1 - 8.18.13  - Fixed an odd lag issue
  7. #  v1.0 - 8.17.13  - Main script completed
  8. #  For both commercial and non-commercial use as long as credit is given to
  9. #  Neon Black and any additional authors.  Licensed under Creative Commons
  10. #  CC BY 4.0 - http://creativecommons.org/licenses/by/4.0/
  11. ##-----------------------------------------------------------------------------

  12. ##------
  13. ## By default, this script only affects the player.  To allow it to affect
  14. ## an event page as well, add a comment with the tag <large sprite> to the page
  15. ## of the event you would like to have affected by this.

  16. class Sprite_Character < Sprite_Base
  17.   ##------
  18.   ## The ID of the terrain used to display the large character above ☆ tiles.
  19.   ## If the player is below this tile (y position), the sprite will appear
  20.   ## above all tiles and events from that y position up.  If the player is on
  21.   ## the same tile or above (y position) the event will appear BELOW ☆ tiles
  22.   ## from that position up.
  23.   ##------
  24.   UpperTerrain = 7
  25.   
  26.   ##------
  27.   ## This value is the pixel tuning used to check the location.  This is
  28.   ## because characters tagged with a '!' in their name are drawn lower than
  29.   ## normal characters and are considered to be lower than these.  This causes
  30.   ## the script to think they are on the tile below where they really are and
  31.   ## draw them above tiles they should appear under.
  32.   ##------
  33.   Tuning = -1
  34.   
  35.   alias :cp_011214_update_bitmap :update_bitmap
  36.   def update_bitmap(*args)
  37.     if graphic_changed? && @set_upper_area_sprite
  38.       @force_no_gfx_change = true
  39.     else
  40.       @force_no_gfx_change = false
  41.     end
  42.     cp_011214_update_bitmap(*args)
  43.   end

  44.   ## Alias the update method to add in the new graphic check.
  45.   alias :cp_073013_update_pos :update_position
  46.   def update_position(*args)
  47.     cp_073013_update_pos(*args)
  48.     check_encompassed_area if sprite_is_onscreen?
  49.   end

  50.   ## Alias the dispose to dispose the upper sprite.
  51.   alias :cp_073013_dispose :dispose
  52.   def dispose(*args)
  53.     @upper_area_sprite.dispose if @upper_area_sprite
  54.     cp_073013_dispose(*args)
  55.   end

  56. #~   ## Alias the graphic changed method to allow the sprite to revent to what it
  57. #~   ## was during the last frame.  This allows the check to work again.
  58. #~   alias :cp_073013_graphic_changed? :graphic_changed?
  59. #~   def graphic_changed?(*args)
  60. #~     cp_073013_graphic_changed?(*args) || @set_upper_area_sprite
  61. #~   end

  62.   ## Check if the sprite is onscreen.  Reduces redundant drawing.
  63.   def sprite_is_onscreen?
  64.     return false if @character.is_a?(Game_Vehicle) || @character.is_a?(Game_Follower)
  65.     return false unless @character.is_a?(Game_Player) || @character.large_sprite
  66.     return false if @character.screen_z >= 200
  67.     top_left, bot_right = get_edge_corner_dis
  68.     return false if top_left[0] > Graphics.width
  69.     return false if top_left[1] > Graphics.height
  70.     return false if bot_right[0] < 0
  71.     return false if bot_right[1] < 0
  72.     return true
  73.   end

  74.   ## Get the top left and bottom right positions.
  75.   def get_edge_corner_dis
  76.     top_left = [self.x - self.ox, self.y - self.oy]
  77.     bot_right = [top_left[0] + self.width, top_left[1] + self.height]
  78.     return [top_left, bot_right]
  79.   end

  80.   ## Long method that checks each position and draws the upper sprite.
  81.   def check_encompassed_area
  82.     if @set_upper_area_sprite && !@force_no_gfx_change
  83.       old_src = self.src_rect.clone
  84.       self.bitmap = @old_bitmap
  85.       self.src_rect = old_src
  86.     end
  87.     @set_upper_area_sprite = false
  88.     top_left, bot_right = get_edge_corner_dis
  89.     last_x, last_y, copy_region = nil, nil, 0
  90.     map_xd, map_yd = $game_map.display_x * 32, $game_map.display_y * 32
  91.     total_height = (self.height + @character.jump_height).round
  92.     self.width.times do |x|
  93.       xp = map_xd.to_i + top_left[0] + x
  94.       unless xp / 32 == last_x
  95.         last_x = xp / 32
  96.         last_y, copy_region = nil, 0
  97.         total_height.times do |y|
  98.           yp = map_yd.to_i + bot_right[1] + @character.jump_height - y + Tuning
  99.           next if yp.to_i / 32 == last_y
  100.           last_y = yp.to_i / 32
  101.           if last_y == (@character.screen_y + @character.jump_height + Tuning +
  102.                         map_yd).to_i / 32
  103.             break if $game_map.terrain_tag(last_x, last_y) == UpperTerrain
  104.             next
  105.           end
  106.           next if $game_map.terrain_tag(last_x, last_y) != UpperTerrain
  107.           copy_region = [self.height, total_height - y + 1].min
  108.           set_upper_sprite
  109.           break
  110.         end
  111.       end
  112.       next if copy_region == 0
  113.       rect = Rect.new(src_rect.x + x, src_rect.y, 1, copy_region)
  114.       @upper_area_sprite.bitmap.blt(x, 0, self.bitmap, rect)
  115.       self.bitmap.clear_rect(rect)
  116.     end
  117.     if !@set_upper_area_sprite && @upper_area_sprite
  118.       @upper_area_sprite.visible = false
  119.     end
  120.   end

  121.   ## Creates the upper sprite that's a copy of the current sprite.
  122.   def set_upper_sprite
  123.     return if @set_upper_area_sprite
  124.     @upper_area_sprite ||= Sprite.new
  125.     @upper_area_sprite.bitmap = Bitmap.new(self.width, self.height)
  126.     props = ["x", "y", "ox", "oy", "zoom_x", "zoom_y", "angle", "mirror",
  127.              "bush_depth", "opacity", "blend_type", "color", "tone", "visible",
  128.              "viewport"]
  129.     props.each do |meth|
  130.       @upper_area_sprite.method("#{meth}=").call(self.method(meth).call)
  131.     end
  132.     @upper_area_sprite.z = 200
  133.     @set_upper_area_sprite = true
  134.     @old_bitmap, old_src_rect = self.bitmap, self.src_rect.clone
  135.     self.bitmap = Bitmap.new(@old_bitmap.width, @old_bitmap.height)
  136.     self.bitmap.blt(0, 0, @old_bitmap, @old_bitmap.rect)
  137.     self.src_rect = old_src_rect
  138.   end
  139. end

  140. class Game_Event < Game_Character
  141.   attr_reader :large_sprite

  142.   alias :cp_081713_setup_page_settings :setup_page_settings
  143.   def setup_page_settings(*args)
  144.     cp_081713_setup_page_settings(*args)
  145.     get_large_sprite_conditions
  146.   end

  147.   def get_large_sprite_conditions
  148.     @large_sprite = false
  149.     return if @list.nil? || @list.empty?
  150.     @list.each do |line|
  151.       next unless line.code == 108 || line.code == 408
  152.       case line.parameters[0]
  153.       when /<large sprite>/i
  154.         @large_sprite = true
  155.       end
  156.     end
  157.   end
  158. end
复制代码


但是我跟着做了,人物的头依然被切掉了。而且我把游戏里所有其他脚本都删除了再测试,确保这个脚本不会和其他脚本发生冲突,但依然不管用。
请各位大大帮我一下,问题到底出在了哪里....  感激不尽!!

Lv1.梦旅人

梦石
0
星屑
100
在线时间
3 小时
注册时间
2017-8-25
帖子
3
2
 楼主| 发表于 2017-11-18 01:42:44 | 只看该作者
这是截图.....
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
4506
在线时间
1151 小时
注册时间
2016-10-28
帖子
551

开拓者

3
发表于 2017-11-18 10:38:09 | 只看该作者
本帖最后由 暮觉 于 2017-11-18 10:47 编辑

正常的解决方法1:把人物改小一点来避免这种问题。(60像素以下)
正常的解决方法2:石头改小一点不让他有遮挡部分。
不正常的解决方法1:把石头之类所有有遮挡的东西改成行走图。
不正常的解决方法2:换XP,优先级功能完美解决问题。

不过这个脚本应该能用才对,待我去试试看233……

看完了,脚本用的应该是「地形标志」不是「区域ID」哟。
以及你发的图片看不见,你真的通过上传附件传的图片吗。

评分

参与人数 1+1 收起 理由
MeowSnow + 1 觉的不正常1最正常

查看全部评分

用脑子来养鱼的杯子。
回复 支持 2 反对 0

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
100
在线时间
3 小时
注册时间
2017-8-25
帖子
3
4
 楼主| 发表于 2017-11-21 01:38:53 | 只看该作者
@暮觉 谢谢啊谢谢~!!!!!   
是的... 我把地形标志改成7,就OK了...  我一直以为是区域ID...  英文水平不行啊。。。  
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 13:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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