Project1

标题: 警察抓小偷升级版脚本 [打印本页]

作者: shanxiang1121    时间: 2016-8-21 23:42
标题: 警察抓小偷升级版脚本
本帖最后由 shanxiang1121 于 2016-8-22 15:38 编辑

刚刚接触VX脚本的新人一枚,由于一些原因,弄了一个类似于警察抓小偷的游戏的脚本,实现的功能大致为:


1.在目标事件前3*3的范围内贴图一张


2.当主角进入该范围后,将会被打回原点直到通关


今天先发游戏示例一个(内涵脚本),之后再进行详解(当然,由于本人比较懒,所以游戏做的很简单粗暴,大家看看就好【笑】)



由于昨天时间比较晚,所以补充一下,这个脚本只是初版,后面会做一些自己的改进,我会尽量吧这个做的通用一点。


补充一下以后目标实现的功能:


1.关于目标范围的界定(现在只是3*3,后面希望可以做成可控范围的)


2.进入范围以内的单体对话——每个事件可以自行添加一个碰到主角后的特色对话(这个的启发来源于很多年前的口袋怪兽)


3.部分非矩形区域的支持:为使游戏效果更为逼真,希望以后可以做到对一些非矩形的常见图形(暂定为三角形或梯形)的特别碰撞判定


4.目标区域隐藏的功能:在游戏可以进行的情况下,把会被发现的红色区域隐藏


5.可添加事件上限的问题——这个属于懒癌晚期没有做的功能,不过我觉得20个事件其实也应该够用了





游戏截图

示例1.rar (244.08 KB, 下载次数: 99)
作者: 鑫晴    时间: 2016-8-22 14:15
哈哈,很不错呢!

配合移动路线,可以制作出正在"巡逻的警察",玩家不能进入警察手电筒 / 视线范围。
如果进入范围,就会惊动附近的警察,或者即死事件。


如果再完善一些,希望未来可以自定义范围,那就更不错了~(不局限3X3)


作者: shanxiang1121    时间: 2016-8-22 14:35
鑫晴 发表于 2016-8-22 14:15
哈哈,很不错呢!

配合移动路线,可以制作出正在"巡逻的警察",玩家不能进入警察手电筒 / 视线范围。

这个我也考虑过,后面会再进行修改,这个只是一个比较基本的版本
作者: shanxiang1121    时间: 2016-8-22 15:37
先发一个简易的简易使用说明(这只是根据示例1所弄出来的一种使用方法,只是可行,不一定是最简的使用方法——毕竟我对于RMVX本身的功能了解的并不算多)

1.将脚本文件添加至脚本编辑器
该脚本文件共有两部分:Red_Rect、Hach_Red(在脚本编辑器外来RGSS插件脚本部分),用复制粘贴功能把文本放入新建脚本即可

2.添加画框所需图片,并修改路径,设置图片透明度
添加图片规格:本脚本目前适应的是3*3格范围判断,图片大小为96*96像素(由于部分操作设计缩放,推荐使用纯色图片),将图片放到工程文件夹下后,并在Red_Rect脚本中修改所添加的相对路径,设置所需的图片透明度(见下图)


3.创建用于使用的对象
在Red_Rect、Hach_Red文件下创建新的脚本,并新建一个Hach_Red类型的全局变量(如下图)


4.用add函数添加调用该功能的事件ID


这里需要注意的是,事件的设置上限为20个,如果需要更多地话,可在脚本文件Hach_Red中,将上限值Red_Max进行修改(如下图)


5.设置在外部调用红框位置跟新函数upset


6.调用碰撞判断函数crash?

这里再强调一下,这个函数不要和位置更新函数upset放在一起,不然在碰撞事件发生后危险区域会无法同步,对游戏效果会有影响

7.设置碰撞后事件

再解释一下reset_event函数所必须调用的原因,如果你的事件的 移动方式是靠近主角的话,当你第一次没有逃脱后,他会在抓住你的位置对你进行继续追击,同时,因为并行的处理模式,在发生碰撞后剧情的时候这个事件还会动,然后你就会发现,走不过去了
另,由于我对开关的理解有限,如果原搬应用的话这个事件最好和上面那个开开关的操作放在一起,不然似乎不顶用(看我以后能不能找到更好的方法吧)

8.游戏通关后删除所有对象



这样一个游戏就做完了(其实就是示例1了),就像我开头所说的,这只是一种使用方法,大概囊括了脚本目前的所有功能,具体的其他应用方法,还是看大家了
作者: shanxiang1121    时间: 2016-8-22 16:24
然后再单独说明一下脚本(虽然是写了注释的),主要还是分享一下意图和思路吧

  1. #==============================================================================
  2. # ■ Red_Rect
  3. #    制作人:嬗湘
  4. #------------------------------------------------------------------------------
  5. #  进行游戏时,用于画出危险区,并进行相关判定的类
  6. #==============================================================================

  7. #常量区,出于通用性考虑,用于定义一些游戏中不会改动,但不同游戏会有些不同的量,便于使用者修改

  8. Address = "Graphics/Pictures/red.png"  #图片地址
  9. Opacity = 100                          #图片透明度

  10. #功能类,其实所有的逻辑基本来自于这里,而用这边也可以直接完成这个游戏
  11. class Red_Rect
  12.   #------------------------------------------------------------------------------
  13.   # ● 定义实例变量
  14.   #------------------------------------------------------------------------------  
  15.   attr_accessor :event_id       #事件对象id
  16.   attr_accessor :event_x        #事件对象初始x坐标
  17.   attr_accessor :event_y        #事件对象初始y坐标
  18.   attr_accessor :red_sprite     #用于贴图的精灵对象
  19.   #------------------------------------------------------------------------------
  20.   # ● 初始化对像
  21.   #------------------------------------------------------------------------------
  22.    def initialize
  23.      @event_id = 0
  24.      @red_sprite = Sprite.new
  25.      @red_sprite.bitmap = Bitmap.new(Address)
  26.      @red_sprite.visible = false    #由于大部分时候不可用,以及Hach_Red中的再包装,这路的精灵最初设定为不可见
  27.      @red_sprite.opacity = Opacity
  28.      @event_x = 0
  29.      @event_y = 0
  30.    end
  31.   
  32.   #----------------------------------------------------------------------------
  33.   # ● 刷新红色边框
  34.   #----------------------------------------------------------------------------
  35.   def upset
  36.     ev = $game_map.events[@event_id]  #获得event_id对应的事件
  37.     case ev.direction   #针对事件面对的不同方向生成对应的精灵坐标,至于这个数字为什么是这样(请看数字键盘)
  38.     #ev.real_x,ev.real_y精灵实际坐标(相对于大地图,一格以256计)
  39.     #$game_map.display_x,$game_map.display_y界面左上角相对应与大地图的坐标(一格以256计)
  40.     #red_sprite.x,red_sprite.y所用于贴图的精灵的坐标(相对于当前屏幕,一格以32计)
  41.     #由于比例差,所以可以看到一个 / 8 的计算
  42.     #后面的加减 n * 32,则是根据事件坐标算贴图左上角的坐标的一种计算方法(自己画个图就清楚了)
  43.     when 2 #当事件面朝下
  44.       @red_sprite.x = (ev.real_x - $game_map.display_x) / 8 - 32
  45.       @red_sprite.y = (ev.real_y - $game_map.display_y) / 8 + 32
  46.     when 4 #当事件面朝左
  47.       @red_sprite.x = (ev.real_x - $game_map.display_x) / 8 - 3 * 32
  48.       @red_sprite.y = (ev.real_y - $game_map.display_y) / 8 - 32
  49.     when 6 #当事件面朝右
  50.       @red_sprite.x = (ev.real_x - $game_map.display_x) / 8 + 32
  51.       @red_sprite.y = (ev.real_y - $game_map.display_y) / 8 - 32
  52.     when 8 #当事件面朝上
  53.       @red_sprite.x = (ev.real_x - $game_map.display_x) / 8 - 32
  54.       @red_sprite.y = (ev.real_y - $game_map.display_y) / 8 - 3 * 32
  55.     end
  56.     #由于RMVX的限制问题,在用精灵时,y坐标小于等于零将不显示图片,
  57.     #所以,当精灵的y坐标小于等于0时需进行缩放处理
  58.     if @red_sprite.y <= 0  #调整放大比例
  59.       @red_sprite.zoom_y = (96 + @red_sprite.y) / 96.0   #计算缩放比
  60.       @red_sprite.y = 1   #更换起始位置
  61.     else
  62.       @red_sprite.zoom_y = 1.0        #为防止前次调过缩放比,当坐标大于0时,恢复缩放比
  63.     end
  64.     return true
  65.   end
  66.   
  67.    #----------------------------------------------------------------------------
  68.    # ● 3×3碰撞判定(碰到为true,否则为false)
  69.    #----------------------------------------------------------------------------
  70.    def crash?
  71.      #$game_player.real_x,$game_player.real_y主角的真实坐标(相对于大地图,一个以256计)
  72.      x = ($game_player.real_x - $game_map.display_x) / 8   #计算主角的画面坐标(一格32计)
  73.      y = ($game_player.real_y - $game_map.display_y) / 8
  74.      x1 = @red_sprite.x - 16               #计算精灵范围的上下限(1为下限,2为上限)
  75.      y1 = @red_sprite.y - 16
  76.      x2 = @red_sprite.x + 80
  77.      y2 = @red_sprite.y + 96 * @red_sprite.zoom_y - 16
  78.     #判断主角是否在所划定的区域内
  79.      return x > x1 && x < x2 && y > y1 && y < y2
  80.   end
  81.   #这个部分其实也可以通过事件与主角的坐标差来判断,但由于涉及到方向,代码量要可观一些

  82.   #----------------------------------------------------------------------------
  83.   # ● 激活红框的使用(并补充事件id及初始位置)
  84.   #----------------------------------------------------------------------------
  85.   def activate(id,x,y)
  86.     @red_sprite.visible = true
  87.     @event_x = x
  88.     @event_y = y
  89.     @event_id = id
  90.   end

  91.   #----------------------------------------------------------------------------
  92.   # ● 关闭红框的使用(红框将不可见,坐标,id还原为0)
  93.   #----------------------------------------------------------------------------
  94.   def delete
  95.     @red_sprite.visible = false
  96.     @event_x = 0
  97.     @event_y = 0
  98.     @event_id = 0
  99.   end
  100. end
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1