ja ich hab das wieder geändert sorry
RectCollison
-
- [ gelöst ]
-
Nathax -
16. Dezember 2009 um 16:42 -
Geschlossen -
Erledigt
-
-
meinste so??
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Array.au3>
#Include <Misc.au3>HotKeySet("{ESC}", "ende")
[/autoit] [autoit][/autoit] [autoit]; Hauptvariablen-------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$f = 0
Global $guix, $guiy
Global $fischx = 200, $fischy = 300, $movex = 10, $movey = 10
; ---------------------------------------; Guierstellung--------------------------
[/autoit] [autoit][/autoit] [autoit]
$gui1 = GUICreate ("Aquarium",(@DesktopWidth), (@DesktopHeight-65),0,0)
GUISetBkColor(0x0000ff,$gui1)
$hintergrund = GUICtrlCreatepic("bilder\hintergrund.gif",0,0,@DesktopWidth,@DesktopHeight-50)
$fisch1 = GUICtrlCreatepic("bilder\fischrechts1.gif",$fischx,$fischy, 120,100)
$futter = GUICtrlCreatePic("bilder\futter.gif",-200,-200,100,100)
GUISetState (@SW_SHOW)
; ---------------------------------------AdlibEnable("move_fisch", 20)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Hauptfunktion des Guis-----------------
[/autoit] [autoit][/autoit] [autoit]
While 1
$c = GUIGetCursorInfo()
$f1pos = ControlGetPos( "Aquarium", "", $fisch1)
$fupos = ControlGetPos( "Aquarium", "", $futter)
$msg = GUIGetMsg()
_RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
If _IsPressed("01") and $f = 1 Then
GUICtrlDelete($futter)
$futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
ElseIf _IsPressed("01") and $f = 0 then
$futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
EndifWend
[/autoit] [autoit][/autoit] [autoit]
; ---------------------------------------; Funktionen-----------------------------
[/autoit] [autoit][/autoit] [autoit]
Func ende()
Exit
EndFuncFunc move_fisch()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Select
Case $fischx < 0
GUICtrlSetImage($fisch1,"bilder\fischrechts1.gif")
$movex = Random(0, 10, 1)
Case $fischx > @DesktopWidth - 120
GUICtrlSetImage($fisch1,"bilder\fischlinks1.gif")
$movex = Random(-10, 0, 1)
EndSelect
Select
Case $fischy < 0
$movey = Random(0, 10, 1)
Case $fischy > @DesktopHeight - 100
$movey = Random(-10, 0, 1)
EndSelect
$fischx = $fischx + $movex
$fischy = $fischy + $movey
GUICtrlSetPos($fisch1, $fischx, $fischy)
EndFunc
; ---------------------------------------;noch unwichtig-------------------------
[/autoit]
Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
; Prog@ndy
Local Const $tagRECT = "long;long;long;long"
Local $1 = DllStructCreate($tagRECT)
Local $2 = DllStructCreate($tagRECT)
Local $3 = DllStructCreate($tagRECT)
DllStructSetData($1, 1, $Rect1X1)
DllStructSetData($1, 2, $Rect1Y1)
DllStructSetData($1, 3, $Rect1X2)
DllStructSetData($1, 4, $Rect1Y2)
DllStructSetData($2, 1, $Rect2X1)
DllStructSetData($2, 2, $Rect2Y1)
DllStructSetData($2, 3, $Rect2X2)
DllStructSetData($2, 4, $Rect2Y2)
Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
If @error Then Return SetError(1, 0, 0)
Return $r[0] <> 0
EndFunc ;==>_RectCollision -
ok das hab ich wie mache ich jetzt die bedingung wenn es eine collision gibt??
-
So meinte ich das
Aber funktioniert es denn jetzt?
MfG
Der_Doc -
@retrokid: Merke: Das Praktische an einer Funktion ist das man sie mit verschiedenen Werten aufrufen kann und sie für diese Werte immer die gleichen Funkion ausführt.
Egal ob das jetzt eine selbsterstellte funktion wie diese ist oder ob es eine Standartfunktion von autoit ist (sowas wie GuiCtrlCreate... oder was auch immer)
-
ja gut aber wie mache ich jetzt die bedingung das etwas passiert wenn sie collidieren
-
So in etwa:
[autoit]If _RectCollision(... deine Parameter ...) Then tu_was()
[/autoit] -
ok ich versuchs mal
-
das funkt bei mir iwie nicht
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Array.au3>
#Include <Misc.au3>
HotKeySet("{ESC}", "ende")
; Hauptvariablen-------------------------
$f = 0
Global $guix, $guiy
Global $fischx = 200, $fischy = 300, $movex = 10, $movey = 10
; ---------------------------------------; Guierstellung--------------------------
[/autoit] [autoit][/autoit] [autoit]
$gui1 = GUICreate ("Aquarium",(@DesktopWidth), (@DesktopHeight-65),0,0)
GUISetBkColor(0x0000ff,$gui1)
$hintergrund = GUICtrlCreatepic("bilder\hintergrund.gif",0,0,@DesktopWidth,@DesktopHeight-50)
$fisch1 = GUICtrlCreatepic("bilder\fischrechts1.gif",$fischx,$fischy, 120,100)
$futter = GUICtrlCreatePic("bilder\futter.gif",-200,-200,100,100)
GUISetState (@SW_SHOW)
; ---------------------------------------
AdlibEnable("move_fisch", 20); Hauptfunktion des Guis-----------------
[/autoit] [autoit][/autoit] [autoit]
While 1
$c = GUIGetCursorInfo()
$f1pos = ControlGetPos( "Aquarium", "", $fisch1)
$fupos = ControlGetPos( "Aquarium", "", $futter)
$msg = GUIGetMsg()
_RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+200, $f1pos[1]+300, $fupos[0], $fupos[1], $fupos[0]+100, $fupos[1]+100)
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
If _IsPressed("01") and $f = 1 Then
GUICtrlDelete($futter)
$futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
ElseIf _IsPressed("01") and $f = 0 then
$futter = GUICtrlCreatePic("bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
Endif
Wend
; ---------------------------------------
; Funktionen-----------------------------
Func ende()
Exit
EndFunc
Func move_fisch()
Select
Case $fischx < 0
GUICtrlSetImage($fisch1,"bilder\fischrechts1.gif")
$movex = Random(0, 10, 1)
Case $fischx > @DesktopWidth - 120
GUICtrlSetImage($fisch1,"bilder\fischlinks1.gif")
$movex = Random(-10, 0, 1)
EndSelect
Select
Case $fischy < 0
$movey = Random(0, 10, 1)
Case $fischy > @DesktopHeight - 100
$movey = Random(-10, 0, 1)
EndSelect
$fischx = $fischx + $movex
$fischy = $fischy + $movey
GUICtrlSetPos($fisch1, $fischx, $fischy)
EndFunc
; ---------------------------------------;noch unwichtig-------------------------
[/autoit]
Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
; Prog@ndy
Local Const $tagRECT = "long;long;long;long"
Local $1 = DllStructCreate($tagRECT)
Local $2 = DllStructCreate($tagRECT)
Local $3 = DllStructCreate($tagRECT)
DllStructSetData($1, 1, $Rect1X1)
DllStructSetData($1, 2, $Rect1Y1)
DllStructSetData($1, 3, $Rect1X2)
DllStructSetData($1, 4, $Rect1Y2)
DllStructSetData($2, 1, $Rect2X1)
DllStructSetData($2, 2, $Rect2Y1)
DllStructSetData($2, 3, $Rect2X2)
DllStructSetData($2, 4, $Rect2Y2)
Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
If @error Then Return SetError(1, 0, 0)
Return $r[0] <> 0
If _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2) Then
MsgBox(0,"warnung","zsstoß")
Endif
EndFunc ;==>_RectCollision -
Bei mir schon
Das einzige die Positionen finde ich net so richtig.Spoiler anzeigen
[autoit]#include <Misc.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StructureConstants.au3>HotKeySet("{ESC}", "ende")
[/autoit] [autoit][/autoit] [autoit]; Hauptvariablen-------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$f = 0
Global $guix, $guiy
Global $fischx = 200, $fischy = 300, $movex = 10, $movey = 10
; ---------------------------------------; Guierstellung--------------------------
[/autoit] [autoit][/autoit] [autoit]
$gui1 = GUICreate ("Aquarium",(@DesktopWidth), (@DesktopHeight-65),0,0)
GUISetBkColor(0x0000ff,$gui1)
$hintergrund = GUICtrlCreatepic("Aqua\bilder\hintergrund.gif",0,0,@DesktopWidth,@DesktopHeight-50)
$fisch1 = GUICtrlCreatepic("Aqua\bilder\fischrechts1.gif",$fischx,$fischy, 120,100)
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",-200,-200,100,100)
GUISetState (@SW_SHOW)
; ---------------------------------------AdlibEnable("move_fisch", 20)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Hauptfunktion des Guis-----------------
[/autoit] [autoit][/autoit] [autoit]
While 1
$c = GUIGetCursorInfo()
$f1pos = ControlGetPos( "Aquarium", "", $fisch1)
$fupos = ControlGetPos( "Aquarium", "", $futter)
$msg = GUIGetMsg()$erg = _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+20, $f1pos[1]+20, $fupos[0], $fupos[1], $fupos[0]+20, $fupos[1]+20)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Select
[/autoit] [autoit][/autoit] [autoit]
Case $msg = $GUI_EVENT_CLOSE
ExitCase $erg = TRUE
[/autoit] [autoit][/autoit] [autoit]
msgbox(0,"",$erg)
EndSelect
If _IsPressed("01") and $f = 1 Then
GUICtrlDelete($futter)
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
ElseIf _IsPressed("01") and $f = 0 then
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
EndifWend
[/autoit] [autoit][/autoit] [autoit]
; ---------------------------------------; Funktionen-----------------------------
[/autoit] [autoit][/autoit] [autoit]
Func ende()
Exit
EndFuncFunc move_fisch()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Select
Case $fischx < 0
GUICtrlSetImage($fisch1,"Aqua\bilder\fischrechts1.gif")
$movex = Random(0, 10, 1)
Case $fischx > @DesktopWidth - 120
GUICtrlSetImage($fisch1,"Aqua\bilder\fischlinks1.gif")
$movex = Random(-10, 0, 1)
EndSelect
Select
Case $fischy < 0
$movey = Random(0, 10, 1)
Case $fischy > @DesktopHeight - 100
$movey = Random(-10, 0, 1)
EndSelect
$fischx = $fischx + $movex
$fischy = $fischy + $movey
GUICtrlSetPos($fisch1, $fischx, $fischy)
EndFunc
; ---------------------------------------;noch unwichtig-------------------------
[/autoit]
Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
; Prog@ndy
Local Const $tagRECT = "long;long;long;long"
Local $1 = DllStructCreate($tagRECT)
Local $2 = DllStructCreate($tagRECT)
Local $3 = DllStructCreate($tagRECT)
DllStructSetData($1, 1, $Rect1X1)
DllStructSetData($1, 2, $Rect1Y1)
DllStructSetData($1, 3, $Rect1X2)
DllStructSetData($1, 4, $Rect1Y2)
DllStructSetData($2, 1, $Rect2X1)
DllStructSetData($2, 2, $Rect2Y1)
DllStructSetData($2, 3, $Rect2X2)
DllStructSetData($2, 4, $Rect2Y2)
Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
If @error Then Return SetError(1, 0, 0)
Return $r[0] <> 0
EndFunc ;==>_RectCollisionICH HABE VOR DIE BILDER NOCH AQUA VOR GEMACHT ALSO ACHTUNG!
müsstest du eben anpassenMfG
Der_Doc -
es funkt aber ist das normal so, dass es nicht immer klappt??
-
Ja die genauen Positionen deiner Bilder mußt du aber selber raus bekommen Das war nur ein Versuch von mir.
Ein Tip noch:
wenn du SciTE verwendest, benutze das Tool OrganizeIncludes das wirft überflüssige Includes raus und fügt benötigte ein.MfG
Der_Doc -
thx aber komisch finde ich das es nicht klappt wenn man anstatt der msg das fiutterpic löscht dann kommt nämlich error
und wie downloade ich das ehergesagt kannste mir den link zu dem thread geben
ah es klappt doch sorry ich muss das fiutter dabnach einfach nochmal erstellen damit die abfrage weiterlaufen kann.
-
Erstmal ein Update für deine Bildpositionen.
Spoiler anzeigen
[autoit]$erg = _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+$f1pos[3], $f1pos[1]+$f1pos[2], $fupos[0], $fupos[1], $fupos[0]+$fupos[3], $fupos[1]+$fupos[2])
[/autoit]Dann sollteste du die Bilder "Rahmen" so eng wie möglich um den Fisch und das Futter legen. soll heissen die Bilder so eng wie möglich ausschneiden.
So Das Tool findest du im Forum "linke Seite" in der Box Autoit Downloads.
MfG
Der_Doc -
cool danke es verschwindet jetzt vllt estwas zu früh aber dafür ist es viel besser als vorher thx
-
ich schließ dan glaub ich mal
-
Habe mich wohl geirrt
Spoiler anzeigen
[autoit]$erg = _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+$f1pos[2], $f1pos[1]+$f1pos[3], $fupos[0], $fupos[1], $fupos[0]+$fupos[2], $fupos[1]+$fupos[3])
[/autoit]Und es sollte bevor das nächste mal TRUE angezeigt wird mindestens einmal Flase kommen.
MfG
Der_Doc -
wie meinste das unter derm spoiler??
-
Naja es trifft ja mehr wie einmal zu das sich die Rechtecke kreutzen. Aber du möchtest doch bestimmt nur beim ersten Treffer ne Aktion auslösen oder?
MfG
Der_Doc -
So nun ist das alles drin.
Spoiler anzeigen
[autoit]#include <Misc.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StructureConstants.au3>HotKeySet("{ESC}", "ende")
[/autoit] [autoit][/autoit] [autoit]; Hauptvariablen-------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$lauf = 0
$f = 0
Global $guix, $guiy
Global $fischx = 200, $fischy = 300, $movex = 10, $movey = 10
; ---------------------------------------; Guierstellung--------------------------
[/autoit] [autoit][/autoit] [autoit]
$gui1 = GUICreate ("Aquarium",(@DesktopWidth), (@DesktopHeight-65),0,0)
GUISetBkColor(0x0000ff,$gui1)
$hintergrund = GUICtrlCreatepic("Aqua\bilder\hintergrund.gif",0,0,@DesktopWidth,@DesktopHeight-50)
$fisch1 = GUICtrlCreatepic("Aqua\bilder\fischrechts1.gif",$fischx,$fischy, 120,100)
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",-200,-200,100,100)
GUISetState (@SW_SHOW)
; ---------------------------------------AdlibEnable("move_fisch", 20)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Hauptfunktion des Guis-----------------
[/autoit] [autoit][/autoit] [autoit]
While 1
$c = GUIGetCursorInfo()
$f1pos = ControlGetPos( "Aquarium", "", $fisch1)
$fupos = ControlGetPos( "Aquarium", "", $futter)
$msg = GUIGetMsg()$erg = _RectCollision($f1pos[0], $f1pos[1], $f1pos[0]+$f1pos[2], $f1pos[1]+$f1pos[3], $fupos[0], $fupos[1], $fupos[0]+$fupos[2], $fupos[1]+$fupos[3])
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]if $msg = $GUI_EVENT_CLOSE Then Exit
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
if $erg = FALSE Then $lauf = 0
if $erg = TRUE AND $lauf = 0 Then
msgbox(0,"",$erg)
$lauf=1
EndIfIf _IsPressed("01") and $f = 1 Then
[/autoit] [autoit][/autoit] [autoit]
GUICtrlDelete($futter)
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
ElseIf _IsPressed("01") and $f = 0 then
$futter = GUICtrlCreatePic("Aqua\bilder\futter.gif",$c[0]-40,$c[1]-40,100,100)
$f = 1
EndifWend
[/autoit] [autoit][/autoit] [autoit]
; ---------------------------------------; Funktionen-----------------------------
[/autoit] [autoit][/autoit] [autoit]
Func ende()
Exit
EndFuncFunc move_fisch()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Select
Case $fischx < 0
GUICtrlSetImage($fisch1,"Aqua\bilder\fischrechts1.gif")
$movex = Random(0, 10, 1)
Case $fischx > @DesktopWidth - 120
GUICtrlSetImage($fisch1,"Aqua\bilder\fischlinks1.gif")
$movex = Random(-10, 0, 1)
EndSelect
Select
Case $fischy < 0
$movey = Random(0, 10, 1)
Case $fischy > @DesktopHeight - 100
$movey = Random(-10, 0, 1)
EndSelect
$fischx = $fischx + $movex
$fischy = $fischy + $movey
GUICtrlSetPos($fisch1, $fischx, $fischy)
EndFunc
; ---------------------------------------;noch unwichtig-------------------------
[/autoit]
Func _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
; Prog@ndy
Local Const $tagRECT = "long;long;long;long"
Local $1 = DllStructCreate($tagRECT)
Local $2 = DllStructCreate($tagRECT)
Local $3 = DllStructCreate($tagRECT)
DllStructSetData($1, 1, $Rect1X1)
DllStructSetData($1, 2, $Rect1Y1)
DllStructSetData($1, 3, $Rect1X2)
DllStructSetData($1, 4, $Rect1Y2)
DllStructSetData($2, 1, $Rect2X1)
DllStructSetData($2, 2, $Rect2Y1)
DllStructSetData($2, 3, $Rect2X2)
DllStructSetData($2, 4, $Rect2Y2)
Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
If @error Then Return SetError(1, 0, 0)
Return $r[0] <> 0
EndFunc ;==>_RectCollisionAber wieder an den Pfad der Bilder denken.
MfG
Der_Doc -