原文和更多项目链接:https://autohotkey.com/boards/viewtopic.php?f=6&t=7348
项目打包下载地址:
蓝奏云:https://wwp.lanzouj.com/iJfub1xom8nc 提取码:ahk6
1233网盘:https://www.123pan.com/s/ufi3Td-w0O53.html 提取码:ahk6
代码片段:
; Script Information =========================================================== ; Name: Project 2D ; Description: Example of a tile-based game engine using AutoHotkey ; AHK Version: AHK_L 1.1.25.01 (Unicode 32-bit) - March 5, 2017 ; OS Version: Windows 2000+ ; Language: English - United States (en-US) ; Author: Weston Campbell <westoncampbell@gmail.com> ; Website: https://autohotkey.com/boards/viewtopic.php?f=6&t=7348 ; ============================================================================== ; Revision History ============================================================= ; Revision 2 (March 13, 2017) ; * Complete rewrite ; ------------------------------------------------------------------------------ ; Revision 1 (June 08, 2016) ; * Initial Release ; ============================================================================== ; Auto-Execute ================================================================= #SingleInstance, Force ; Allow only one running instance of script #Persistent ; Keep the script permanently running until terminated #NoEnv ; Avoid checking empty variables for environment variables #Warn ; Enable warnings to assist with detecting common errors #NoTrayIcon ; Disable the tray icon of the script SendMode, Input ; The method for sending keystrokes and mouse clicks SetWorkingDir, %A_ScriptDir% ; Set the working directory of the script SetBatchLines, -1 ; The speed at which the lines of the script are executed SetWinDelay, -1 ; The delay to occur after modifying a window SetControlDelay, -1 ; The delay to occur after modifying a control OnExit("OnUnload") ; Run a subroutine or function when exiting the script return ; End automatic execution ; ============================================================================== ; Labels ======================================================================= ;GuiEscape: GuiClose: ExitSub: ExitApp ; Terminate the script unconditionally return ; ============================================================================== ; Functions ==================================================================== OnLoad() { Global ; Assume-global mode Static Init := OnLoad() ; Call function OnMessage(0x0100, "WM_KEYDOWN") } OnUnload(ExitReason, ExitCode) { Global ; Assume-global mode } WM_KEYDOWN(wParam, lParam, Msg, Hwnd) { Global ; Assume-global mode Static VK_UP := 26, VK_LEFT := 25, VK_DOWN := 28, VK_RIGHT := 27, VK_KEY_W := 57, VK_KEY_A := 41, VK_KEY_S := 53, VK_KEY_D := 44, VK_F1 := 70, VK_RETURN := "D", VK_ESCAPE := "1B" If (lParam & 0x40000000) { return ; Disable auto-repeat } VK := Format("{:x}", wParam) If (VK = VK_UP) || (VK = VK_KEY_W) { Hero.Move(0, -1, true) } If (VK = VK_LEFT) || (VK = VK_KEY_A) { Hero.Move(-1, 0, true) } If (VK = VK_DOWN) || (VK = VK_KEY_S) { Hero.Move(0, 1, true) } If (VK = VK_RIGHT) || (VK = VK_KEY_D) { Hero.Move(1, 0, true) } If (VK = VK_RETURN) { GridAction("VK_RETURN") } If (VK = VK_F1) { GuiControlGet, DebugVisible, Visible, Debug GuiControl, % (!DebugVisible ? "Show" : "Hide"), Debug } If (VK = VK_ESCAPE) { GoSub, ExitSub } } GuiCreate() { Global ; Assume-global mode Static Init := GuiCreate() ; Call function Menu, Tray, Icon, resources\images\icon.ico Gui, +LastFound -Resize +HWNDhProject2D Gui, Color, 000000 Gui, Margin, 10, 10 Gui, Add, Edit, x0 y0 w0 h0 0x800 ; Focus Gui, Add, Picture, x0 y0 w640 h640 vStage Gui, Add, Picture, x0 y0 w32 h32 vHero BackgroundTrans Gui, Add, Text, x10 y10 w620 r3 cFFFFFF vDebug BackgroundTrans Gui, Show, w640 h640, Project 2D Stage := new Stage("Stage") Stage.Color("000000") Stage.Background("bg_title.png") Stage.Map("map_0000.map") Hero := new Player("Hero") Hero.Move(-1, -1, false) } GridAction(Action := "") { Global ; Assume-global mode If (GridType = 1) { Hero.Move(PX, PY, false) return } If (Map = "map_0000.map") { If (Action = "VK_RETURN") { Stage.Background("bg_0001.png") Stage.Map("map_0001.map") Hero.Move(9, 11, false) return } } If (Map = "map_0001.map") { If (GridType = 2) { ; Go to next map Stage.Background("bg_0002.png") Stage.Map("map_0002.map") Hero.Move(PX, 19, false) return } } If (Map = "map_0002.map") { If (GridType = 2) { ; Go to previous map Stage.Background("bg_0001.png") Stage.Map("map_0001.map") Hero.Move(PX, 0, false) return } If (GridType = 3) { ; Go to next map Stage.Background("bg_0003.png") Stage.Map("map_0003.map") Hero.Move(PX, 19, false) return } } If (Map = "map_0003.map") { If (GridType = 2) { ; Go to previous map Stage.Background("bg_0002.png") Stage.Map("map_0002.map") Hero.Move(PX, 0, false) return } If (GridType = 3) { ; Fell in hole Hero.Move(10, 19, false) return } If (GridType = 4) { ; Go to next map Stage.Background("bg_0004.png") Stage.Map("map_0004.map") Hero.Move(16, 15, false) return } } If (Map = "map_0004.map") { If (GridType = 2) { ; Go to previous map Stage.Background("bg_0003.png") Stage.Map("map_0003.map") Hero.Move(8, 10, false) return } If (GridType = 3) { ; AutoHotkey "A" icon Stage.Background("bg_0004_2.png") Stage.Map("map_0004_2.map") return } } If (Map = "map_0004_2.map") { If (GridType = 2) { ; Go to next map Stage.Background("bg_0005.png") Stage.Map("map_0005.map") Hero.Move(19, PY, false) return } } If (Map = "map_0005.map") { If (GridType = 2) { ; Go to previous map Stage.Background("bg_0004_2.png") Stage.Map("map_0004_2.map") Hero.Move(0, PY, false) return } If (GridType = 3) { ; Key item Stage.Background("bg_0005_2.png") Stage.Map("map_0005_2.map") return } } If (Map = "map_0005_2.map") { If (GridType = 2) { ; AutoHotkey "H" icon Stage.Background("bg_0005_3.png") Stage.Map("map_0005_3.map") return } } If (Map = "map_0005_3.map") { If (GridType = 2) { ; Go to next map Stage.Background("bg_0006.png") Stage.Map("map_0006.map") Hero.Move(PX, 0, false) return } } If (Map = "map_0006.map") { If (GridType = 2) { ; Go to previous map Stage.Background("bg_0005_3.png") Stage.Map("map_0005_3.map") Hero.Move(PX, 19, false) return } If (GridType = 3) { ; Key item Stage.Background("bg_0006_2.png") Stage.Map("map_0006_2.map") return } } If (Map = "map_0006_2.map") { If (GridType = 2) { ; AutoHotkey "K" icon Stage.Background("bg_0006_3.png") Stage.Map("map_0006_3.map") return } } If (Map = "map_0006_3.map") { If (GridType = 2) { ; Go to next map Stage.Background("bg_0007.png") Stage.Map("map_0007.map") Hero.Move(9, 13, false) return } } If (Map = "map_0007.map") { If (GridType = 2) { ; AutoHotkey icon Stage.Background("bg_0008.png") Stage.Map("map_0008.map") Hero.Move(-1, -1, false) return } } } Class Stage { __New(Hwnd) { this.Stage := Hwnd } Background(File) { Global ; Assume-global mode GuiControl,, % this.Stage, % "resources\images\" (Background := File) } Color(Hex) { Gui, Color, % Hex } Map(File) { Global ; Assume-global mode GridMap := [] FileRead, MapData, % "resources\maps\" (Map := File) For Each, Line In StrSplit(MapData, "`n", "`r") { GridMap.Push(StrSplit(Line)) } } } Class Player { __New(Hwnd) { this.Player := Hwnd } Visible(Show := true) { GuiControl, % (Show ? "Show" : "Hide"), % this.Player } Image(File) { GuiControl,, % this.Player, % "resources\images\" File } Move(X, Y, Relative := 0) { Global ; Assume-global mode GuiControlGet, Player, Pos, % this.Player PX := (PlayerX // 32), PY := (PlayerY // 32) X := (Relative ? PX + X : X), Y := (Relative ? PY + Y : Y) GridType := GridMap[Y + 2, X + 2] GuiControl,, Debug, %X%, %Y%`n%Background%`n%Map% ; Debug info If (Y < PY) { this.Image("player_up.png") } If (X < PX) { this.Image("player_left.png") } If (Y > PY) { this.Image("player_down.png") } If (X > PX) { this.Image("player_right.png") } GuiControl, Move, % this.Player, % " x" X * 32 " y" Y * 32 GridAction("Move") } } ; ==============================================================================
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)