按键精灵教程之俄罗斯方块.docx
- 文档编号:8278180
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:12
- 大小:91.31KB
按键精灵教程之俄罗斯方块.docx
《按键精灵教程之俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《按键精灵教程之俄罗斯方块.docx(12页珍藏版)》请在冰豆网上搜索。
按键精灵教程之俄罗斯方块
前言:
喵~你们相信按键精灵除了能做游戏辅助脚本外,还能做一个游戏玩玩吗?
这是真的吗?
小猫告诉你,是真的,编程是无所不能的,只要你敢想,就能实现!
!
!
游戏下载地址:
喵~用按键精灵做的<俄罗斯方块>游戏~[更新至1.11.0701]
技术:
1.多线程
2.窗口句柄
工具:
按键精灵8
361的窗口插件
mp9999ddd的多线程互斥锁插件
俄罗斯方块XX
感谢以上两位高人提供的插件喵。
游戏背景图片:
2011-8-422:
14上传
下载附件(527.4KB)
思路:
要写一个游戏,必须要对游戏有一定的了解,而不是简简单单的知道怎么玩。
现在小猫要写的是俄罗斯方块,那么小猫需要知道以下几个数据:
“游戏的边框长短,各个方块的具体形状,每次变形后的形状,得分的算法,游戏的规则。
”那怎么获得这些数据呢?
对,活用XX谷歌,具体内容看上面的俄罗斯方块百科,已经写的很清楚了,游戏是10x20大小的,方块有S、Z、L、J、I、O、T这7种形状,得分的大致算法。
OK,游戏的一些大致数据已经收集好了,现在要利用这些数据了。
小猫刚开始的时候,是想用91的写屏插件,通过清屏和写屏两种功能完成游戏的,后来才发现,这个思路的代码和算法太复杂,于是果断放弃,转为使用361的窗口插件,通过创建一个游戏背景区域和多个方块(按钮),然后使用移动窗口和关闭窗口实现方块的移动和消除,而判断方法则是采用判断上下左右句柄得到。
正文:
首先,我们要创建一个游戏区域,游戏原本是边框10x20,方块1x1的,我们将其放大30倍,即变为边框300x600,方块30x30,我们还要计算好游戏区域的左上角坐标,在这里,小猫电脑分辨率是1280x800的,小猫为了游戏区域在屏幕中间,故设置游戏区域的左上角坐标为489,99。
接着,大家注意找下361窗口插件中的“CreateCustomRgn创建不规则区域”功能,简单的说,这个就是放置一张图片大小的窗口,只不过他会将指定颜色挖空。
在这里,我们使用上面那张300x600的背景图片,创建这个游戏区域即可。
注意,停止脚本的时候,关闭这个窗口
1.setGameLeftUpX=489:
setGameLeftUpY=99
2.FKPath="Attachment:
\"
3.BGPath="Background.bmp"
4.MainHwnd=Plugin.WindowEx5_01.CreateCustomRgn(0,setGameLeftUpX,setGameLeftUpY,FKPath&BGPath,"FF00FF")
5.
6.SubOnScriptExit()
7. HwndArray=Plugin.WindowEx5_01.EnumWindowA(0,0,"361Du*Class3",2)
8. Fori=0ToUBound(HwndArray)
9. CallPlugin.WindowEx5_01.SetWindowState(HwndArray(i),0)
10. Next
11.EndSub
复制代码
第二,游戏区域创建好了,现在要创建方块了,大家看下361窗口插件中的“CreateButton创建按钮”功能,我们就用他来创建方块,并得到每个方块的句柄。
所有的形状都是由4个方块组成,那么我们可以通过一个带参数的子程序来完成创建工作,先从最简单的O形方块开始。
这个方块的形状是“田”字形的,即2X2,游戏刚开始的时候,这个方块应该是在游戏区域的正上方中间等待下降的。
故他的左上角坐标应该是609,39,根据一个方块为30x30大小,推出其他3个方块的坐标,创建4个方块窗口,并将这4个窗口句柄分别保存起来。
1.OO="609,39,639,39,609,69,639,69"
2.CallCreate(OO)
3.
4.SubCreate(FKZuoBiao)
5. TracePrint"创建方块"
6. CreateZB=Split(FKZuoBiao,",")
7. getFKHWnd1=getCreateFK(CreateZB(0),CreateZB
(1))
8. getFKHWnd2=getCreateFK(CreateZB
(2),CreateZB(3))
9. getFKHWnd3=getCreateFK(CreateZB(4),CreateZB(5))
10. getFKHWnd4=getCreateFK(CreateZB(6),CreateZB(7))
11.EndSub
复制代码
第三,现在游戏背景和O形方块都创建好了,我们先要让他自动落下,怎么弄呢?
很简单,每隔一段时间,获取四个方块窗口的当前坐标,然后依次向下移动一次,一次是移动30个像素,对吧?
OK,子程序代码如下:
1.
2.SubFKStatic()
3. getFKRect1=Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd1,2)
4. getFKRect2=Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd2,2)
5. getFKRect3=Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd3,2)
6. getFKRect4=Plugin.WindowEx5_01.GetWindowInfo(getFKHWnd4,2)
7.EndSub
8.
9.SubFallFK()
10. TracePrint"下落"
11. CallFKStatic()
12. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0),getFKRect1
(1)+30)
13. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0),getFKRect2
(1)+30)
14. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0),getFKRect3
(1)+30)
15. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0),getFKRect4
(1)+30)
16.EndSub
复制代码
第四,现在问题来了,我们发现方块不停的掉下去,不会停止在游戏区域内,怎么办?
这里,我们要用到这个功能--GetPointWindow获得包含了指定点的窗口句柄--它的作用就是得到指定坐标上的窗口句柄。
有什么用呢?
这样想,我们只要得到四个方块下一格的句柄,如果这个句柄不是方块的句柄也不是游戏背景区域的句柄(这里大家思考下,为什么还要加上不是方块的句柄这个条件),那么我们就可以判断出这个方块已经到达了最底部了。
1.
2.FunctionCheckFK()//检查方块的下一格句柄
3. CallFKStatic()
4. getCheckHwnd1=getPointHwnd(getFKRect1
(2)-15,getFKRect1(3)+15)
5. getCheckHwnd2=getPointHwnd(getFKRect2
(2)-15,getFKRect2(3)+15)
6. getCheckHwnd3=getPointHwnd(getFKRect3
(2)-15,getFKRect3(3)+15)
7. getCheckHwnd4=getPointHwnd(getFKRect4
(2)-15,getFKRect4(3)+15)
8. IfgetCheckHwnd1<>getFKHwnd1andgetCheckHwnd1<>getFKHwnd2andgetCheckHwnd1<>getFKHwnd3andgetCheckHwnd1<>getFKHwnd4andgetCheckHwnd1<>MainHwndThen
9. TracePrint1
10. CheckFK=false
11. ElseIfgetCheckHwnd2<>getFKHwnd1andgetCheckHwnd2<>getFKHwnd2andgetCheckHwnd2<>getFKHwnd3andgetCheckHwnd2<>getFKHwnd4andgetCheckHwnd2<>MainHwndThen
12. TracePrint2
13. CheckFK=false
14. ElseIfgetCheckHwnd3<>getFKHwnd1andgetCheckHwnd3<>getFKHwnd2andgetCheckHwnd3<>getFKHwnd3andgetCheckHwnd3<>getFKHwnd4andgetCheckHwnd3<>MainHwndThen
15. TracePrint3
16. CheckFK=false
17. ElseIfgetCheckHwnd4<>getFKHwnd1andgetCheckHwnd4<>getFKHwnd2andgetCheckHwnd4<>getFKHwnd3andgetCheckHwnd4<>getFKHwnd4andgetCheckHwnd4<>MainHwndThen
18. TracePrint4
19. CheckFK=false
20. Else
21. CheckFK=true
22. EndIf
23.EndFunction
复制代码
第五,下落问题解决了,这次我们要对方块进行左右移动,既要让方块保持下落,又要让方块左右移动,怎么办?
这里就需要用到多线程了,另外,由于每个形状是由4个方块组成的,则就意味着,每次移动都要移动4个方块,问题来了,如果下落的同时,又左移了,会不会造成混乱呢?
比如方块错位之类的。
这里有一个知识点,多线程互斥锁,打个比方,有两个线程,一个线程对变量a进行自增1运算,一个线程对同一个变量a进行自减1运算,那么a的值变化如何?
肯定是很混乱的,一会儿加,一会儿减的,这个时候,如果我想让他自增1运算10次后,再自减1,怎么办呢?
造成混乱的原因就是,两个线程抢着用变量a,如果当一个线程在使用a的时候,另外一个线程无法使用a,那么这问题不就解决了?
这就是线程互斥锁。
刚开始的时候,小猫是用环境变量来实现的,后来发现按键精灵的多线程不怎么稳定,哪怕使用了环境变量,还是容易造成方块混乱,于是这里就要用到了mp9999ddd的多线程互斥锁插件这个插件。
1.SubMoveFK()//移动方块
2. Do
3. MoveKey=0
4. IfSpeedUp=0orSpeedUp=1Then
5. TracePrint"SpeedUp "&SpeedUp
6. MoveKey=WaitKey()
7. CallPlugin.jcqm.jMutexLock(Lock)
8. TracePrint"移动"
9. SelectCaseMoveKey
10. Case37
11. getCheckFK=CheckFK()
12. IfgetCheckFKThen
13. CallMoveLeft()
14. EndIf
15. Case39
16. getCheckFK=CheckFK()
17. IfgetCheckFKThen
18. CallMoveRight()
19. EndIf
20. Case38
21. CallChange()
22. EndSelect
23. CallPlugin.jcqm.jMutexUnLock(Lock)
24. Delay50
25. EndIf
26. Loop
27.EndSub
28.
29.SubMoveLeft()//左移
30. CallFKStatic()
31. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0)-30,getFKRect1
(1))
32. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0)-30,getFKRect2
(1))
33. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0)-30,getFKRect3
(1))
34. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0)-30,getFKRect4
(1))
35.EndSub
36.
37.SubMoveRight()右移
38. CallFKStatic()
39. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0)+30,getFKRect1
(1))
40. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0)+30,getFKRect2
(1))
41. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0)+30,getFKRect3
(1))
42. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0)+30,getFKRect4
(1))
43.EndSub
44.
45.SubMoveDown()//下降
46. CallFKStatic()
47. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd1,getFKRect1(0),getFKRect1
(1)+30)
48. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd2,getFKRect2(0),getFKRect2
(1)+30)
49. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd3,getFKRect3(0),getFKRect3
(1)+30)
50. CallPlugin.WindowEx5_01.MoveWindow(getFKHWnd4,getFKRect4(0),getFKRect4
(1)+30)
51.EndSub
复制代码
第六,现在我们已经把下降和左右移动写好了,现在要写消除代码了,思路很简单,判断一行是不是都为方块,如果是,则消除,并且上面的方块集体下移。
如何判断呢?
我们通过抓抓获取的句柄可知,方块窗口的类是“361DuButtonClass3”,我们可以通过同一行的窗口的类是不是都为这个,如果是,则消除这一行,并且上面的方块都掉下来,注意一点,这个只要判断当前落下方块的范围下是否一行都是方块即可,顺便把得分算法也写了。
1.
2.SubClearFKLine()
3. TracePrint"消除"
4. CallFKStatic()
5. ScoreExp=-1
6. MinToMaxArr=Array(getFKRect1
(1),getFKRect2
(1),getFKRect3
(1),getFKRect4
(1))
7. MinToMax=lib.算法.结构数组排序(MinToMaxArr,0)
8. FKMinToMaxY=数组去重(split(MinToMax,""))
9. ForCheckFKLineJ=0ToUBound(FKMinToMaxY)
10. IfCheckFKLine(FKMinToMaxY(CheckFKLineJ))Then
11. ForUnCreateI=1To10
12. CallUnCreate(CheckFKLineHwndArr(UnCreateI))
13. Next
14. CallClearDown(FKMinToMaxY(CheckFKLineJ))
15. ScoreExp=ScoreExp+1
16. ClearRow=ClearRow+1
17. EndIf
18. Next
19. LEv*l=Int(ClearRow/20)+1
20. IfScoreExp>-1 Then
21. getScore=(2^ScoreExp)*10*LEv*l
22. Score=Score+getScore
23. EndIf
24.EndSub
25.
26.FunctionCheckFKLine(CheckFKLineY)
27. ForCheckFKLineI=1To10
28. CheckFKLineHwndArr(CheckFkLineI)=getPointHwnd(489+30*CheckFKLineI-15,CheckFKLineY+15)
29. CheckFKClass=Plugin.WindowEx5_01.GetWindowInfo(CheckFKLineHwndArr(CheckFkLineI),1)
30. IfCheckFKClass="361DuButtonClass3"Then
31. CheckFKLine=True
32. Else
33. CheckFKLine=false
34. ExitFor
35. EndIf
36. Next
37.EndFunction
38.
39.SubClearDown(ClearDownY)
40. ClearDownNum=(ClearDownY-99)/30
41. TracePrintClearDownNum
42. IfClearDownNum>0Then
43. ForClearDownI=1ToClearDownNum
44. ClearStop=0
45. ForClearDownJ=1To10
46. ClearDownHwnd=getPointHwnd(489+30*ClearDownJ-15,ClearDownY-30*ClearDownI+15)
47. ClearDownClass=Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd,1)
48. IfClearDownClass="361DuButtonClass3"Then
49. getCDRect=Plugin.WindowEx5_01.GetWindowInfo(ClearDownHwnd,2)
50. CallPlugin.WindowEx5_01.MoveWindow(ClearDownHwnd,getCDRect(0),getCDRect
(1)+30)
51. ElseIfClearStop=10Then
52. ExitSub
53. ElseIfClearDownHwnd=MainHwndThen
54. ClearStop=ClearStop+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 按键精灵 教程 俄罗斯方块