Kleines Game (problem)

  • hi,
    ich hab heute gesehn das ein freund von mir sich ein kleines rpg schreibt. jetzt wollt ich das auch
    machen und bin auf folgendes problem gestoßen: die collision...
    ich hab mir gedacht das ich in die Walk funktionen ein if reinpack sodass es man sich nur bewegen
    kann wärend man inerhalb der grünen labels ist... hätte zufällig jemand ne funktion mitder man abfragen
    kann ob eine control inerhalb einer anderen liegt ? oder noch besser ob ein punkt innerhalb einer control liegt
    ich weiß grade überhaupt nicht wie ich da ansätzen soll...


    Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{w}","_WalkUp")
    HotKeySet("{a}","_WalkLeft")
    HotKeySet("{d}","_WalkRight")
    HotKeySet("{s}","_WalkDown")

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Game.Test", 625, 443, 192, 124)
    $Label1 = GUICtrlCreateLabel("", 72, 56, 356, 297)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Player = GUICtrlCreateLabel("", 100, 320, 12, 20)
    GUICtrlSetBkColor(-1, 0x000000)
    $Label2 = GUICtrlCreateLabel("", 424, 56, 140, 113)
    GUICtrlSetBkColor(-1, 0x00FF00)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _WalkUp()
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0],$pos[1] - 2)
    EndFunc
    Func _WalkDown()
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0],$pos[1] + 2)
    EndFunc
    Func _WalkLeft()
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0] - 2,$pos[1])
    EndFunc
    Func _WalkRight()
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0] + 2,$pos[1])
    EndFunc

    [/autoit]
  • Vielleicht hilft dir der Ansatz (auf die Mausposition bezogen - lässt sich aber auch auf andere Controls umschreiben)

    Spoiler anzeigen
    [autoit]

    $gui=GUICreate("TESTGUI",400,400)
    $x=100
    $y=100
    $w=50
    $h=100
    $Graphic=GUICtrlCreateGraphic($x,$y,$w,$h)
    $Label = GUICtrlCreateLabel("",4,4,100,21)
    GUICtrlSetColor($Graphic,0xFF0000)
    GUISetState()
    While 1
    If GUIGetMsg() = -3 Then Exit
    $Cursor = GUIGetCursorInfo()
    If $Cursor[0] > $x And $Cursor[0] < $x+$w And $Cursor[1] > $y And $Cursor[1] < $y+$h Then
    If GUICtrlRead($Label) <> "Innerhalb" Then
    GUICtrlSetData($Label,"Innerhalb")
    EndIf
    Else
    If GUICtrlRead($Label) <> "Außerhalb" Then
    GUICtrlSetData($Label,"Außerhalb")
    EndIf
    EndIf
    Sleep(10)
    WEnd

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • leider hilft mir das nicht wirklich weiter da GUIGetCursorInfo() ja genau das wäre was mir fehlt ... trotzdem danke

  • ich hab jetzt mal so versucht aber ich glaub da ist irgend wo ein denkfehler drin weil es nicht wirklich funzt

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{w}","_WalkUp")
    HotKeySet("{a}","_WalkLeft")
    HotKeySet("{d}","_WalkRight")
    HotKeySet("{s}","_WalkDown")

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Game.Test", 625, 443, 192, 124)
    $Label1 = GUICtrlCreateLabel("", 72, 56, 356, 297)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Label2 = GUICtrlCreateLabel("", 424, 56, 140, 113)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Player = GUICtrlCreateLabel("", 100, 320, 12, 20)
    GUICtrlSetBkColor(-1, 0x000000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _CheckPosIn($__control)
    $HelpPos = ControlGetPos("","",$__control)
    $PlayerPos = ControlGetPos("","",$Player)
    $i = 0
    $x = 0
    While $i <> $HelpPos[3]
    While $x <> $HelpPos[2]
    $x = $x + 1
    If $i = $PlayerPos[1] And $x = $PlayerPos[0] Then
    Return 1
    ExitLoop
    EndIf
    WEnd
    $i = $i + 1
    $x = 0
    WEnd
    Return 0
    EndFunc

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

    Func _WalkUp()
    If _CheckPosIn($Label1) = 0 And _CheckPosIn($Label2) = 0 Then
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0],$pos[1] - 2)
    EndIf
    EndFunc
    Func _WalkDown()
    If _CheckPosIn($Label1) = 0 And _CheckPosIn($Label2) = 0 Then
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0],$pos[1] + 2)
    EndIf
    EndFunc
    Func _WalkLeft()
    If _CheckPosIn($Label1) = 0 And _CheckPosIn($Label2) = 0 Then
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0] - 2,$pos[1])
    EndIf
    EndFunc
    Func _WalkRight()
    If _CheckPosIn($Label1) = 0 And _CheckPosIn($Label2) = 0 Then
    $pos = ControlGetPos("","",$Player)
    GUICtrlSetPos($Player,$pos[0] + 2,$pos[1])
    EndIf
    EndFunc

    [/autoit]
  • wenn du es so machen willst, geht das hier etwas schneller:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{w}","_WalkUp")
    HotKeySet("{a}","_WalkLeft")
    HotKeySet("{d}","_WalkRight")
    HotKeySet("{s}","_WalkDown")

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Game.Test", 625, 443, 192, 124)
    $Label1 = GUICtrlCreateLabel("", 72, 56, 356, 297)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Label2 = GUICtrlCreateLabel("", 424, 56, 140, 113)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Player = GUICtrlCreateLabel("", 100, 320, 12, 20)
    GUICtrlSetBkColor(-1, 0x000000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _WalkUp()
    $pos = ControlGetPos("","",$Player)
    If $pos[1] <> 0 Then
    GUICtrlSetPos($Player,$pos[0],$pos[1] - 2)
    EndIf
    EndFunc

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

    Func _WalkDown()
    $pos = ControlGetPos("","",$Player)
    If $pos[1] <> 422 Then
    GUICtrlSetPos($Player,$pos[0],$pos[1] + 2)
    EndIf
    EndFunc

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

    Func _WalkLeft()
    $pos = ControlGetPos("","",$Player)
    If $pos[0] <> 0 Then
    GUICtrlSetPos($Player,$pos[0] - 2,$pos[1])
    EndIf
    EndFunc

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

    Func _WalkRight()
    $pos = ControlGetPos("","",$Player)
    If $pos[0] <> 612 Then
    GUICtrlSetPos($Player,$pos[0] + 2,$pos[1])
    EndIf
    EndFunc

    [/autoit]

    die funktion _CheckPosIn lädt zu lange, deshalb laggt das ganze sich in den tod und nimmt den cpu mit

    Mfg. PCKing


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • das problem ist nur das es extrem aufwendig wird wenn man viele maps hat ...
    deswegen hät ich gern eine funktion der man einfach nur die control übergibt

    EDIT: mit GDI+ hab ich mich leider noch nicht beschäftigt

    Einmal editiert, zuletzt von M☻x (16. März 2010 um 22:09)

  • :whistling:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GDIPlus.au3>

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

    Global $iX1 = 100
    Global $iY1 = 320
    Global $Speed = 2

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

    $hWnd = GUICreate("Game", 625, 443)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(625, 443, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;~ _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic)

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

    $Brush_Green = _GDIPlus_BrushCreateSolid(0xFF00FF00)

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

    AdlibRegister("_Redraw", 20)

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

    HotKeySet("{LEFT}", "_WalkLeft")
    HotKeySet("{RIGHT}", "_WalkRight")
    HotKeySet("{UP}", "_WalkUp")
    HotKeySet("{DOWN}", "_WalkDown")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BrushDispose($Brush_Green)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func _Redraw()
    _GDIPlus_GraphicsClear($hBuffer, 0xFFF0F0F0)
    _GDIPlus_GraphicsFillRect($hBuffer, 72, 56, 356, 297, $Brush_Green)
    _GDIPlus_GraphicsFillRect($hBuffer, 424, 56, 140, 113, $Brush_Green)
    _GDIPlus_GraphicsFillRect($hBuffer, $iX1, $iY1, 12, 20)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 625, 443)
    EndFunc

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

    Func _WalkLeft()
    $iX1 -= $Speed
    EndFunc

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

    Func _WalkRight()
    $iX1 += $Speed
    EndFunc

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

    Func _WalkUp()
    $iY1 -= $Speed
    EndFunc

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

    Func _WalkDown()
    $iY1 += $Speed
    EndFunc

    [/autoit]

    Edit: Mit Colloisions:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    Global $iX1 = 100
    Global $iY1 = 320
    Global $Speed = 2

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

    Global $MinX = 72
    Global $MaxX = 72 + 356 - 12
    Global $MinY = 56
    Global $MaxY = 56 + 297 - 20

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

    $hWnd = GUICreate("Game", 625, 443)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(625, 443, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;~ _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic)

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

    $Brush_Green = _GDIPlus_BrushCreateSolid(0xFF00FF00)

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

    AdlibRegister("_Redraw", 35)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndSwitch
    If _IsPressed("25", $dll) Then _WalkLeft()
    If _IsPressed("26", $dll) Then _WalkUp()
    If _IsPressed("27", $dll) Then _WalkRight()
    If _IsPressed("28", $dll) Then _WalkDown()
    WEnd

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

    Func _Redraw()
    If $iX1 > 72 + 356 - 12 Then
    $MaxY = 56 + 113 - 20
    Else
    $MaxY = 56 + 297 - 20
    EndIf
    If $iY1 < 56 + 113 - 20 Then
    $MaxX = 72 + 356 + 140 - 12
    Else
    $MaxX = 72 + 356 - 12
    EndIf
    _GDIPlus_GraphicsClear($hBuffer, 0xFFF0F0F0)
    _GDIPlus_GraphicsFillRect($hBuffer, 72, 56, 356, 297, $Brush_Green)
    _GDIPlus_GraphicsFillRect($hBuffer, 424, 56, 140, 113, $Brush_Green)
    _GDIPlus_GraphicsFillRect($hBuffer, $iX1, $iY1, 12, 20)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 625, 443)
    EndFunc

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

    Func _WalkLeft()
    If $iX1 > $MinX Then $iX1 -= $Speed
    EndFunc

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

    Func _WalkRight()
    If $iX1 < $MaxX Then $iX1 += $Speed
    EndFunc

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

    Func _WalkUp()
    If $iY1 > $MinY Then $iY1 -= $Speed
    EndFunc

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

    Func _WalkDown()
    If $iY1 < $MaxY Then $iY1 += $Speed
    EndFunc

    [/autoit]
  • ich glaub mit GDI+ werd ich mich in nächter zeit mal beschäfitgen

    Einmal editiert, zuletzt von M☻x (17. März 2010 um 12:44)