Qousio Posted May 4, 2009 Posted May 4, 2009 (edited) Hello everyone! I'm not really experienced with autoit, and I don't know why I decided to make a game in autoit, but after I thought about it I couldnt get it out of my head. So, I spent like 10 minutes on this code, and it seems I have problems First, the code: CODE#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Misc.au3> #include <Timers.au3> Global $Enemy[9], $ScoreNow, $BulletPosX, $BulletPosY Global $EnemyPosX[5] Global $EnemyPosY[5] Opt("GUIoneventmode", 1) Opt("mousecoordmode", 2) $dll = DllOpen("user32.dll") HotKeySet("{esc}", "Esc") $GUI = GUICreate('Game', 700, 340, -1, -1, -2138570616) $Player = GUICtrlCreateRadio("", 0, 0, 15, 15) $Score = GUICtrlCreateLabel("Score: ", 300, 0, 100, 15) For $I = 1 To 4 $Enemy[$I] = GUICtrlCreateButton("What?", -30, -15, 40, 15) Next GUISetCursor(16, 1) GUISetState(@SW_SHOW) $Time_Go = _Timer_Init() While 1 GUICtrlSetState($Player, $GUI_CHECKED) Sleep(15) $Follow = MouseGetPos() GUICtrlSetPos($Player, $Follow[0], $Follow[1]) If _IsPressed("01", $dll) And _Timer_Diff($Time_Go) > 200 Then Shoot() $Time_Go = _Timer_Init() EndIf $Random = Random(1, 90, 1) If $Random = 90 Then Enemy() EndIf WEnd Func Shoot() $Shoot = GUICtrlCreateLabel("<=-", $Follow[0], $Follow[1], 15, 15) For $I = 0 To 70 Sleep(1) $BulletPosX = $Follow[0] - $I * 10 $BulletPosY = $Follow[1] GUICtrlSetPos($Shoot, $BulletPosX, $BulletPosY, 15, 15) If $BulletPosX > $EnemyPosX[1] And $BulletPosX < $EnemyPosX[1] + 40 And $BulletPosY > $EnemyPosY[1] And $BulletPosY < $EnemyPosY[1] + 15 Then $ScoreNow += $ScoreNow + 1 GUICtrlSetData($Score, "Score: " & $ScoreNow) EndIf Next EndFunc ;==>Shoot Func Enemy() For $I = 1 To 4 $EnemyPosX[$I] = Random(0, 650, 1) $EnemyPosY[$I] = Random(0, 340, 1) GUICtrlSetPos($Enemy[$I], $EnemyPosX[$I], $EnemyPosY[$I]) GUICtrlSetBkColor($Enemy[1], 0xff0000) Next EndFunc ;==>Enemy Func Esc() Exit 0 EndFunc ;==>Esc You can just copypaste that into autoit, compile and see whats going on to understand my questions better xD Basically you control a GuiCtrlCreateRadio thing, shoot labels "<=-" and your goal is to hit the red "What?" box. #1 $ScoreNow += $ScoreNow+ 1 and GUICtrlSetData($Score, "Score: " & $ScoreNow) are supposed to increase your score. For some reason it increases exponentially, it should be like 15 points for each correct shot, but it gives 15,250,1000,4000 etc. Howcome? #2 When you shoot, the game freezes because its calculating the shot movement: For $I = 0 To 70 Sleep(1) $BulletPosX = $Follow[0] - $I * 10 How do you make autoit calculate the shot movement without freezing the whole game? #3 Is it possible to change the whole GUI into a semi-transparant picture? Like a GIF with transparant background or jpg with opacity. #4 Is there some kind of range macro in autoit? e.g. @Range(1,100) would mean any number from 1 to 100. I know you can use For $Var = 1 to 100, but thats not exactly what I'm looking for. I need something like: If $Var1=@Range(1,100) Then....;If $Var is any number from 1 to 100 then... Thanks in advance! I hope my questions will be answered Edited May 4, 2009 by Qousio
Marlo Posted May 4, 2009 Posted May 4, 2009 (edited) #1 Your using the Incremental operater "+=" which will add whatever ever value is right of the operater to the variable on the left. Your problem is that your telling Autoit to increment the variable by 1+its current value. So just "$ScoreNow += 15" should work OK. #2 The player node stops moving when you shoot because AutoIt is incapable of doing two loops at once. If i were you id make a function that moves the player node by itself then use it with the AdlibEnable() function. #3 i think theres an example of someone doing this with Png images. Try doing a quick search for it #4 If $Var <= 100 And $var >= 1 Then ;Var is witin number range endif hope i helped. *EDIT* Fixed the error in the number range bit Edited May 4, 2009 by Marlo Click here for the best AutoIt help possible.Currently Working on: Autoit RAT
Qousio Posted May 4, 2009 Author Posted May 4, 2009 #1 Your using the Incremental operater "+=" which will add whatever ever value is right of the operater to the variable on the left. Your problem is that your telling Autoit to increment the variable by 1+its current value. So just "$ScoreNow += 15" should work OK.#2 The player node stops moving when you shoot because AutoIt is incapable of doing two loops at once. If i were you id make a function that moves the player node by itself then use it with the AdlibEnable() function.#3i think theres an example of someone doing this with Png images. Try doing a quick search for it #4If $Var <= 100 And >= 1 Then ;Var is witin number rangeendifhope i helped.Thanks for your answers! I will search the .png example and some adlib examples right now and see what I can do with them
Zinthose Posted May 4, 2009 Posted May 4, 2009 (edited) #1 Wow, did a Forum database upgrade cause this funky code corruption? ;$ScoreNow += $ScoreNow + 1 $ScoreNow += 15oÝ÷ Ûf(»¥èêçyçm¢ÊeÛazèqë,{h¶ÞiÛª®¢Ún¨º¸Zº.´ojwvËn}ú®¢×+y«^h:½éí±û§rØ¨Úæ¤¢ëh~Ø^jwç$jw¯z{j¹ë¢z-²"^ºÇ¶)Æ¥¶Ú-®( z¶¬µêbØ^jx¦jب·¦¢÷æ§fÚÚ'+!£ ®¢Øb¶«¨¶êºfË*ºZêí²H§u©bæÚ¶Ù^²©¢Ø^®gl!ƧßÛkyÆ¥«m+-g·N«yªÞr§¶W¬±ìZ^²í+"Ø^~îÇhj«¢rKj·!jwr¢ì"WâÖ{âÚgÚÚÊZéÜÉ©Ý2>á«¢+Øí%ÀÌØíYÈÄõI¹ İÄÀÀ¤Q¡¸¸¸¸¸í%ÀÌØíYȥ̹ä¹ÕµÈɽ´ÄѼÄÀÀÑ¡¸¸¸¸)M±Ð(% ÍÄQ¼ÄÀÀ($$ì!¥Ð(% ͱÍ($$ì5¥ÍÌ)¹M± Edited January 26, 2010 by Zinthose --- TTFN
Qousio Posted May 4, 2009 Author Posted May 4, 2009 I fixed pretty much everything I wanted to fix... Except calculating the shot movement I tried using AdLib but it just doesnt work as intended ...use a timer callback to trigger a step in the animation.Thanks for the reply Zinthose!But how would I do this?
Zinthose Posted May 4, 2009 Posted May 4, 2009 (edited) I fixed pretty much everything I wanted to fix... Except calculating the shot movement I tried using AdLib but it just doesnt work as intended Thanks for the reply Zinthose! But how would I do this? I threw this together, it's not very clean but works and is kinda cool. expandcollapse popup#include 'timers.au3' #include 'GUIConstantsEx.au3' #include 'WindowsConstants.au3' #include 'array.au3' #include 'debug.au3' ;_DebugSetup(@ScriptName) Global $Bullets[1] = [0] Opt("GUIOnEventMode", 1) Opt("MouseCoordMode", 2) $hGUI = GUICreate("Timers Using CallBack Function(s)", 400, 320, -1, -1, BitOR($WS_POPUP,$WS_CLIPSIBLINGS), 0) GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_ShootLeft", $hGUI) GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_ShootRight", $hGUI) GUISetState(@SW_SHOW) Global $Timer = _Timer_SetTimer($hGUI, 20, "_AnimationCycle") Func _AnimationCycle($hWnd, $Msg, $iIDTimer, $dwTime) Local $i, $pos, $direction, $speed, $handle, $deleted[1] = [0] ;## Animate Bullets For $i = 1 To $Bullets[0] If $Bullets[$i] = -1 Then ContinueLoop $handle = GUICtrlGetHandle($Bullets[$i]) $pos = WinGetPos($handle) $direction = GUICtrlRead($Bullets[$i]) If $direction = "<==" Then $speed = -5 Else $speed = 5 EndIf $winPos = WinGetPos($hGUI) $pos[0] = $pos[0] - $winPos[0] $pos[1] = $pos[1] - $winPos[1] If $pos[0] < 0 Or $pos[0] > $winPos[2] Then GUICtrlDelete($Bullets[$i]) $Bullets[$i] = -1 _ArrayAdd($deleted, $i) ContinueLoop EndIf GUICtrlSetPos($Bullets[$i], $pos[0] + $speed, $pos[1]) $pos = WinGetPos($handle) _DebugOut("$pos[0] = " & $pos[0]) _DebugOut("$pos[1] = " & $pos[1]) Next ;## Clean up removed bullets For $i = 1 To $deleted[0] _ArrayDelete($Bullets, $i) Next EndFunc Sleep(30000) _Timer_KillAllTimers($hGUI) Func _ShootLeft() Local $pos, $newBullet $pos = MouseGetPos() ;## Create Bullet $newBullet = GUICtrlCreateLabel("<==", $pos[0], $pos[1], 15, 15) ;## Add Bullet to the Active Bullents Array _ArrayAdd($Bullets, $newBullet) $Bullets[0] += 1 EndFunc Func _ShootRight() Local $pos, $newBullet $pos = MouseGetPos() ;## Create Bullet $newBullet = GUICtrlCreateLabel("==>", $pos[0], $pos[1], 15, 15) ;## Add Bullet to the Active Bullents Array _ArrayAdd($Bullets, $newBullet) $Bullets[0] += 1 EndFunc EDIT: Added a garbage collector to clean up all the empty bullet shells Edited May 4, 2009 by Zinthose --- TTFN
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now