咸鱼虾扯蛋

    最近又玩起了flash 小游戏,但是打不过怎么办啊? 做为一个屌丝级别的极品,额!打不过很丢人的!肿么办?

    所以洒家,制作了kula 一键发招, 按键脚本,觉着好用!哈哈哈哈!(用到了多线程和时钟哦,菜鸡写的好辛苦)

    1、操作流程

     kula的发招 主要是 {{下右, 下左, 右左, 下左右} | {下左, 下右, 左右, 下右左}} * {轻|重拳, 轻|重脚}。方向键和拳脚之间的按键时间间隔要求非常短,不然就会发不出招。所以只好将拳,脚的J,K键写入宏里面。

     下右J,下左K,这个设置是给摇杆玩的啊,对于摇杆来说一个 {下右}的操作能够连贯的完成。但是对于键盘侠来说,我们需要按两个键啊,想要玩的好左手就得鬼畜,右手就得配合啊。操作流程如下图所示:

KulaUML_flowKulaUML_flow

    2、第一版代码

     于是写下了第一版的代码(附源码)。1、画了一个界面,界面上放了几个按键宏,每个按键宏执行一个招式(如:大招 下左右重拳 或者 下右左重拳,取决于角色的面向,可以简写为 下前后重拳),2、使用Hotkey触发界面上按键Click代码块。3、使用BeginThread设置一个时钟,在一定时间内禁止重复按键触发。4、使用timer修改界面按钮样式,在界面上显示按钮被按下的过程。如下图所示:

KulaUML_problem_formKulaUML_problem_form

     3、第一版遇到的问题

     角色面向问题:我一个大招需要使用两个按键,一个是在左边发大招 下右左 宏,另一个是在右边发大招 下左右 宏,这个也太不方便了,我手动也只是按三个键,有没有自动判断面向一键大招啊。于是本咸鱼第二天继续工作,一定要解决这个问题。还自称中级咸鱼呢,不能丢了自家门面Facade不是?我找到了FindPic、FindSharp、FindColor几个方法在windows窗口找kula,找到左边的kula就代表了kula当前面向为向左。如下图所示:

KulaUML_problem_findpicKulaUML_problem_findpic

1、首先我想到,把flash里的游戏素材提取出来,提取后发现一个站立状态有6~7张图,用尾巴想一想都知道去界面上找图6~7次会行不通

2、其次我想到的是抓形状,但是抓形状也很难标记准确,需要计算位置,弄了半天也没有成功。

3、然后我想到了找颜色。我发现kula的红眼睛比较好辨认,我就想在眼睛上取5个点做为特征值。据不完全统计,头发会遮住眼睛啊,站立有三种眼睛,后退有5种以上的眼睛,前进有6种眼睛,而且每次抓取颜色还有些许颜色偏差,很难在到眼睛上一个固定不变的色块。

4、在找眼睛特征时的时候我对着图片╰(‵□′)╯时,突然眼睛一亮,对,这双鞋,这双鞋上没有长飘来飘去的头发,而且基本上是平移。我把鞋子图片放大了之后得到了12张特征图——站立左、站立右、前进左(单脚着地)、前进左(双脚着地)、后退左1、后退左2、后退左3.....

4、第二版遇到的问题

     慢!屏幕区域找图很慢,我按下了一键大招过了1秒才发动,早被打成猪头了。如下图所示:

KulaUML_perform_findpicKulaUML_perform_findpic

     最后是整理状态,减少抓图次数。

     5、优化算法

     1、旧版本的算法与角色待命状态迁移图:

KulaUML_perform_stateoldKulaUML_perform_stateold

     2、但是我们的算法可以优化,用户按键A、S、D是可以作为算法输入提前获取的,为什么要写到算法里面成为一个复杂的组合状态呢?用户ASD做为算法输入,简化算法后的角色待命状态迁移图:

Kula_UML_perform_statenew
KulaUML_perform_statenew

6、问题:

     我以前编码也遇到过要做状态机的情况,那么 如上图  KulaUML_perform_statenew 上下两张图都可以表示为kula角色待机状态的 状态图,那么我们,依据算法流程来设计一个系统的状态迁移图?我们给了6个最终状态不同的划分(partitions)。第一次我们划分为6份,我们需要进行1次抓图匹配12张特征图——站立左、站立右....,也就是12次抓图,来确认角色面向。第二次我们依据按键状态分3份{A键按键状态,无方向键按下/S键按下,D键按下}通过对状态的有效划分,我们只抓图一次匹配1张图——站立左{无方向键按下/S键按下}、前进左{D键按下}、前进右{A键按键状态},就完成了角色发招前待命状态的判断!!!

防沉迷第一版代码如下:

Event Form1.Load
var_i = 15
 Form1.Hotkey1.Register True
 Form1.Hotkey2.Register True
 Form1.Hotkey3.Register True
 Form1.Hotkey4.Register True
 Form1.Hotkey5.Register True
 Form1.Hotkey6.Register True
 Form1.Hotkey7.Register True
 Form1.Hotkey8.Register True
 Form1.Hotkey9.Register True
 Form1.Hotkey10.Register True

End Event

// 键盘按键1
Event Form1.Hotkey1.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button1.Click 
		start(200)
	End If	
End Event
Event Form1.Button1.Click

KeyPress "S", 1
KeyDown "D", 1
Delay var_i
KeyPress "K", 1
Delay var_i
KeyUp "D", 1
EndScript

End Event


// 键盘按键2
Event Form1.Hotkey2.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button2.Click 
		start(200)
	End If
End Event
Event Form1.Button2.Click

KeyDown "S", 1
Delay var_i
KeyPress "D", 1
Delay var_i
KeyPress "A", 1
Delay var_i
KeyUp "S", 1
KeyPress "J", 1
Delay var_i
KeyDown "S", 1
Delay var_i
KeyPress "A", 1
Delay var_i
KeyPress "D", 1
Delay var_i
KeyPress "J", 1
Delay var_i
KeyUp "S", 1
EndScript

End Event

// 键盘按键3
Event Form1.Hotkey3.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button3.Click 
		start(200)
	End If
End Event
Event Form1.Button3.Click

KeyPress "S", 1
Delay var_i
KeyDown "A", 1
Delay var_i
KeyPress "K", 1
Delay var_i
KeyUp "A", 1
EndScript

End Event

// 键盘按键Q
Event Form1.Hotkey4.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button4.Click 
		start(200)
	End If
End Event
Event Form1.Button4.Click

KeyDown "S", 1
Delay var_i
KeyPress "J", 1
Delay var_i
KeyUp "S", 1
EndScript

End Event

// 键盘按键E
Event Form1.Hotkey5.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button5.Click 
		start(200)
	End If
End Event
Event Form1.Button5.Click

KeyDown "W", 1
Delay 300
KeyPress "I", 1
Delay var_i
KeyUp "W", 1
EndScript

End Event

// 键盘按键R
Event Form1.Hotkey6.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button6.Click 
		start(200)
	End If
End Event
Event Form1.Button6.Click

KeyPress "U", 1
Delay 300
KeyPress "K", 1
EndScript

End Event

// 键盘按键F
Event Form1.Hotkey7.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button7.Click 
		start(200)
	End If
End Event
Event Form1.Button7.Click

KeyDown "J", 1
Delay 1
KeyDown "K", 1
Delay var_i
KeyUp "J", 1
KeyUp "K", 1
EndScript

End Event

// 键盘按键V
Event Form1.Hotkey8.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button8.Click 
		start(200)
	End If
End Event
Event Form1.Button8.Click

KeyDown "S", 1
Delay var_i
KeyDown "I", 1
Delay var_i
KeyUp "I", 1
Delay var_i
KeyUp "S", 1
EndScript

End Event

// 键盘按键N
Event Form1.Hotkey9.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button9.Click 
		start(200)
	End If
End Event
Event Form1.Button9.Click

KeyPress "S", 1
Delay var_i
KeyUp "A",1
KeyDown "A", 1
Delay 25
KeyPress "J", 1
Delay var_i
KeyUp "A", 1
EndScript 

End Event

// 键盘按键M
Event Form1.Hotkey10.Hotkey
	If var_clock = 0 or var_clock > 20 Then 
		Form1.Button10.Click 
		start(200)
	End If
End Event
Event Form1.Button10.Click

KeyPress "S", 1
Delay var_i
KeyUp "D",1
KeyDown "D", 1
Delay 25
KeyPress "J", 1
Delay var_i
KeyUp "D", 1
EndScript
 
End Event

// 修改按键延迟
Event Form1.Slider1.Slide
    //当滑块位置被鼠标拖动时触发的事件
    var_i = Form1.Slider1.Value
End Event

// 使用时钟避免重复执行同一事件
Dimenv ID
Global var_clock	// 出发按键后1s内,长按不重复触发
Global var_flag		// 当前招式施展时间
var_clock = 0
var_flag = 0

Sub start(n)
	var_flag = n
	var_clock = 1
	ID = BeginThread(clock)
End Sub

Sub clock
	Delay var_flag
	var_clock = var_clock + 20
	//TracePrint var_clock
	
End Sub

    我教你洛,你把按键打开,然后和其他童鞋PK,哈哈。尽情的虐他吧!!!!啊吸吧!!!

猜你喜欢

转载自blog.csdn.net/u012296499/article/details/81056755
今日推荐