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

Project1

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

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

[复制链接]

Lv1.梦旅人

辉瑞中国首席研究员<

梦石
0
星屑
50
在线时间
142 小时
注册时间
2008-1-18
帖子
2129
跳转到指定楼层
1
发表于 2010-8-16 12:13:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
爱生活,爱画画,爱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

  2.      取得鼠标坐标

  3.      #如果坐标在地图上
  4.      if 可以框选的地点 then
  5.        传坐标给window画出矩形框
  6.      end
  7.    end
  8.    
  9.    if !Input.press?(Input::C) then

  10.      矩形框消失
  11.   
  12.    end
复制代码
以上部分是写在场景中的刷新 即在scene_map 的 update 中

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

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

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

  下面是具体window_rect代码,加了注释
  1. class Window_Rect < Window_Base
  2.   
  3.   attr_accessor  :move
  4.   attr_accessor  :show
  5.   
  6.   def initialize
  7.    
  8.     super(0,0,640,480)
  9.     self.contents = Bitmap.new(width - 32, height - 32)
  10.     #这是啥意思,你们懂的
  11.     self.opacity = 0
  12.     self.z = 200
  13.     setup_xz_rect
  14.     @move = true
  15.     @show = false
  16.     #分别对应对角线的两个点
  17.     @start_x = 0
  18.     @start_y = 0
  19.     @last_x = 5
  20.     @last_y = 65535
  21.    
  22.    
  23.   end
  24.   
  25.   def setup_xz_rect
  26.    
  27.     #用4个rect来画四条边   
  28.     @ho = Rect.new(0,0,640,1)
  29.     @ht = Rect.new(0,0,640,1)
  30.     @so = Rect.new(0,0,1,480)
  31.     @st = Rect.new(0,0,1,480)
  32.    
  33.   end
  34.   
  35.   def trans_position(x,y)
  36.    
  37.      if self.move then
  38.       
  39.        @start_x = x
  40.        @start_y = y
  41.        @temp_x = x
  42.        @temp_y =y
  43.      else
  44.        @temp_x = x
  45.        @temp_y = y
  46.      end
  47.   end
  48.   
  49.   def judge_position?
  50.     return false if @temp_x == nil or @temp_y == nil
  51.     if @temp_x != @last_x or @temp_y != @last_y then
  52.       @last_x = @temp_x
  53.       @last_y = @temp_y
  54.       return true
  55.     end
  56.     return false
  57.   end
  58.   
  59.   def update_xz_rect
  60.   
  61.     if self.move then
  62.       
  63.       @ho.set(@start_x,@start_y,1,1)
  64.       @ht.set(@start_x,@start_y,1,1)
  65.       @so.set(@start_x,@start_y,1,1)
  66.       @st.set(@start_x,@start_y,1,1)
  67.       self.move = false
  68.     else
  69.    
  70.       @ho.set(@start_x,@start_y,@last_x - @start_x,1)
  71.       @ht.set(@start_x,@last_y,@last_x - @start_x,1)
  72.       @so.set(@start_x,@start_y,1,@last_y - @start_y)
  73.       @st.set(@last_x,@start_y,1,@last_y - @start_y)
  74.     end
  75.   end
  76.   
  77.   def appear_rect
  78.     self.contents.clear
  79.     self.contents.fill_rect(@ho,Color.new(0,255,0))
  80.     self.contents.fill_rect(@ht,Color.new(0,255,0))
  81.     self.contents.fill_rect(@so,Color.new(0,255,0))
  82.     self.contents.fill_rect(@st,Color.new(0,255,0))
  83.   end
  84.   
  85.   def update
  86.     super
  87.     #如果位置变动即鼠标在进行拖动
  88.     if judge_position? and self.show then
  89.       即时刷新4个rect
  90.       update_xz_rect
  91.       appear_rect
  92.     end
  93.   end
  94.   
  95.   def conceal_rect
  96.     self.contents.clear
  97.   end

  98.   
  99. end   
复制代码
中间定义了两个变量:show为true的时候显示rect move为true的时候就是鼠标正在移动中,这时传坐标到last_x last_y  
  请看trans_position  

  下面是scene_map中的刷新部分
  1. class Scene_Map
  2.    alias old_main main
  3.     def main
  4.       @window_rect = Window_Rect.new
  5.       old_main
  6.   end
  7.   
  8.   
  9.   alias old_update update
  10.   def update
  11.     old_update
  12.    
  13.     @window_rect.update
  14.     if Input.press?(Input::C) then
  15.       @window_rect.show = true
  16.       mouse_x,mouse_y = Mouse.get_mouse_pos
  17.       if in_area? then
  18.        if @window_rect.show then
  19.         @window_rect.trans_position(mouse_x,mouse_y)
  20.       end
  21.      end
  22.     end
  23.     if !Input.press?(Input::C) then
  24.       @window_rect.show = false
  25.       @window_rect.move = true
  26.       @window_rect.conceal_rect
  27.     end
  28.    
  29.    
  30.   end
  31.   
  32.   
  33. end   
复制代码
这一讲大概就这多了 - -bb
  另外我贴出来的脚本中window_rect有错误,具体是描绘部分,大家找找看,就当是作业

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

评分

参与人数 1星屑 +700 收起 理由
后知后觉 + 700 脚本教程.鼓励III

查看全部评分

来6r就是等某位仁兄的巨坑

褴褛着身行无端,囊中羞涩空心酸。
平生几无得意事,倒塔泡面宅寝室。
惟羡隔壁高帅富,雨露春风月夜声。
青丝无处觅其踪,只有硬盘苍井空。
莫云男儿空悲愁,鸿鹄岂不天际游。
坐断天下执鹿首,千百金帛万兜鍪。
夜深忽梦某年月,再见女神欲语迟。
吊丝终有逆袭日,木耳再无回粉时。

Lv2.观梦者

神隐的主犯

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

贵宾

2
发表于 2010-8-16 12:24:46 | 只看该作者
怀疑 XP 这个效率做 RTS 是不是有点勉强了?

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

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3263
在线时间
3616 小时
注册时间
2006-9-6
帖子
37399

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2010-8-16 21:12:03 | 只看该作者
纯粹来打酱油,星际争霸那样的游戏么?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1624
在线时间
1609 小时
注册时间
2007-8-28
帖子
3253

第3届短篇游戏大赛主流游戏组冠军第1届Title华丽大赛新人奖

4
发表于 2010-8-16 22:21:01 | 只看该作者
星际争霸的确勉强200人口滴

做魔兽吧,人口少了不少,一个兵种占2,3,5,7,兵少,好操作
“我推荐你一个游戏吧,avg的,剧情特感人”
“我擦,都是文字图片的游戏有啥好玩的,连个战斗都没有!”
“我推荐你一个游戏吧,rpg的,战斗也新颖”
“我擦,怎么米有作i弊器?“
”你不是喜欢战斗么?”
“不,我是剧情党!!”

继续阅读请点击
http://rpg.blue/blog-53316-10027.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

辉瑞中国首席研究员<

梦石
0
星屑
50
在线时间
142 小时
注册时间
2008-1-18
帖子
2129
5
 楼主| 发表于 2010-8-16 22:50:29 | 只看该作者
呃,回LS的各位大神
200人口的话确实有点勉强,50左右的人口还是可以的
另外用站上的A*做寻路还是基本无压力的
这只是个教程,重点在于鼠标脚本和其他的一些应用....
游戏的话,AI太麻烦太难写了
来6r就是等某位仁兄的巨坑

褴褛着身行无端,囊中羞涩空心酸。
平生几无得意事,倒塔泡面宅寝室。
惟羡隔壁高帅富,雨露春风月夜声。
青丝无处觅其踪,只有硬盘苍井空。
莫云男儿空悲愁,鸿鹄岂不天际游。
坐断天下执鹿首,千百金帛万兜鍪。
夜深忽梦某年月,再见女神欲语迟。
吊丝终有逆袭日,木耳再无回粉时。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-15 05:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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