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

Project1

 找回密码
 注册会员
搜索

警察抓小偷升级版脚本

查看数: 2589 | 评论数: 4 | 收藏 3
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-8-21 23:42

正文摘要:

本帖最后由 shanxiang1121 于 2016-8-22 15:38 编辑 刚刚接触VX脚本的新人一枚,由于一些原因,弄了一个类似于警察抓小偷的游戏的脚本,实现的功能大致为: 1.在目标事件前3*3的范围内贴图一张 2.当主角进入该范 ...

回复

shanxiang1121 发表于 2016-8-22 16:24:41
然后再单独说明一下脚本(虽然是写了注释的),主要还是分享一下意图和思路吧

  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
复制代码
shanxiang1121 发表于 2016-8-22 14:35:17
鑫晴 发表于 2016-8-22 14:15
哈哈,很不错呢!

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

这个我也考虑过,后面会再进行修改,这个只是一个比较基本的版本
鑫晴 发表于 2016-8-22 14:15:21
哈哈,很不错呢!

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


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

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

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

GMT+8, 2024-9-20 18:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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