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

Project1

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

关于事件制作航海的船

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
跳转到指定楼层
1
发表于 2008-5-24 04:42:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
请教高手,如何用事件制作航海的船?(事件中可用脚本)
主站上的航海脚本冲突!
版务信息:本贴由楼主自主结贴~

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

2
发表于 2008-5-24 04:47:19 | 只看该作者
看看这个:
http://rpg.blue/viewthread.php?tid=61462
系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
3
 楼主| 发表于 2008-5-24 04:58:34 | 只看该作者
那么如何让它只能在海上航行而不是一切地形?
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

4
发表于 2008-5-24 05:28:37 | 只看该作者
修改地形标志呀。

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv4.逐梦者

ST戰士

梦石
11
星屑
82
在线时间
1155 小时
注册时间
2007-5-5
帖子
3489

第5届短篇游戏比赛季军

5
发表于 2009-6-12 08:00:00 | 只看该作者
跨地图航海辅佐脚本

  1. =begin
  2. --------------------------------------------------------------------------
  3. 跨地图航海辅佐脚本 v1.1
  4. By 叶子
  5. Date 4-8-2006
  6. --------------------------------------------------------------------------
  7. 跨地图航海由一个脚本+一个事件完成

  8. 使用方法(请耐心阅读完全部说明!每一步都必不可少):

  9. -插入本脚本到Main之上

  10. -二选一:
  11. 一)插入航海脚本懒人插件到Main之上,或者
  12. 二)仔细观察插件脚本,找到:
  13.     #-----------插入船命令-----------
  14.     setup_ship
  15.     #--------------------------------
  16.    和
  17.     #---------插入船刷新命令---------
  18.     $game_player.shipping_update
  19.     #--------------------------------
  20. 插入到Game_Map中相同位置(出现冲突时采用此方法)

  21. -小船事件设置方法:
  22. 小船为范例工程工程里湖中的矿道车,可以改成其它船的行走图
  23. 第二页出现条件设置为航行中标志开关打开(默认50号开关),第三页为独立开关A打开

  24. -水中通行设置方法:
  25. 把所有水的图块的地形标志设置为1,把水中不可通行图块(例如水中礁石)的地形标志
  26. 设置为2或以上(反正要大于水的地形标志)

  27. 注意事项:

  28. -不明白小船实现原理的话最好不要改小船事件(除了注释说可以随便改的地方之外)
  29. -默认角色航行中的话,50号开关打开,这时可以利用并行公共事件判断角色遇敌等
  30. -航行中标志开关只能用于判断,不要在其它事件中打开或关闭,否则可能出错误

  31. =end

  32. SHIPPING_SWITCH = 50                # 默认50号开关为是否航行中标志开关

  33. #==============================================================================
  34. # ■ Game_Player
  35. #------------------------------------------------------------------------------
  36. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  37. # 本类的实例请参考 $game_player。
  38. #==============================================================================

  39. class Game_Player < Game_Character
  40.   TERRAIN_TAG = 1                     # 默认1号地形标志为水的地形标志
  41.   attr_accessor :x                    # x坐标
  42.   attr_accessor :y                    # y坐标
  43.   attr_accessor :shipping             # 航海中标志
  44.   attr_accessor :ship                 # 船信息
  45.   #--------------------------------------------------------------------------
  46.   # ● 航海更新
  47.   #--------------------------------------------------------------------------
  48.   def shipping_update
  49.     return if !@shipping
  50.     @old_x = @x
  51.     @old_y = @y
  52.     # 着陆判断初始化
  53.     @land = false
  54.     # 移动中、事件执行中、强制移动路线中、
  55.     # 信息窗口一个也不显示的时候
  56.     unless moving? or $game_system.map_interpreter.running? or
  57.            @move_route_forcing or $game_temp.message_window_showing
  58.       # 如果方向键被按下、主角就朝那个方向移动
  59.       case Input.dir4
  60.       when 2
  61.         ship_move_down
  62.       when 4
  63.         ship_move_left
  64.       when 6
  65.         ship_move_right
  66.       when 8
  67.         ship_move_up
  68.       end
  69.     end
  70.     # 着陆判断
  71.     if @land
  72.       end_shipping
  73.     end
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 开始航海
  77.   #--------------------------------------------------------------------------
  78.   def start_shipping(ship)
  79.     $game_player.shipping = true
  80.     need_setup = false
  81.     # 处女航的话,刷新地图
  82.     if @ship.nil?
  83.       need_setup = true
  84.     end
  85.     # 把船事件添加入资料中
  86.     @ship = ship
  87.     # 移动角色
  88.     @x = @ship.x
  89.     @y = @ship.y
  90.     # 记录位置
  91.     @ship.ship_position = [$game_map.map_id, @ship.x, @ship.y]
  92.     if need_setup
  93.       $game_map.setup_ship
  94.     end
  95.     $game_map.need_refresh = true
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 着陆
  99.   #--------------------------------------------------------------------------
  100.   def end_shipping
  101.     # 获取带头的角色
  102.     actor = $game_party.actors[0]
  103.     # 设置角色的文件名及对像
  104.     @character_name = actor.character_name
  105.     @character_hue = actor.character_hue
  106.     # 关闭标志
  107.     @shipping = false
  108.     $game_switches[SHIPPING_SWITCH] = false
  109.     # 关闭停止时动画
  110.     @step_anime = false
  111.     # 回复速度
  112.     @move_speed = 4
  113.     # 设置船位置
  114.     @ship.ship_position = [$game_map.map_id, @old_x, @old_y]
  115.     @ship.moveto(@ship.ship_position[1], @ship.ship_position[2])
  116.     # 刷新地图
  117.     $game_map.need_refresh = true
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 向下移动
  121.   #     turn_enabled : 本场地位置更改许可标志
  122.   #--------------------------------------------------------------------------
  123.   def ship_move_down(turn_enabled = true)
  124.     # 面向下
  125.     if turn_enabled
  126.       turn_down
  127.     end
  128.     # 可以通行的场合
  129.     if ship_passable?(@x, @y, 2)
  130.       # 面向下
  131.       turn_down
  132.       # 更新坐标
  133.       @y += 1
  134.       # 增加步数
  135.       increase_steps
  136.     # 不能通行的情况下
  137.     else
  138.       # 接触事件的启动判定
  139.       check_event_trigger_touch(@x, @y+1)
  140.     end
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 向左移动
  144.   #     turn_enabled : 本场地位置更改许可标志
  145.   #--------------------------------------------------------------------------
  146.   def ship_move_left(turn_enabled = true)
  147.     # 面向左
  148.     if turn_enabled
  149.       turn_left
  150.     end
  151.     # 可以通行的情况下
  152.     if ship_passable?(@x, @y, 4)
  153.       # 面向左
  154.       turn_left
  155.       # 更新坐标
  156.       @x -= 1
  157.       # 增加步数
  158.       increase_steps
  159.     # 不能通行的情况下
  160.     else
  161.       # 接触事件的启动判定
  162.       check_event_trigger_touch(@x-1, @y)
  163.     end
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ● 向右移动
  167.   #     turn_enabled : 本场地位置更改许可标志
  168.   #--------------------------------------------------------------------------
  169.   def ship_move_right(turn_enabled = true)
  170.     # 面向右
  171.     if turn_enabled
  172.       turn_right
  173.     end
  174.     # 可以通行的场合
  175.     if ship_passable?(@x, @y, 6)
  176.       # 面向右
  177.       turn_right
  178.       # 更新坐标
  179.       @x += 1
  180.       # 增加部数
  181.       increase_steps
  182.     # 不能通行的情况下
  183.     else
  184.       # 接触事件的启动判定
  185.       check_event_trigger_touch(@x+1, @y)
  186.     end
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 向上移动
  190.   #     turn_enabled : 本场地位置更改许可标志
  191.   #--------------------------------------------------------------------------
  192.   def ship_move_up(turn_enabled = true)
  193.     # 面向上
  194.     if turn_enabled
  195.       turn_up
  196.     end
  197.     # 可以通行的情况下
  198.     if ship_passable?(@x, @y, 8)
  199.       # 面向上
  200.       turn_up
  201.       # 更新坐标
  202.       @y -= 1
  203.       # 歩数増加
  204.       increase_steps
  205.     # 不能通行的情况下
  206.     else
  207.       # 接触事件的启动判定
  208.       check_event_trigger_touch(@x, @y-1)
  209.     end
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   # ● 可以通行判定
  213.   #     x : X 坐标
  214.   #     y : Y 坐标
  215.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  216.   #--------------------------------------------------------------------------
  217.   def ship_passable?(x, y, d)
  218.     # 求得新的坐标
  219.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  220.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  221.     # 坐标在地图以外的情况
  222.     unless $game_map.valid?(new_x, new_y)
  223.       # 不能通行
  224.       return false
  225.     end
  226.     # 穿透是 ON 的情况下
  227.     if @through
  228.       # 可以通行
  229.       return true
  230.     end
  231.     # 循环全部事件
  232.     for event in $game_map.events.values
  233.       # 事件坐标于移动目标坐标一致的情况下
  234.       if event.x == new_x and event.y == new_y
  235.         # 穿透为 ON
  236.         unless event.through
  237.           # 自己就是事件的情况下
  238.           if self != $game_player
  239.             # 不能通行
  240.             return false
  241.           end
  242.           # 自己是主角、对方的图形是角色的情况下
  243.           if event.character_name != ""
  244.             # 不能通行
  245.             return false
  246.           end
  247.         end
  248.       end
  249.     end
  250.     # 主角的坐标与移动目标坐标一致的情况下
  251.     if $game_player.x == new_x and $game_player.y == new_y
  252.       # 穿透为 ON
  253.       unless $game_player.through
  254.         # 自己的图形是角色的情况下
  255.         if @character_name != ""
  256.           # 不能通行
  257.           return false
  258.         end
  259.       end
  260.     end
  261.     # 地形标志判断通行
  262.     for i in [2, 1, 0]
  263.       tile_id = $game_map.data[new_x, new_y, i]
  264.       return false if tile_id == nil
  265.     end
  266.     if $game_map.terrain_tag(new_x, new_y) != TERRAIN_TAG
  267.       if passable?(new_x, new_y, 0)
  268.         @land = true
  269.         return true
  270.       end
  271.       return false
  272.     end
  273.     # 可以通行
  274.     return true
  275.   end
  276. end

  277. #==============================================================================
  278. # ■ Game_Map
  279. #------------------------------------------------------------------------------
  280. #  处理地图的类。包含卷动以及可以通行的判断功能。
  281. # 本类的实例请参考 $game_map 。
  282. #==============================================================================

  283. class Game_Map
  284.   attr_accessor :events                    # 事件
  285.   def setup_ship
  286.     return if $game_player.ship.nil?
  287.     # 航行中或船停泊在此则创建船事件
  288.     if $game_player.shipping or $game_player.ship.ship_position[0] == @map_id
  289.       id = @events.values.size + 1
  290.       # 防止事件错误
  291.       while @events[id] != nil
  292.         id += 1
  293.       end
  294.       @events[id] = $game_player.ship
  295.       @events[id].id = id
  296.       @events[id].map_id = @map_id
  297.       @events[id].moveto($game_player.ship.ship_position[1],
  298.       $game_player.ship.ship_position[2])
  299.       # 不在航行中则关闭开关使船出现
  300.       if !$game_player.shipping
  301.         $game_switches[SHIPPING_SWITCH] = false
  302.       end
  303.     end
  304.   end
  305. end

  306. #==============================================================================
  307. # ■ Game_Event
  308. #------------------------------------------------------------------------------
  309. #  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
  310. # 在 Game_Map 类的内部使用。
  311. #==============================================================================

  312. class Game_Event < Game_Character
  313.   #--------------------------------------------------------------------------
  314.   # ● 定义实例变量
  315.   #--------------------------------------------------------------------------
  316.   attr_accessor :id                               # 事件ID
  317.   attr_accessor :map_id                           # 地图ID
  318.   attr_accessor :ship_position                    # 记录船位置数组
  319.   #--------------------------------------------------------------------------
  320.   # ● 越过目标判定 (不能将相同位置作为启动条件)
  321.   #--------------------------------------------------------------------------
  322.   def over_trigger?
  323.     # 图形是角色、没有开启穿透的情况下
  324.     if @character_name != "" and not @through
  325.       # 启动判定是正面
  326.       return false
  327.     end
  328.     # 地图上的这个位置不能通行,并且不在航海中的情况下
  329.     if !$game_map.passable?(@x, @y, 0) and $game_player.shipping != true
  330.       # 启动判定是正面
  331.       return false
  332.     end
  333.     # 启动判定在同位置
  334.     return true
  335.   end
  336.   def id=(new_id)
  337.     @id = new_id
  338.     @event.id = new_id
  339.   end
  340. end

  341. #==============================================================================
  342. # ■ Interpreter
  343. #------------------------------------------------------------------------------
  344. #  执行事件命令的解释器。本类在 Game_System 类
  345. # 与 Game_Event 类的内部使用。
  346. #==============================================================================

  347. class Interpreter
  348.   #--------------------------------------------------------------------------
  349.   # ● 开始航海
  350.   #--------------------------------------------------------------------------
  351.   def start_shipping
  352.     $game_player.start_shipping($game_map.events[@event_id])
  353.   end
  354. end
复制代码


航海脚本懒人插件
  1. =begin
  2. --------------------------------------------------------------------------
  3. 航海脚本懒人插件
  4. By 叶子
  5. Date 4-7-2006
  6. --------------------------------------------------------------------------

  7. 本脚本是跨地图航海辅佐脚本的插件

  8. -使用方法二选一:
  9. 一)插入本插件到Main之上,或者
  10. 二)仔细观察插件脚本,找到:
  11.     #-----------插入船命令-----------
  12.     setup_ship
  13.     #--------------------------------
  14.    和
  15.     #---------插入船刷新命令---------
  16.     $game_player.shipping_update
  17.     #--------------------------------
  18. 插入到Game_Map中相同位置(出现冲突时采用此方法,删除本插件)

  19. =end

  20. #==============================================================================
  21. # ■ Game_Map
  22. #------------------------------------------------------------------------------
  23. #  处理地图的类。包含卷动以及可以通行的判断功能。
  24. # 本类的实例请参考 $game_map 。
  25. #==============================================================================

  26. class Game_Map
  27.   #--------------------------------------------------------------------------
  28.   # ● 设置
  29.   #     map_id : 地图 ID
  30.   #--------------------------------------------------------------------------
  31.   def setup(map_id)
  32.     # 地图 ID 记录到 @map_id
  33.     @map_id = map_id
  34.     # 地图文件装载后、设置到 @map
  35.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  36.     # 定义实例变量设置地图元件信息
  37.     tileset = $data_tilesets[@map.tileset_id]
  38.     @tileset_name = tileset.tileset_name
  39.     @autotile_names = tileset.autotile_names
  40.     @panorama_name = tileset.panorama_name
  41.     @panorama_hue = tileset.panorama_hue
  42.     @fog_name = tileset.fog_name
  43.     @fog_hue = tileset.fog_hue
  44.     @fog_opacity = tileset.fog_opacity
  45.     @fog_blend_type = tileset.fog_blend_type
  46.     @fog_zoom = tileset.fog_zoom
  47.     @fog_sx = tileset.fog_sx
  48.     @fog_sy = tileset.fog_sy
  49.     @battleback_name = tileset.battleback_name
  50.     @passages = tileset.passages
  51.     @priorities = tileset.priorities
  52.     @terrain_tags = tileset.terrain_tags
  53.     # 初始化显示坐标
  54.     @display_x = 0
  55.     @display_y = 0
  56.     # 清除刷新要求标志
  57.     @need_refresh = false
  58.     # 设置地图事件数据
  59.     @events = {}
  60.     for i in @map.events.keys
  61.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  62.     end
  63.     # 设置公共事件数据
  64.     @common_events = {}
  65.     for i in 1...$data_common_events.size
  66.       @common_events[i] = Game_CommonEvent.new(i)
  67.     end
  68.     # 初始化雾的各种信息
  69.     @fog_ox = 0
  70.     @fog_oy = 0
  71.     @fog_tone = Tone.new(0, 0, 0, 0)
  72.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  73.     @fog_tone_duration = 0
  74.     @fog_opacity_duration = 0
  75.     @fog_opacity_target = 0
  76.     # 初始化滚动信息
  77.     @scroll_direction = 2
  78.     @scroll_rest = 0
  79.     @scroll_speed = 4
  80.     #-----------插入船命令-----------
  81.     setup_ship
  82.     #--------------------------------
  83.   end
  84.   #--------------------------------------------------------------------------
  85.   # ● 刷新画面
  86.   #--------------------------------------------------------------------------
  87.   def update
  88.     # 还原必要的地图
  89.     if $game_map.need_refresh
  90.       refresh
  91.     end
  92.     #---------插入船刷新命令---------
  93.     $game_player.shipping_update
  94.     #--------------------------------
  95.     # 滚动中的情况下
  96.     if @scroll_rest > 0
  97.       # 滚动速度变化为地图坐标系的距离
  98.       distance = 2 ** @scroll_speed
  99.       # 执行滚动
  100.       case @scroll_direction
  101.       when 2  # 下
  102.         scroll_down(distance)
  103.       when 4  # 左
  104.         scroll_left(distance)
  105.       when 6  # 右
  106.         scroll_right(distance)
  107.       when 8  # 上
  108.         scroll_up(distance)
  109.       end
  110.       # 滚动距离的减法运算
  111.       @scroll_rest -= distance
  112.     end
  113.     # 更新地图事件
  114.     for event in @events.values
  115.       event.update
  116.     end
  117.     # 更新公共事件
  118.     for common_event in @common_events.values
  119.       common_event.update
  120.     end
  121.     # 处理雾的滚动
  122.     @fog_ox -= @fog_sx / 8.0
  123.     @fog_oy -= @fog_sy / 8.0
  124.     # 处理雾的色调变更
  125.     if @fog_tone_duration >= 1
  126.       d = @fog_tone_duration
  127.       target = @fog_tone_target
  128.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  129.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  130.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  131.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  132.       @fog_tone_duration -= 1
  133.     end
  134.     # 处理雾的不透明度变更
  135.     if @fog_opacity_duration >= 1
  136.       d = @fog_opacity_duration
  137.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  138.       @fog_opacity_duration -= 1
  139.     end
  140.   end
  141. end
复制代码


把这两个脚本插进 main 的上面。
系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
我是昵称 JIN 的迅雷進,是一位以日本特攝講解爲主的馬來西亞 YouTuber。

歡迎瀏覽我的頻道:JinRaiXin -迅雷進-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
6
 楼主| 发表于 2008-5-25 00:11:42 | 只看该作者
以下引用八云紫于2008-5-23 21:28:37的发言:
修改地形标志呀。


研究了很久,由于技术太烂,失败!
比如海的地形标志为1,那么怎么判定只在海上才能移动?
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

7
发表于 2008-5-25 00:13:41 | 只看该作者
那就使用 迅雷進 的脚本试试。

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
8
 楼主| 发表于 2008-5-25 04:33:20 | 只看该作者
用了迅雷進的脚本,发生脚本冲突!
最好是用纯事件制作(可用事件中的脚本)

回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

9
发表于 2008-5-25 04:34:39 | 只看该作者
那就看看这个:
http://rpg.blue/viewthread.php?tid=87708&ntime=2008%2D5%2D24+20%3A33%3A54

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-15
帖子
66
10
 楼主| 发表于 2008-5-25 04:53:26 | 只看该作者
问题是怎么判定,当地形标志为1时可通行,其余地形不可通行!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-12 20:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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