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

Project1

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

[RMXP发布] 初学RGSS,实现简单的推箱子功能。

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
14 小时
注册时间
2010-7-3
帖子
1
跳转到指定楼层
1
发表于 2013-12-21 12:53:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 jiaboxuan 于 2013-12-21 23:15 编辑

因为是刚刚开始接触RGSS,所以不知道我这样实现有什么弊端,期望有经验的朋友们来帮忙指正。
RUBY 代码复制下载
  1. #==============================================================================
  2. # ■ Game_Character_Box (自定义)
  3. #------------------------------------------------------------------------------
  4. # □ 扩展Game_Character
  5. #==============================================================================
  6.  
  7. class Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor   :destination            # 目的地
  12.   attr_accessor   :is_arrive              # 是否到达
  13.   #--------------------------------------------------------------------------
  14.   # ● 初始化对像
  15.   #--------------------------------------------------------------------------
  16.   def initialize_box
  17.     @destination = false
  18.     @is_arrive = false   
  19.     $pass_num = 0
  20.   end
  21. end

RUBY 代码复制下载
  1. #==============================================================================
  2. # ■ Interpreter_Box (自定义)
  3. #------------------------------------------------------------------------------
  4. # □ 扩展Interpreter
  5. #==============================================================================
  6. class Interpreter
  7.   #--------------------------------------------------------------------------
  8.   # ● 自定义脚本_设定目的地
  9.   #--------------------------------------------------------------------------
  10.   def command_set_destination   
  11.     unless get_character(0).destination
  12.       get_character(0).destination = true
  13.       $pass_num += 1
  14.     end  
  15.   end  
  16.   #--------------------------------------------------------------------------
  17.   # ● 自定义脚本_推箱子
  18.   #--------------------------------------------------------------------------
  19.   def command_pushbox
  20.  
  21.     row = 0
  22.     col = 0
  23.  
  24.     # 判断人物朝向
  25.     case $game_player.direction
  26.     when 2
  27.       row += 1
  28.     when 4
  29.       col -= 1
  30.     when 6
  31.       col += 1
  32.     when 8
  33.       row -= 1
  34.     end   
  35.  
  36.     # 箱子
  37.     box = get_character(0)
  38.  
  39.     # 地图上的这个位置不能通行的情况下
  40.     unless $game_map.passable?(box.x+col, box.y+row, 0)
  41.       return
  42.     end   
  43.  
  44.     # 遍历所有事件
  45.     for event in $game_map.events.values  
  46.       # 首先排除自己
  47.       if event.id != box.id
  48.         # 1.判断箱子后方是否存在将要触发的事件
  49.         if event.x == box.x+col && event.y == box.y+row
  50.           # 2.判断是否可以通过
  51.           if event.through
  52.             break
  53.           else            
  54.             return
  55.           end
  56.         end        
  57.       else
  58.           next
  59.       end
  60.     end
  61.  
  62.     # 如果方法可以执行到这里,说明触发了移动事件   
  63.     box.moveto(box.x+col, box.y+row)   
  64.     # 移动之后暂时不清楚是否到达目的,所以将标志位统一设置成false
  65.     box.is_arrive = false
  66.  
  67.     # 更新人物位置
  68.     case $game_player.direction
  69.     when 2
  70.       $game_player.move_down
  71.     when 4
  72.       $game_player.move_left
  73.     when 6
  74.       $game_player.move_right      
  75.     when 8
  76.       $game_player.move_up      
  77.     end   
  78.  
  79.     # 遍历所有事件,判断移动后的箱子是否到达目的地
  80.     for event in $game_map.events.values   
  81.       # 首先排除自己
  82.       if event.id != box.id
  83.         # 1.判断箱子所在位置是否存在事件
  84.         if event.x == box.x && event.y == box.y
  85.             # 2.判断该事件的目的地信息
  86.             if event.destination
  87.               box.is_arrive = true
  88.               break
  89.             else
  90.               return
  91.             end            
  92.         end
  93.       end  
  94.     end
  95.  
  96.     # 如果方法可以执行到这里,说明这次移动触发了到达目的地事件   
  97.     num = 0
  98.     # 遍历所有事件,统计到达目的地的箱子数量
  99.     for event in $game_map.events.values
  100.       if event.is_arrive
  101.         num +=1
  102.       end
  103.     end
  104.  
  105.     # 判断到达目的地的箱子数量和通关所需的数量是否一致   
  106.     if num != 0 && num == $pass_num
  107.       print "通关(打印信息会暂停动画效果,并非BUG.)"
  108.     end
  109.  
  110.   end  
  111. end



最后在 Game_Character 1 中 initialize 方法中调用 initialize_box 方法

在地图编辑时
1.如果需要设置箱子,
  编辑事件-->选项-->固定朝向
                -->事件开始条件-->与主角接触
                -->执行内如-->插入-->脚本-->command_pushbox
2.如果需要设置目的地,
  编辑事件-->选项-->允许穿透
                -->事件开始条件-->自动执行
                -->执行内容-->插入-->脚本-->command_set_destination
                -->执行内容-->插入-->操作独立开关-->A:ON
                -->新建事件页-->事件出现条件-->独立开关-->A 为 ON

Project1.rar

244.44 KB, 下载次数: 69

推箱子

评分

参与人数 1星屑 +300 收起 理由
怪蜀黍 + 300 发布奖

查看全部评分

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

2
发表于 2013-12-28 19:18:05 | 只看该作者
转换地图的话目测要出问题···具体情况不明···你可以看看我去年发的那个···可以改变量和开关
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-21 21:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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