扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 159|回复: 0

[转载发布] 水蓝的脚本教程之RTS(Real-Time Strategy)的基本实现 chapterⅠ

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2338

    主题

    403

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10627
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13396

    灌水之王

    发表于 2024-4-19 18:06:32 | 显示全部楼层 |阅读模式
    爱生活,爱画画,爱ruby
    素质RM,不做SSD,净化提问区环境,从我做起


    首先,看不懂F1的同学和高手可以退散了
    看不懂F1的同学请看这水蓝的脚本教程之不是教程的教程——送给想学脚本的同学

    讲RTS(Real-Time Strategy)之前讲一下鼠标这个东东,因为要用到
    其实本教程最主要的目的是鼠标脚本的应用
    在下另一篇鼠标应用教程水蓝的脚本教程之井字棋的脚本实现

    实现鼠标的原理都差不多,都是应用API
    GetCursorPos用来实现鼠标位置的查找,当然,先必须找到对应的活动窗口的句柄
    才能实现以上操作,这个教程不是讲API的,这里涉及的API不深,有兴趣的可以去看

    关于API,如果没兴趣和没精力的同学可以不深究,因为初级的API还很好懂
    深究下去会让人很蛋疼,本人曾经在图书馆借了本关于API的书,完全看不懂,
    去问学计算机的同学,她一脸鄙视的望着我,说没基础,讲了还是不懂 - -##

    大概知道每个API的作用就可以了,对理解脚本还是有帮助的


    现在讲一下鼠标脚本实现和应用最核心的东西
    那就是Input模块和判断鼠标的位置

    响应图片,还是响应菜单,响应窗口,不管是响应什么,先必须获得的是鼠标的位置

    获得鼠标位置以后,就是判断是否响应,其实都是很简单的,就是判断坐标的范围

    具体的代码可以去看 鼠标响应图片 和 鼠标系统的 Window_Selectable Arrow_Enemy 中的刷新 update 部分
    我想能看懂F1的同学是毫无压力的
       

    现在开始讲RTS功能实现吧(终于没跑题了 - -)

    先从实现最简单的功能开始,这一讲实现的是鼠标选择框的功能,比如玩WAR3 SC的时候用鼠标在地图画一个 矩形选择框 来 框选兵
    然后继续进行编队 寻路 攻击等操作 如果是农民用选择框选择之后则可以修建筑之类的,当然也可以直接点击某个兵的身上选择
    不过那样就太简单了,直接判断坐标即可

    具体见下图



    首先要明确的是操作中用 鼠标 选取 兵 的过程
    点击某个地方 -> 按住鼠标左键不动 -> 拖出一个矩形框 -> 松开鼠标左键

    可以这样写
    1. if Input.press?(Input::C) then     取得鼠标坐标     #如果坐标在地图上      if 可以框选的地点 then       传坐标给window画出矩形框     end   end      if !Input.press?(Input::C) then     矩形框消失     end复制代码
    复制代码
    以上部分是写在场景中的刷新 即在scene_map 的 update 中

      当然具体在RTS游戏中涉及到很多因素,判断会很多,比如松开左键后,显示选中单位的血条,然后控制面板的刷新
      这个教程只是实现基本效果

      所以等下我给出的具体代码会删掉一些判断,这些东西以后的教程会逐渐讲到   
             
      说了场景部分后,现在就是说怎么显示这个矩形框,大概的思路是新建一个Window_Rect 用来显示矩形框

      所谓矩形框就是4条边,知道两个对角的坐标即可画出,即在update中根据鼠标当前的坐标不断刷新画出矩形框

      下面是具体window_rect代码,加了注释
    1. class Window_Rect < Window_Base    attr_accessor  :move  attr_accessor  :show    def initialize        super(0,0,640,480)    self.contents = Bitmap.new(width - 32, height - 32)    #这是啥意思,你们懂的    self.opacity = 0    self.z = 200    setup_xz_rect    @move = true    @show = false    #分别对应对角线的两个点    @start_x = 0    @start_y = 0    @last_x = 5    @last_y = 65535          end    def setup_xz_rect        #用4个rect来画四条边       @ho = Rect.new(0,0,640,1)    @ht = Rect.new(0,0,640,1)    @so = Rect.new(0,0,1,480)    @st = Rect.new(0,0,1,480)      end    def trans_position(x,y)         if self.move then             @start_x = x       @start_y = y       @temp_x = x       @temp_y =y     else       @temp_x = x       @temp_y = y     end  end    def judge_position?    return false if @temp_x == nil or @temp_y == nil    if @temp_x != @last_x or @temp_y != @last_y then      @last_x = @temp_x      @last_y = @temp_y      return true    end    return false  end    def update_xz_rect      if self.move then            @ho.set(@start_x,@start_y,1,1)      @ht.set(@start_x,@start_y,1,1)      @so.set(@start_x,@start_y,1,1)      @st.set(@start_x,@start_y,1,1)      self.move = false    else          @ho.set(@start_x,@start_y,@last_x - @start_x,1)      @ht.set(@start_x,@last_y,@last_x - @start_x,1)      @so.set(@start_x,@start_y,1,@last_y - @start_y)      @st.set(@last_x,@start_y,1,@last_y - @start_y)    end  end    def appear_rect    self.contents.clear    self.contents.fill_rect(@ho,Color.new(0,255,0))    self.contents.fill_rect(@ht,Color.new(0,255,0))    self.contents.fill_rect(@so,Color.new(0,255,0))    self.contents.fill_rect(@st,Color.new(0,255,0))  end    def update    super     #如果位置变动即鼠标在进行拖动     if judge_position? and self.show then      即时刷新4个rect      update_xz_rect      appear_rect    end  end    def conceal_rect    self.contents.clear  end   end    复制代码
    复制代码
    中间定义了两个变量:show为true的时候显示rect move为true的时候就是鼠标正在移动中,这时传坐标到last_x last_y  
      请看trans_position  

      下面是scene_map中的刷新部分
    1. class Scene_Map   alias old_main main    def main      @window_rect = Window_Rect.new      old_main  end      alias old_update update  def update    old_update        @window_rect.update     if Input.press?(Input::C) then      @window_rect.show = true      mouse_x,mouse_y = Mouse.get_mouse_pos      if in_area? then       if @window_rect.show then        @window_rect.trans_position(mouse_x,mouse_y)      end     end    end    if !Input.press?(Input::C) then      @window_rect.show = false      @window_rect.move = true      @window_rect.conceal_rect    end          end    end    复制代码
    复制代码
    这一讲大概就这多了 - -bb
      另外我贴出来的脚本中window_rect有错误,具体是描绘部分,大家找找看,就当是作业

      下一讲的内容是建筑的建造 和 兵的生产,龟速更新中,敬请期待......
       另外求星际素材,[email protected]  当然最新的种子和rep也来者不拒,你们懂的
      最后全部VIP求3535果照,PM我

                 本帖来自P1论坛作者dbshy,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=153331  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-15 00:48 , Processed in 0.109957 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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