Range um Variable

  • Hey,

    wie mache ich eine "Range" um eine Variable? Also es soll folgenden Sinn haben:

    Spoiler anzeigen
    [autoit]

    If $coord1X To $coord1X + 20 Or $coord1X To $coord1X - 20 = $coord2X To $coord2X + 20 Or $coord2X To $coord2X - 20
    Then...

    [/autoit]

    Also 2 Zahlenmengen kleiner und größer als der Wert in der Variable (das oben genannte Beispiel funktioniert nicht, Fehler bei To).

    Edit: Von Ealendil gelöst:

    Funktionierendes Script
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")
    _GDIPlus_Startup()

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\figur.png")
    Global $balloonX = 50
    Global $balloonY = 50
    Global $figurX = 200
    Global $figurY = 467
    Global $figurWidth = 60
    Global $figurHeight = 100
    Global $Check

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon", $iWidth, $iHeight, Default, Default)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic)

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

    ; While-Schleife ============================================================================
    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackbuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 5)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    if not $Check Then _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, $balloonY)
    $balloonY += 7
    If $balloonY > $iHeight Then $balloonY = -75
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $figur, $figurX, $figurY)
    If _IsPressed("25") And $figurX >= 5 Then $figurX -= 10
    If _IsPressed("27") And $figurX + 79 <= 495 Then $figurX += 3
    if _IsBetween($balloonY+49, $figurY + 20, $figurY + 30) And _IsBetween($balloonX, $figurX, $figurX + 20) Then $Check = 1
    _WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    ToolTip($balloonY & " " & $balloonX & @CRLF & $figurY & " " & $figurX)
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    EndFunc ;==>_WM_PAINT

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_ImageDispose($figur); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

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

    Func _IsBetween($A, $Min, $Max)
    Return $A >= $Min And $A <= $Max
    EndFunc ;==>_IsBetween

    [/autoit]

    Viele Grüße,
    HopFail

    Einmal editiert, zuletzt von HopFail (28. Mai 2010 um 22:38) aus folgendem Grund: Problem von Ealendil gelöst

  • Danke, aber das klappt nicht :(. Kannst du dir vielleicht das ganze Script anschauen? (Zeile 63)

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Exit")
    _GDIPlus_Startup()

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

    ; Variablen ============================================================================

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

    Global $iWidth = 500, $iHeight = 600
    Global $iX = 0, $iY = 0
    Global $hBackground = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\background.png")
    Global $balloon_red = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_red.png")
    Global $balloon_green = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_green.png")
    Global $balloon_blue = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_blue.png")
    Global $balloon_yellow = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_yellow.png")
    Global $balloon_pink = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\balloon_pink.png")
    Global $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\graphics\figur.png")
    Global $balloonX = 50
    Global $balloonY = 50
    Global $figurX = 200
    Global $figurY = 467
    Global $figurWidth = 60
    Global $figurHeight = 100

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

    ; GUI ============================================================================

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

    $hGUI = GUICreate("TrapTheBalloon",$iWidth,$iHeight,Default,Default)
    $hWnd = WinGetHandle("TrapTheBalloon")
    GUISetState()
    GUISetOnEvent(-3, "_Exit")

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

    ; GDI+ ============================================================================

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    ;Erstmal das normale Grafik-Objekt erstellen.
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    ;Statt uns mit dem normalen Frontbuffer zufrieden zu geben, erstellen wir erstmal eine
    ;Bitmap, mit Bezug auf unser Grafikobjekt.
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;Nachdem unser Bitmap erstellt ist, holen wir uns den Graphics Context. Dieser
    ;wird von uns verwendet, um darin zu zeichnen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 2)
    _GDIPlus_GraphicsClear($hGraphic)

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

    ; While-Schleife ============================================================================
    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

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

    While 1

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

    _GDIPlus_GraphicsClear($hBackBuffer)
    ; Superradierer benutzen um alten Backbuffer zu löschen
    _GDIPlus_GraphicsSetSmoothingMode($hBackBuffer, 5)
    _GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hBackground, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $balloon_red, 50, $balloonY)
    $balloonY += 4
    If $balloonY > $iHeight Then $balloonY = -75
    _GDIPlus_GraphicsDrawImage($hBackbuffer, $figur, $figurX, $figurY)
    If _IsPressed("25") And $figurX >= 5 Then $figurX -= 4
    If _IsPressed("27") And $figurX + 79 <= 495 Then $figurX += 3
    If $balloonY = $figurY And $balloonX >= 20 Or $balloonX <= 20 = $figurX Then _GDIPlus_ImageDispose($balloon_red)
    _WinAPI_RedrawWindow($hWnd, 0, 0,$RDW_INTERNALPAINT)
    ; WM_PAINT wird nur aufgerufen, wenn alle Berechnungen fertig sind!
    ; In WM_PAINT wird selbst nichts berechnet, oder gezeichnet. diese Funktion wird nur das
    ; Bitmap-Objekt in das Grafik-Objekt übertragen.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    ; _GDIPlus_GraphicsDrawImageRect() überträgt den Backbuffer in den Frontbuffer.
    ; Der erste Parameter ist unser Frontbuffer (Grafik Objekt).
    ; Der zweite ist unsere Bitmap, welche ja als BackBuffer fungiert.
    ; Darauf folgt der Abschnitt den man übertragen will.
    ; i.d.R. ist es 0, 0 für X und Y koordinaten, und die GUI Breite und Höhe für
    ; Width und Height. Kommt natürlich immer drauf an, wie groß euer Grafikobjekt ist,
    ; und ob ihr den vollen Teil zeichnen wollt.
    WEnd

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

    ; Funktionen ============================================================================

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

    Func _WM_PAINT()
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $iX, $iY, $iWidth, $iHeight)
    EndFunc

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

    Func _Exit() ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic) ; Grafikobjekt auflösen
    _GDIPlus_BitmapDispose($hBitmap); Bitmap auflösen
    _GDIPlus_ImageDispose($balloon_red); Bild auflösen
    _GDIPlus_ImageDispose($balloon_green); Bild auflösen
    _GDIPlus_ImageDispose($balloon_blue); Bild auflösen
    _GDIPlus_ImageDispose($balloon_yellow); Bild auflösen
    _GDIPlus_ImageDispose($balloon_pink); Bild auflösen
    _GDIPlus_ImageDispose($hBackground); Bild auflösen
    _GDIPlus_ImageDispose($figur); Bild auflösen
    _GDIPlus_Shutdown() ; GDI+ Engine beenden
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    autoit.de/wcf/attachment/9935/

    Edit: Ich meine, dass der Wert der Variable sich ja ändert und ich alle Werte haben möchte, die bis 20 größer und kleiner sind als der Wert der Variable.

  • Alternativ kannst du auch das folgende angucken:

    [autoit]

    For $i=-2 To 2 Step 0.5
    $a=0
    $a+=$i
    If Abs($a) <=1 Then MsgBox(0,"Bedingung","Erfüllt!"&@CRLF&$a)
    Next

    [/autoit]

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

  • Hi,

    da ich die Range um eine Variable auch mal gebraucht habe, kann ich dir folgende Func empfehlen:

    [autoit]


    ;Funktion: _IsBetween
    ;Parameter: $A, der zu prüfende Wert
    ; $Min, der kleinste zu prüfende Wert
    ; $Max, der größe zu prüfende Wert
    ;Rückgabe: "True", falls $A ziwschen $Min und $Max liegt,
    ; andernfalls "False".
    Func _IsBetween($A, $Min, $Max)
    Return $A >= $Min And $A <= $Max
    EndFunc

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

    MsgBox(0, "Info", _IsBetween(3, 10, 20)); gibt "False" zurück, da 3 nicht zwischen 10 und 20 liegt.
    MsgBox(0, "Info", _IsBetween(4, 0, 19)); gibt "True" zurück, da 4 zwischen 0 und 19 liegt.

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


    Ist im Endeffekt, genau was name22 gesagt hat.

    Zu deinem Problem:
    Schau dir mal diese Zeile an:

    [autoit]


    If $balloonY = $figurY And $balloonX >= 20 Or $balloonX <= 20 = $figurX Then _GDIPlus_ImageDispose($balloon_red)

    [/autoit]

    Edit1: Willst du dabei abfragen ob $ballonX kleiner gleich 20 oder kleiner gleich $figurX ist, je nach dem musst du es um schreiben zu $ballonX <= 20 oder $balloonX <= $figurX.

    LG
    Ealendil

    7 Mal editiert, zuletzt von Ealendil (28. Mai 2010 um 20:28)

  • Kannst du mir diese Func vielleicht genauer erklären, ich blick da gar nicht durch.
    Und zu deiner letzten Äußerung: Damit befasse ich mich doch schon die ganze Zeit :huh:

    Viele Grüße,
    HopFail

  • Hi,

    hab meinen vorherigen Beitrag editiert, sollte nun logisch sein, was falsch war.

    Zur Func:
    Diese gibt dir True zurück falls dein Wert ($A) zwischen $Min (muss der kleinste Wert sein) und $Max (logischerweise der größere Wert) liegt.
    Andernfalls returnt dir die Func False.

    LG

  • Ich versteh aber nicht, warum das jetzt den Wert um die Variable überprüft und nicht einen vorher bestimmten. Denn das will ich ja nicht *verzweifel*

    Viele Grüße,
    HopFail

  • Die Funktion prüft, ob der Wert $A zwischen $Min und $Max liegt, als Beispiel sozusagen, $A, $Min und $Max musst du allerdings angeben, also:

    [autoit]


    Global $Check = 3
    MsgBox(0, "Info", _IsBetween($Check, $Check+7, $Check+17)); gibt "False" zurück, da 3 nicht zwischen 10 und 20 liegt.
    MsgBox(0, "Info", _IsBetween($Check, $Check-3, $Check+16)); gibt "True" zurück, da 3 zwischen 0 und 19 liegt.

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

    Func _IsBetween($A, $Min, $Max)
    Return $A >= $Min And $A <= $Max
    EndFunc

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

    Hoffe du verstehst was ich meine.

    LG

    3 Mal editiert, zuletzt von Ealendil (28. Mai 2010 um 20:44)

  • Eben, und Y und Z möchte ich nicht angeben, die sollen ja durch den Wert der Variable ermittelt werden (Y=X To X+20, Z=X To X-20). Verstehst du mich jetzt?

    Viele Grüße,
    HopFail

  • Versteh ungefähr was du meinst, du willst wissen ob X zwischen X-20 und X+20, doch wenn du das meinst, dann wäre das immer wahr, und kann nicht sein was du meinst, kannst du versuchen es mir mit Worten, als mit Codeschnipseln zu sagen?

    LG

  • Nein, sorry, habe mich vertan. Ich meine, dass der Wert X-Koordinate der ersten Variable bis zur X-Koordinate der ersten Variable (50 addiert) in einem Wert der X-Koordinate der zweiten Variable liegt (50 addiert).

    Ich habe nicht ganz an das Thema gedacht, tut mir leid.

    Viele Grüße,
    HopFail