2 Schleifen parallel ablaufen lassen

  • Hi,

    ich programmiere zur Zeit ein Spiel. Dabei soll die KI und der Spieler gleichzeitig oder unabhängig von dem Anderen schießen können.

    Wie hier im Bild sichtbar, soll der obere Panzer parallel zum Unteren (Spieler) schießen können.
    Meine Funktion um die Kugel zu bewegen, ist allerdings eine For-Schleife und da das Script wartet bis diese beendet wurde, können keine 2 Schüsse parallel stattfinden.

    Meine Idee war jetzt ein "Unterprogramm" - sprich neues Script (später dann exe) - die die andere For-Schleife beeinhaltet. Nur das wäre etwas "unschön", von daher meine Frage: Gibt es stattdessen auch noch eine andere Möglichkeit?

    [Blockierte Grafik: http://img8.imageshack.us/img8/4247/panzes2.jpg]

    Vielen Dank!
    lg Jautois

  • Hey sieht cool aus :D Entweder musst du eben beides in einer schleife schaffen (du kannst das ja quasi so machen, dass du immernoch in der gleichen For Schleife abfragst ob der zweite Panzer schießt wenn der erste schon geschossen hat).. oder du siehst dir TimerInit oder Adlib an..
    Einfacher helfen kann man aber, wenn du dein script postest!

  • Meine Idee war jetzt ein "Unterprogramm" - sprich neues Script (später dann exe) - die die andere For-Schleife beeinhaltet. Nur das wäre etwas "unschön", von daher meine Frage: Gibt es stattdessen auch noch eine andere Möglichkeit?

    Bei so vielen Schleifen ist es sicher die beste Lösung mit mehreren exen zu arbeiten. Wenn Du dir mal ein Spiele Ordner angeschaut hast wirst du merken, das da mehrere dlls verwendet weden. Ist vom Prinzip her genauso.

    Es gibt im Englischem Forum eine _Adlib UDF mit der Du mehrere Threads erzeugen kannst. Vielleicht ist das ja was für Dich.

  • warscheinlich hat er angst das wir den code klauen :rofl: :rofl: :rofl:

    .. oder er ist grade AFK.. und @prizma: bei nem kleinen AutoitSpiel muss man nich mit mehreren exen arbeiten, es gibt 100%-ig eine einfachere Lösung ;)

  • Hi,

    ... sorry ich war bis gerade eben weg.

    Zu:

    Zitat

    Einfacher helfen kann man aber, wenn du dein script postest!

    Kann ich machen, aber es ist Imoment noch ein reines Durcheinander und es sind noch teilweise "unsauber" programmierte Stelle drin. Wenn ihr mir dies verzeiht ;) Bitte

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet ("{SPACE}","_PlayerShoot")
    HotKeySet ("{LEFT}","_Left")
    HotKeySet ("{RIGHT}","_Right")
    HotKeySet ("r","_Reload")

    [/autoit] [autoit][/autoit] [autoit]

    Global $current_munition, $reload, $ki_shoot, $player_shoot, $current_p_pos, $game_status

    [/autoit] [autoit][/autoit] [autoit]

    $game_status = 1

    [/autoit] [autoit][/autoit] [autoit]

    $shoot_enable = 1
    $k_startpos_x = 197
    $k_startpos_y = 337
    $p_startpos_x = 200
    $p_startpos_y = 340
    $g_startpos_x = Random(100,260,1)

    [/autoit] [autoit][/autoit] [autoit]

    $k_pos_x = 197
    $k_pos_y = 337
    $p_pos_x = 200
    $p_pos_y = 340
    $g_pos_x = 59

    [/autoit] [autoit][/autoit] [autoit]

    $s = 0
    $move = 0

    [/autoit] [autoit][/autoit] [autoit]

    Dim $str[10]
    Dim $buergerstr_li[10]
    Dim $buergerstr_re[10]
    Dim $munition[1]
    Dim $leben[1]

    [/autoit] [autoit][/autoit] [autoit]

    $score = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;$window_char = GUICreate("Charakter", 401, 301, 832, 556)
    ;GUISetBkColor(0x000000)
    ;$Button1 = GUICtrlCreateButton("<", 168, 248, 25, 25, 0)
    ;$Button2 = GUICtrlCreateButton(">", 208, 248, 25, 25, 0)
    ;$auswahl_fahrzeug = GUICtrlCreatePic("images\panzer.gif",24,24,40,60)
    ;$auswahl_fahrzeug = GUICtrlCreatePic("images\fahrzeug.gif",64,24,40,60)

    [/autoit] [autoit][/autoit] [autoit]

    ;--- GameInfo
    ;MsgBox(1,"Game-Info",'"<-" Panzer fährt nach links' & @CRLF & '"->" Panzer fährt nach rechts' & @CRLF & @CRLF & '"Leertaste"-Schießen')

    [/autoit] [autoit][/autoit] [autoit]

    $window = GUICreate("Panzers", 600, 400, 709, 516)
    $hWnd = WinGetHandle("Panzers")
    GUISetBkColor(0x000000)
    ;--- Straße
    $str_y = 0
    For $i = 0 to 9 Step 1
    $str[$i] = GUICtrlCreatePic("images\straße.gif",100,$str_y,200,40)
    $str_y = $str_y + 40
    Next
    ;---
    ;--- Bürgersteiß links
    $str_y = 0
    For $i = 0 to 9 Step 1
    $buergerstr_li[$i] = GUICtrlCreatePic("images\bürgersteig3-l.gif",0,$str_y,100,40)
    $str_y = $str_y + 40
    Next
    ;---
    ;--- Bürgersteiß rechts
    $str_y = 0
    For $i = 0 to 9 Step 1
    $buergerstr_re[$i] = GUICtrlCreatePic("images\bürgersteig3-r.gif",300,$str_y,100,40)
    $str_y = $str_y + 40
    Next
    ;---
    $panzer = GUICtrlCreatePic("images\panzer.gif",$p_startpos_x,$p_startpos_y,40,60)
    ;--- Schrift
    $Label1 = GUICtrlCreateLabel("P-X: ", 536, 320, 57, 18)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label2 = GUICtrlCreateLabel("P-Y: ", 536, 336, 56, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label5 = GUICtrlCreateLabel("K-X: ", 536, 360, 57, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label6 = GUICtrlCreateLabel("K-Y: ", 536, 376, 54, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label7 = GUICtrlCreateLabel("ZR: ", 536, 300, 54, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label8 = GUICtrlCreateLabel("p-shoot: ", 536, 280, 54, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    $Label9 = GUICtrlCreateLabel("ki-shoot: ", 536, 260, 54, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    ;--- Punkte
    $Label6 = GUICtrlCreateLabel("Punkte: " & $score, 415, 40, 200 , 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    ;---
    ;--- Munition
    $m_pos = 459 ;48+
    $anzahl_munition = 10
    ReDim $munition[$anzahl_munition]
    $current_munition = $anzahl_munition
    $Label3 = GUICtrlCreateLabel("Munition: ", 415, 8, 49, 18)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    For $i = 0 to ($anzahl_munition-1) Step 1
    $m_pos = $m_pos + 10
    $munition[$i] = GUICtrlCreatePic("images\munition.gif",$m_pos,6,10,15)
    Next
    ;---
    ;--- Leben
    $l_pos = 459 ; 48+
    $anzahl_leben = 10
    ReDim $leben[$anzahl_leben]
    $current_leben = $anzahl_leben
    $Label4 = GUICtrlCreateLabel("Leben: ", 415, 24, 40, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetFont(-1, 8, 400, 0, "Arial")
    For $i = 0 to ($anzahl_leben-1) Step 1
    $l_pos = $l_pos + 10
    $leben[$i] = GUICtrlCreatePic("images\leben.gif",$l_pos,24,10,15)
    Next
    ;---

    [/autoit] [autoit][/autoit] [autoit]

    $gegner = GUICtrlCreatePic("images\panzer2.gif",$g_startpos_x,0,40,60)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW,$window)
    ;GUISetState(@SW_SHOW,$window_char)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $hPen = _GDIPlus_PenCreate ()
    _GDIPlus_PenSetColor($hPen, 0x84ff0000)
    _GDIPlus_PenSetWidth ($hPen, 2)
    _GDIPlus_GraphicsDrawLine ($hGraphic, 402, 0, 402, 402, $hPen)

    [/autoit] [autoit][/autoit] [autoit]

    AdlibEnable("_KIShoot",Random(100,2600,1))
    $zr = 10
    While 1
    $zr = $zr - 1
    GUICtrlSetData($Label7,"ZR: " & $zr)
    GUICtrlSetData($Label8,"p-shoot: " & $player_shoot)
    GUICtrlSetData($Label9,"ki-shoot: " & $ki_shoot)
    If $ki_shoot = 1 and $zr = 1 Then $ki_kugel = GUICtrlCreatePic("images\kugel-lila.gif",$g_startpos_x+19,$g_pos_x,4,4)
    If $player_shoot = 1 and $zr = 1 Then $player_kugel = GUICtrlCreatePic("images\kugel-lila.gif",$p_pos_x+17,$p_pos_y,4,4)
    If $zr = 0 Then
    If $player_shoot = 1 Then
    $current_p_pos = $p_pos_x
    For $i = 340 to 0 Step -0.07
    If $i <= 0.02 Then
    $current_munition = $current_munition - 1
    GUICtrlDelete( $player_kugel)
    GUICtrlDelete($munition[$current_munition])
    $shoot_enable = 1
    EndIf
    GUICtrlSetPos($player_kugel, ($current_p_pos + 17), $i )
    Next
    $player_shoot = 0
    EndIf
    If $ki_shoot = 1 Then
    GUICtrlSetPos( $ki_kugel, $g_startpos_x + 19,$g_pos_x + 10)
    $ki_shoot = 0
    EndIf
    EndIf
    If $zr = 0 Then
    $zr = 10
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _KIShoot()
    $ki_shoot = 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PlayerShoot()
    $player_shoot = 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Reload()
    $reload = 1
    $temp_muni = $current_munition
    $m_pos = 459 + ($current_munition*10)
    For $i = $temp_muni to ($anzahl_munition-1) Step 1
    $m_pos = $m_pos + 10
    $current_munition = $current_munition + 1
    $munition[$i] = GUICtrlCreatePic("images\munition.gif",$m_pos,6,10,15)
    Sleep(400)
    Next
    $reload = 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Left()
    If $p_pos_x <> 0 Then
    $p_pos_x = $p_pos_x - 2
    GUICtrlSetPos($panzer,$p_pos_x,340)
    GUICtrlSetData($Label1,"P-X: " & $p_pos_x)
    GUICtrlSetData($Label2,"P-Y: " & $p_pos_y)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Right()
    If $p_pos_x <> 360 Then
    $p_pos_x = $p_pos_x + 2
    GUICtrlSetPos($panzer,$p_pos_x,340)
    GUICtrlSetData($Label1,"P-X: " & $p_pos_x)
    GUICtrlSetData($Label2,"P-Y: " & $p_pos_y)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Die Bilder: Hier

    Zitat

    warscheinlich hat er angst das wir den code klauen

    Nein habe ich nicht, jeder der weiß wie sowas geht, kann so etwas ganz leicht programmieren. Meine Codes sind nicht wertvoll ;)

    lg Jautois

    Einmal editiert, zuletzt von Jautois (19. April 2009 um 16:27)

  • Joa ohne Bilder gestaltet sich das immer noch ein wenig schwer, aber ich würde das auch so machen:
    In die main loop schreiben ob irgend ein Panzer schießt, falls dem so ist, dann für beide Panzer mit _AdlibEnable (kannste im englishen Forum finden) die Geschosse steuern..

  • Okej danke euch allen erstmal, ich werde mir mal AdlibeEnable genauer anschauen. Danke Canon10 für den Link!

    PS.: Bilder kommen gleich..

  • Mach das ungefähr nach dem Schema:

    Spoiler anzeigen
    [autoit]

    HotKeySet ("{SPACE}","_Player1Shoot")
    HotKeySet ("{LCTRL}","_Player2Shoot")

    [/autoit] [autoit][/autoit] [autoit]

    Global $x1, $x2

    [/autoit] [autoit][/autoit] [autoit]

    Func _Player1Shoot()
    _AdlibEnable("Shoot1", 50);also jede 50 ms sollen sich die Kugeln bewegen
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Player2Shoot()
    _AdlibEnable("Shoot2", 50)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If $x1 = Blub Then _AdlibDisable("Shoot1")
    If $x2 = Blub Then _AdlibDisable("Shoot2")
    Wend

    Func Shoot1()
    $x1 = $x1 + Zahl; Pos deiner 1en Kugel
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Shoot2()
    $x2 = $x2 + Zahl; Pos deiner 2en Kugel
    EndFunc

    [/autoit]