Project1
标题:
水蓝的脚本教程之RTS(Real-Time Strategy)的基本实现 chapterⅠ
[打印本页]
作者:
dbshy
时间:
2010-8-16 12:13
标题:
水蓝的脚本教程之RTS(Real-Time Strategy)的基本实现 chapterⅠ
爱生活,爱画画,爱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的时候用鼠标在地图画一个 矩形选择框 来 框选兵
然后继续进行编队 寻路 攻击等操作 如果是农民用选择框选择之后则可以修建筑之类的,当然也可以直接点击某个兵的身上选择
不过那样就太简单了,直接判断坐标即可
具体见下图
RTS.JPG
(50.11 KB, 下载次数: 16)
下载附件
保存到相册
2010-8-16 12:10 上传
首先要明确的是操作中用 鼠标 选取 兵 的过程
点击某个地方 -> 按住鼠标左键不动 -> 拖出一个矩形框 -> 松开鼠标左键
可以这样写
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代码,加了注释
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中的刷新部分
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我
作者:
八云紫
时间:
2010-8-16 12:24
怀疑 XP 这个效率做 RTS 是不是有点勉强了?
作者:
越前リョーマ
时间:
2010-8-16 21:12
纯粹来打酱油,星际争霸那样的游戏么?
作者:
柳之一
时间:
2010-8-16 22:21
星际争霸的确勉强200人口滴
做魔兽吧,人口少了不少,一个兵种占2,3,5,7,兵少,好操作
作者:
dbshy
时间:
2010-8-16 22:50
呃,回LS的各位大神
200人口的话确实有点勉强,50左右的人口还是可以的
另外用站上的A*做寻路还是基本无压力的
这只是个教程,重点在于鼠标脚本和其他的一些应用....
游戏的话,AI太麻烦太难写了
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1