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

Project1

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

关于XP影子系统和远大近小的整合问题。

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
62
在线时间
1 小时
注册时间
2008-1-4
帖子
260
跳转到指定楼层
1
发表于 2008-12-11 20:33:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  1. #使用方法:不透明的物体在光源旁边会产生一个阴影。
  2. #所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)
  3. #然后将此脚本命名为“人物阴影”插入到main上方即可。

  4. #==============================================================================
  5. # ■ 阴影精灵 (渐变精灵 )
  6. # 以 Genzai Kawakami的阴影脚本为基础,
  7. #  Rataime为其重写和更新,
  8. #  Boushy 为其添加附属功能
  9. #  精灵使者汉化
  10. #==============================================================================

  11. CATERPILLAR_COMPATIBLE = true

  12. class Game_Party
  13. attr_reader :characters
  14. end

  15. class Sprite_Shadow < RPG::Sprite

  16. attr_accessor :character

  17. def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
  18.    super(viewport)
  19.    @anglemin=anglemin.to_f
  20.    @anglemax=anglemax.to_f
  21.    @distancemax=distancemax.to_f
  22.    @character = character
  23.    @source = source
  24.    update
  25. end

  26. def update
  27.    super
  28.    
  29.    if @tile_id != @character.tile_id or
  30.       @character_name != @character.character_name or
  31.       @character_hue != @character.character_hue
  32.      @tile_id = @character.tile_id
  33.      @character_name = @character.character_name
  34.      @character_hue = @character.character_hue
  35.      if @tile_id >= 384
  36.        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  37.          @tile_id, @character.character_hue)
  38.        self.src_rect.set(0, 0, 32, 32)
  39.        self.ox = 16
  40.        self.oy = 32
  41.      else
  42.        self.bitmap = RPG::Cache.character(@character.character_name,
  43.          @character.character_hue)
  44.        @cw = bitmap.width / 4
  45.        @ch = bitmap.height / 4
  46.        self.ox = @cw / 2
  47.        self.oy = @ch
  48.      end
  49.    end
  50.    self.visible = (not @character.transparent)
  51.    if @tile_id == 0
  52.      sx = @character.pattern * @cw
  53.      sy = (@character.direction - 2) / 2 * @ch
  54.      if self.angle>90 or angle<-90
  55.        if @character.direction== 6
  56.               sy = ( 4- 2) / 2 * @ch
  57.        end
  58.        if @character.direction== 4
  59.               sy = ( 6- 2) / 2 * @ch
  60.        end
  61.        if @character.direction== 2
  62.               sy = ( 8- 2) / 2 * @ch
  63.        end
  64.        if @character.direction== 8
  65.               sy = ( 2- 2) / 2 * @ch
  66.        end
  67.      end
  68.      self.src_rect.set(sx, sy, @cw, @ch)
  69.    end
  70.    self.x = @character.screen_x
  71.    self.y = @character.screen_y-5
  72.    self.z = @character.screen_z(@ch)-1
  73.    self.opacity = @character.opacity
  74.    self.blend_type = @character.blend_type
  75.    self.bush_depth = @character.bush_depth
  76.    if @character.animation_id != 0
  77.      animation = $data_animations[@character.animation_id]
  78.      animation(animation, true)
  79.      @character.animation_id = 0
  80.    end
  81.    @[email protected]
  82.    @deltay= @source.y-self.y
  83.    self.angle = 57.3*Math.atan2(@deltax, @deltay )
  84.    @angle_trigo=self.angle+90
  85.    if @angle_trigo<0
  86.      @angle_trigo=360+@angle_trigo
  87.    end
  88.    self.color = Color.new(50,50,50)#
  89.    @distance = ((@deltax ** 2) + (@deltay ** 2))
  90.     if$game_map.shadows==-1
  91.       self.opacity = 0
  92.     else
  93.       self.opacity = 1200000/(@distance+6000)   
  94.     end
  95.    @distance = @distance ** 0.5
  96.    if @distancemax !=0 and @distance>=@distancemax
  97.      self.opacity=0
  98.    end
  99.    if @anglemin !=0 or @anglemax !=0
  100.       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
  101.         self.opacity=0
  102.       end
  103.       if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
  104.         self.opacity=0
  105.       end     
  106.    end
  107. end
  108. end

  109. #===================================================
  110. # ■ 重定义 Sprite_Character
  111. #===================================================

  112. class Sprite_Character < RPG::Sprite
  113. alias shadow_initialize initialize

  114. def initialize(viewport, character = nil)
  115.    @character = character
  116.    super(viewport)
  117.    @ombrelist=[]
  118.    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
  119.      if (character.list[1]!=nil and character.list[1].code == 108)
  120.        @anglemin=character.list[1].parameters[0]
  121.      end
  122.      if (character.list[2]!=nil and character.list[2].code == 108)
  123.        @anglemax=character.list[2].parameters[0]
  124.      end
  125.      if (character.list[3]!=nil and character.list[3].code == 108)
  126.        @distancemax=character.list[3].parameters[0]
  127.      end  
  128.     for i in $game_map.events.keys.sort
  129.      if ($game_map.events[i].is_a?(Game_Event) and $game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
  130.        @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
  131.      end
  132.     end
  133.     @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
  134. #===================================================
  135. # ● 原装人物跟随兼容脚本
  136. #===================================================
  137. if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil

  138. for member in $game_party.characters
  139.    @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
  140. end

  141. end
  142. #===================================================
  143. # ● 兼容脚本结束
  144. #===================================================
  145.    end
  146.    shadow_initialize(viewport, @character)
  147. end

  148. alias shadow_update update

  149. def update
  150.    shadow_update
  151.    if @ombrelist!=[]
  152.      for i in [email protected]
  153.        if @ombrelist[i]!=nil
  154.          @ombrelist[i].update
  155.        end
  156.      end
  157.    end
  158. end  

  159. end

  160. #===================================================
  161. # ■ 新定义类Scene_Save
  162. #===================================================
  163. class Scene_Save < Scene_File

  164. alias shadows_write_save_data write_save_data

  165. def write_save_data(file)
  166.    $game_map.shadows = nil
  167.    shadows_write_save_data(file)
  168. end
  169. end

  170. #===================================================
  171. # ■ 新定义类 Game_Map
  172. #===================================================
  173. class Game_Map
  174. attr_accessor :shadows
  175. end

复制代码

如上是你发布的那个XP的影子系统,下面是亿万星辰的近大远小的效果
  1. #==============================================================================
  2. # 近大远小 V 1.0 BY 亿万星辰
  3. #==============================================================================
  4. # 似乎很多人都很喜欢类似天之痕里人物在地图上的位置的不同,人物大小的相应改变。
  5. # 所以写了这个……一开始我还说很难实现……  =。= 汗,被自己推翻了……
  6. # 看来勇于探索的精神还是要有的……
  7. #
  8. # 不废话了,说下使用方法:
  9. # 因为考虑到不可能所有的地图都用到这个效果,所以使用了这样的方法。如果想要实现
  10. # 这个效果的,那么请在地图名中加入“★”这个标志,这样就会按照近大远小来处理人
  11. # 物,否则效果不变。
  12. # 另外,人物在放大后会略显毛边儿,这也是没办法的,呵呵~~
  13. # 此脚本对NPC同样适用……具体可参考演示。
  14. #==============================================================================

  15. class Scene_Title
  16. alias stars_main main
  17. def main
  18.    stars_main
  19.    $data_mapinfos      = load_data("Data/MapInfos.rxdata")
  20. end
  21. end

  22. class Sprite_Character < RPG::Sprite
  23. alias stars_update update
  24. def update
  25.    stars_update
  26.    id = $game_map.map_id
  27.    name = $data_mapinfos[id].name
  28.    if name.include?("★")
  29.      rate =  @character.y.to_f / $game_map.height.to_f + 0.5 # ← 这个值是到达屏幕最上方时的人物比例 1.0为默认大小 最下方比例则为 1+这个值
  30.      self.zoom_x = self.zoom_y = rate
  31.    end
  32. end
  33. end
复制代码


我想说的是,可不可以将这两个脚本整合,当人变小后影子也随之变小,真正的实现影随身动,另外这个影子系统的旋转角度,以及与光远距离远近产生的浓淡效果可不可以改成可以在游戏里调用呢?
麻烦看看,谢谢!

此贴于 2008-12-12 12:40:33 被版主darkten提醒,请楼主看到后对本贴做出回应。
此贴于 2009-1-1 18:12:40 被版主darkten提醒,请楼主看到后对本贴做出回应。
版务信息:本贴由楼主自主结贴~
本贴由论坛斑竹darkten结贴,如楼主认为问题未解决,请重新将此贴编辑为“有事请教”,并回帖叙述疑点即可~ ^-^

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

2
发表于 2008-12-11 20:40:04 | 只看该作者
整合脚本这个不是太在行哦~
什么时候我去找SLICK
我也想要此类想法,奖励由我出好了~事后结算。
另外VX版本的最好整合进烛光系统,嗯哪
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-5
帖子
730
3
发表于 2008-12-12 04:54:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
62
在线时间
1 小时
注册时间
2008-1-4
帖子
260
4
 楼主| 发表于 2008-12-12 21:11:35 | 只看该作者
以下引用一路一风尘于2008-12-11 20:54:37的发言:

在缩放部分加上影子对象,正四方向以主角边做基准,斜四方向以主角顶角做基准。


能不能说的具体些~~ 谢谢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
5
发表于 2009-1-3 23:47:36 | 只看该作者
  1. #使用方法:不透明的物体在光源旁边会产生一个阴影。
  2. #所以,在光源的事件里面(例如火),请在第一页加上一个注释“s”(请不要带引号)
  3. #然后将此脚本命名为“人物阴影”插入到main上方即可。

  4. #==============================================================================
  5. # ■ 阴影精灵 (渐变精灵 )
  6. # 以 Genzai Kawakami的阴影脚本为基础,
  7. #  Rataime为其重写和更新,
  8. #  Boushy 为其添加附属功能
  9. #  精灵使者汉化
  10. #==============================================================================

  11. CATERPILLAR_COMPATIBLE = true

  12. class Game_Party
  13. attr_reader :characters
  14. end

  15. class Sprite_Shadow < RPG::Sprite

  16. attr_accessor :character

  17. def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
  18.    super(viewport)
  19.    @anglemin=anglemin.to_f
  20.    @anglemax=anglemax.to_f
  21.    @distancemax=distancemax.to_f
  22.    @character = character
  23.    @source = source
  24.    update
  25. end

  26. def update
  27.    super
  28.    
  29.    if @tile_id != @character.tile_id or
  30.       @character_name != @character.character_name or
  31.       @character_hue != @character.character_hue
  32.      @tile_id = @character.tile_id
  33.      @character_name = @character.character_name
  34.      @character_hue = @character.character_hue
  35.      if @tile_id >= 384
  36.        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  37.          @tile_id, @character.character_hue)
  38.        self.src_rect.set(0, 0, 32, 32)
  39.        self.ox = 16
  40.        self.oy = 32
  41.      else
  42.        self.bitmap = RPG::Cache.character(@character.character_name,
  43.          @character.character_hue)
  44.        @cw = bitmap.width / 4
  45.        @ch = bitmap.height / 4
  46.        self.ox = @cw / 2
  47.        self.oy = @ch
  48.      end
  49.    end
  50.    self.visible = (not @character.transparent)
  51.    if @tile_id == 0
  52.      sx = @character.pattern * @cw
  53.      sy = (@character.direction - 2) / 2 * @ch
  54.      if self.angle>90 or angle<-90
  55.        if @character.direction== 6
  56.               sy = ( 4- 2) / 2 * @ch
  57.        end
  58.        if @character.direction== 4
  59.               sy = ( 6- 2) / 2 * @ch
  60.        end
  61.        if @character.direction== 2
  62.               sy = ( 8- 2) / 2 * @ch
  63.        end
  64.        if @character.direction== 8
  65.               sy = ( 2- 2) / 2 * @ch
  66.        end
  67.      end
  68.      self.src_rect.set(sx, sy, @cw, @ch)
  69.    end
  70.    self.x = @character.screen_x
  71.    self.y = @character.screen_y-5
  72.    self.z = @character.screen_z(@ch)-1
  73.    self.opacity = @character.opacity
  74.    self.blend_type = @character.blend_type
  75.    self.bush_depth = @character.bush_depth
  76.    if @character.animation_id != 0
  77.      animation = $data_animations[@character.animation_id]
  78.      animation(animation, true)
  79.      @character.animation_id = 0
  80.    end
  81.    @[email protected]
  82.    @deltay= @source.y-self.y
  83.    self.angle = 57.3*Math.atan2(@deltax, @deltay )
  84.    @angle_trigo=self.angle+90
  85.    if @angle_trigo<0
  86.      @angle_trigo=360+@angle_trigo
  87.    end
  88.    self.color = Color.new(50,50,50)#
  89.    @distance = ((@deltax ** 2) + (@deltay ** 2))
  90.     if$game_map.shadows==-1
  91.       self.opacity = 0
  92.     else
  93.       self.opacity = 1200000/(@distance+6000)   
  94.     end
  95.    @distance = @distance ** 0.5
  96.    if @distancemax !=0 and @distance>=@distancemax
  97.      self.opacity=0
  98.    end
  99.    if @anglemin !=0 or @anglemax !=0
  100.       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
  101.         self.opacity=0
  102.       end
  103.       if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
  104.         self.opacity=0
  105.       end     
  106.     end
  107.    $data_mapinfos      = load_data("Data/MapInfos.rxdata")
  108.    id = $game_map.map_id
  109.    name = $data_mapinfos[id].name
  110.    if name.include?("★")
  111.      rate =  @character.y.to_f / $game_map.height.to_f + 0.5 # ← 这个值是到达屏幕最上方时的人物比例 1.0为默认大小 最下方比例则为 1+这个值
  112.      self.zoom_x = self.zoom_y = rate
  113.    end

  114. end
  115. end

  116. #===================================================
  117. # ■ 重定义 Sprite_Character
  118. #===================================================

  119. class Sprite_Character < RPG::Sprite
  120. alias shadow_initialize initialize

  121. def initialize(viewport, character = nil)
  122.    @character = character
  123.    super(viewport)
  124.    @ombrelist=[]
  125.    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
  126.      if (character.list[1]!=nil and character.list[1].code == 108)
  127.        @anglemin=character.list[1].parameters[0]
  128.      end
  129.      if (character.list[2]!=nil and character.list[2].code == 108)
  130.        @anglemax=character.list[2].parameters[0]
  131.      end
  132.      if (character.list[3]!=nil and character.list[3].code == 108)
  133.        @distancemax=character.list[3].parameters[0]
  134.      end  
  135.     for i in $game_map.events.keys.sort
  136.      if ($game_map.events[i].is_a?(Game_Event) and $game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
  137.        @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
  138.      end
  139.     end
  140.     @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
  141. #===================================================
  142. # ● 原装人物跟随兼容脚本
  143. #===================================================
  144. if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil

  145. for member in $game_party.characters
  146.    @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
  147. end

  148. end
  149. #===================================================
  150. # ● 兼容脚本结束
  151. #===================================================
  152.    end
  153.    shadow_initialize(viewport, @character)
  154. end

  155. alias shadow_update update

  156. def update
  157.    shadow_update
  158.    if @ombrelist!=[]
  159.      for i in [email protected]
  160.        if @ombrelist[i]!=nil
  161.          @ombrelist[i].update
  162.        end
  163.      end
  164.    end
  165. end  

  166. end

  167. #===================================================
  168. # ■ 新定义类Scene_Save
  169. #===================================================
  170. class Scene_Save < Scene_File

  171. alias shadows_write_save_data write_save_data

  172. def write_save_data(file)
  173.    $game_map.shadows = nil
  174.    shadows_write_save_data(file)
  175. end
  176. end

  177. #===================================================
  178. # ■ 新定义类 Game_Map
  179. #===================================================
  180. class Game_Map
  181. attr_accessor :shadows
  182. end

复制代码
  1. #==============================================================================
  2. # 近大远小 V 1.0 BY 亿万星辰
  3. #==============================================================================
  4. # 似乎很多人都很喜欢类似天之痕里人物在地图上的位置的不同,人物大小的相应改变。
  5. # 所以写了这个……一开始我还说很难实现……  =。= 汗,被自己推翻了……
  6. # 看来勇于探索的精神还是要有的……
  7. #
  8. # 不废话了,说下使用方法:
  9. # 因为考虑到不可能所有的地图都用到这个效果,所以使用了这样的方法。如果想要实现
  10. # 这个效果的,那么请在地图名中加入“★”这个标志,这样就会按照近大远小来处理人
  11. # 物,否则效果不变。
  12. # 另外,人物在放大后会略显毛边儿,这也是没办法的,呵呵~~
  13. # 此脚本对NPC同样适用……具体可参考演示。
  14. #==============================================================================

  15. class Scene_Title
  16. alias stars_main main
  17. def main
  18.    stars_main
  19.    $data_mapinfos      = load_data("Data/MapInfos.rxdata")
  20. end
  21. end

  22. class Sprite_Character < RPG::Sprite
  23. alias stars_update update
  24. def update
  25.    stars_update
  26.    id = $game_map.map_id
  27.    name = $data_mapinfos[id].name
  28.    if name.include?("★")
  29.      rate =  @character.y.to_f / $game_map.height.to_f + 0.5 # ← 这个值是到达屏幕最上方时的人物比例 1.0为默认大小 最下方比例则为 1+这个值
  30.      self.zoom_x = self.zoom_y = rate
  31.    end
  32. end
  33. end
复制代码

系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-20 01:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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