stimmt..
weiß jemand wie ich das hinbekomme, dass man beide gleichzeitig bewegen kann?
Beiträge von DFPWare
-
-
Das mit dem doppelten $msg ist bei copy paste ausversehen mitgekommen
Mit zweimal auf den buffer zeichnen meinst du
[autoit]_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
[/autoit]richtig? Das hab ich auch gedacht, aber wenn ich das lösche dann wird das grüne Quadrat nicht gezeichnet

AdlibRegister hab ich auch eingefügt
Spoiler anzeigen
#include <GdiPlus.au3>
#include <GuiConstants.au3>
#include <Misc.au3>Global $xg = 0
Global $yg = 0
Global $xb = 400
Global $yb = 0OnAutoItExitRegister("_EXIT")
_GDIPlus_Startup()
$Gui = GUICreate("GDIPlus",500,500,100,100)
$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(500,500,$graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)$brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)
$brushWeiss = _GDIPlus_BrushCreateSolid(0xFF000000)
$brushBlau = _GDIPlus_BrushCreateSolid(0xFF6677FF)GUISetState(@SW_SHOW)
AdlibRegister("_zeichnen",50)While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
Case _IsPressed(25) And $xg >= 0
$xg -= 1
Case _IsPressed(26) And $yg >= 0
$yg -= 1
Case _IsPressed(27) And $xg <= 400
$xg += 1
Case _IsPressed(28) And $yg <= 400
$yg += 1
Case _IsPressed(41) And $xb >= 0
$xb -= 1
Case _IsPressed(57) And $yb >= 0
$yb -= 1
Case _IsPressed(44) And $xb <= 400
$xb += 1
Case _IsPressed(53) And $yb <= 400
$yb += 1
EndSelect
WEndFunc _EXIT()
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown()
EndFunc ;==>_EXITFunc _zeichnen()
_GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
_GDIPlus_GraphicsFillRect($buffer,$xg,$yg,100,100,$brushGruen)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
_GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
_GDIPlus_GraphicsFillRect($buffer,$xb,$yb,100,100,$brushBlau)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
EndFuncSorry aber es flackert immer noch und jetzt kann man nicht mehr beide gleichzeitig steuern, was vorher ging.
-
Hey Leute
alle meinen, dass GDI+ total schnell ist, aber irgendwie flackert das bei mir trotz Buffer-.-
Hoffentlich könnt ihr mir helfenSpoiler anzeigen
#include
#include
#include$xg = 0
$yg = 0
$xb = 400
$yb = 0OnAutoItExitRegister("_EXIT")
_GDIPlus_Startup()
$Gui = GUICreate("GDIPlus",500,500,100,100)
$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(500,500,$graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)$brushGruen = _GDIPlus_BrushCreateSolid(0xFF60CC3F)
$brushWeiss = _GDIPlus_BrushCreateSolid(0xFF000000)
$brushBlau = _GDIPlus_BrushCreateSolid(0xFF6677FF)GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
Case _IsPressed(25 ) And $xg >= 0
$xg -= 2
Case _IsPressed(26 ) And $yg >= 0
$yg -= 2
Case _IsPressed(27 ) And $xg <= 400
$xg += 2
Case _IsPressed(28 ) And $yg <= 400
$yg += 2
EndSelect
_GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
_GDIPlus_GraphicsFillRect($buffer,$xg,$yg,100,100,$brushGruen)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)Select
Case $msg = $GUI_EVENT_CLOSE
Exit
Case _IsPressed(41) And $xb >= 0
$xb -= 2
Case _IsPressed(57) And $yb >= 0
$yb -= 2
Case _IsPressed(44) And $xb <= 400
$xb += 2
Case _IsPressed(53) And $yb <= 400
$yb += 2
EndSelect
_GDIPlus_GraphicsFillRect($buffer,0,0,500,500,$brushWeiss)
_GDIPlus_GraphicsFillRect($buffer,$xb,$yb,100,100,$brushBlau)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap,0,0,500,500)
WEndFunc _EXIT()
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_Shutdown()EndFunc ;==>_EXIT -
okay danke

-
Hey Leute
ich suche schon längere Zeit ein wirklich ausführliches GDIPlus Tutorial.
Ich hab Ubuntus schon durch und auch alles verstanden, aber das ist ja nicht soooo umfangreich.
Ich will hier zum Beispiel einfach eine schwarze Fläche auf die Gui zeichnen lassen, ohne Bild, aber er macht gar nix :
Spoiler anzeigen
[autoit]#include <GdiPlus.au3>
[/autoit]
#include <GuiConstants.au3>
OnAutoItExitRegister("_EXIT")
_GDIPlus_Startup()
$Gui = GUICreate("GDIPlus",500,500,100,100)
$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
_GDIPlus_GraphicsDrawRect($graphic,10,10,100,100)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
Func _EXIT()
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_Shutdown()
EndFunc ;==>_EXIT -
achso

ich hab mich schon gewundert, weil mit pixelsearch sucht man ja die genaue Farbe und keine ähnlichen oder sowas...
-
Hey das kenn ich doch

Cooles Skript, man merkt dass du dich mit GDI+ wirklich gut auskennst, was man von mir nicht so behaupten kann

Ich finds cool dass so ein tolles Skript in nichtmal 200 Zeilen passt

DFPWare
-
Oscar :
warum ist pixelsearch nicht sehr genau??
-
Hey Robin
hertzlich willkommen im Forum, es würde mich aber interessieren, ob du schonmal mit einer anderen software programmiert hast, wie zB c++/vb/java/usw...
Wir machen zum Beispiel im Moment in Informatik BlueJ und wie es aussieht werd ich die nächsten 2 1/2 Jahre auch nix anderes mehr in der Schule sehen :wacko:
Wenn nicht, dann guck mal in meine Signatur;) da sind ein paar Tutorials zu schleifen verlinkt

-
Als ich 12 war bin ich fast mal auf sowas reingefallen.
War komischerweise auch von Sony Music Entertainment oder sonem zeugs:D
Ich hatte echt schiss :wacko:
Aber dann hab ich mich doch entschieden einfach nen bisschen zu warten, weil, wenn sie wirklich was wollten dann würden sie nen Brief schicken.
Ich sollte überweisen

omg mit 12 wusste ich doch noch nich wie man überweist und deswegen hätt ich es eh meinen Eltern sagen müssen und dann wär es mir wirklich lieber gewesen, wenn meine Eltern den Brief bekommen hätten

-
Zitat
aber 2012 soll die Wlet ja eh untergehen, von dem her.
Das ist schon der Anfang....
-
ja die Verfahren hab ich hier her

-
SelectSort ist fast das selbe wie ShakerSort, der einzige Unterschied ist, dass bei SelectSort der Array immer von vorne nach hinten durchsucht wird und auch immer nur das letzte Feld "abgeschnitten" wird. Bei ShakerSort wird der Array erst von vorne nach hinten durchsucht, dann wird das letzte Fled "abgeschnitten", dann wird von hinten nach vorne durchsucht und dann das erste Feld "abgeschnitten", usw...
Ich habe ShakerSort umgesetzt, weil ich es irgendwie interessant finde.
Wenn ich lust hab dann werd ich SelectSort wohl auch noch umsetzen, nur um Geschwindigkeitseinsparungen feststellen zu können

DFPWare
-
Also ich fänd die von Andy beschriebene Geschichte echt toll:D
das sollte man den AutoIt machern mal als Vorschlag schicken

-
Hey Leute
ich habe mal ein paar einfache Sortieralgorithmen in AutoIt umgesetzt.
Ich hoffe das kann jemand brauchen

Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
Dim $Feld[1000]
Dim $neuesFeld[1000]
For $i = 0 To 999 Step 1
$Feld[$i] = Random(1, 1000, 1)
Next
_ArrayDisplay($Feld)
$timer = TimerInit()
$neuesFeld = _InsertSort($Feld)
$zeit = TimerDiff($timer)
MsgBox(0,"Zeit","Der Algorithmus hat "&$zeit&" Millisekunden gebraucht!")
_ArrayDisplay($neuesFeld)#cs
[/autoit] [autoit][/autoit] [autoit]
_BubbleSort (3539 msek bei 1000 Zahlen)
Es wird immer von vorne bis hinten durchsucht, ob das nächste Feld größer oder kleiner ist, als das untersuchte.
Wenn das nächste Feld kleiner ist, dann werden die Daten der beiden Felder ausgetauscht.
Der Array wird um eins weniger - fach untersucht, wie er Felder hat, also bei 100 Feldern 99 - mal.
Danach ist der Array sortiert
#ce
Func _BubbleSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
For $k = 0 To UBound($iArray,1)
For $i = 0 to (UBound($iArray,1)-2)
If $iArray[$i] > $iArray[$i + 1] Then
_ArraySwap($iArray[$i + 1], $iArray[$i])
EndIf
Next
Next
Return $iArray
EndFunc#cs
[/autoit] [autoit][/autoit] [autoit]
_RippleSort (3498 msek bei 1000 Zahlen)
RippleSort ist fast identisch mit BubbleSort, jedoch ist die Abbruchbedingung anders.
Bei BubbleSort wird ein 100-Feld-Array 99-mal durgegangen, egal ob es noch etwas zum sortieren gibt.
Bei RippleSort wird ein Array solange durchsucht, bis es nichts mehr auszutauschen gibt.
#ce
Func _RippleSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
Do
$kontrolle = False
For $i = 0 to (UBound($iArray,1)-2)
If $iArray[$i] > $iArray[$i + 1] Then
_ArraySwap($iArray[$i + 1], $iArray[$i])
$kontrolle = True
EndIf
Next
Until $kontrolle == False
Return $iArray
EndFunc
#cs
_ShakerSort (2606 msek bei 1000 Zahlen)
Der Array wird zu Erst von vorne nach hinten durchsucht und ausgetauscht, wie bei BubbleSort, aber nur einmal.
Dann wird der Array von hinten nach vorne durchsucht und ausgetauscht.
Danach ist die größte Zahl hinten und die kleinste Zahl vorne.
Dadurch müssen das erste und letzte Feld nicht mehr untersucht werden.
Das wird wiederholt und dann sind die beiden größten Zahlen hinten und die beiden kleinsten Zahlen vorne.
Das wird solange wiederholt, bis sich die beiden Fronten in der Mitte treffen.
Dann ist der Array sortiert.
Ein ähnliches Verfahren namens Selectsort funktioniert genauso, jedoch wird immer von vorne nach hinten durchsucht und immer nur das letzte Feld abgeschnitten.
#ce
Func _ShakerSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
$links = 0
$rechts = UBound($iArray,1)-1
Do
$iArray = _ShakerLinks($iArray,$links,$rechts)
$links += 1
$iArray = _ShakerRechts($iArray,$links,$rechts)
$rechts -= 1
Until $links > $rechts
Return $iArray
EndFunc
Func _ShakerLinks($lArray,$l,$r)
For $i=$l To $r-1 Step 1
If $lArray[$i] > $lArray[$i + 1] Then
_ArraySwap($lArray[$i + 1], $lArray[$i])
EndIf
Next
Return $lArray
EndFunc
Func _ShakerRechts($rArray,$l,$r)
For $i = $r-1 To $l Step -1
If $rArray[$i] < $rArray[$i - 1] Then
_ArraySwap($rArray[$i - 1], $rArray[$i])
EndIf
Next
Return $rArray
EndFunc#cs
[/autoit]
_InsertSort (2572 msek bei 1000 Zahlen)
es wird von vorne bis hinten durchgeguckt, ob die aktuell untersuchte Zahl weiter vorne einsortiert werden kann.
Wenn also $i zum Beispiel bei 5 ist, dann wird geprüft, ob sich die zahl zwischen 3 und 4, 2 und 3, 1 und 2, oder 0 und 1 einsortieren lässt.
#ce
Func _InsertSort($iArray)
For $i = 0 To (UBound($iArray,1)-2) Step 1
For $j = $i To 0 Step -1
If $iArray[$j] > $iArray[$j+1] Then
_ArraySwap($iArray[$j],$iArray[$j+1])
EndIf
Next
Next
Return $iArray
EndFunc
#cs
Anschaulich:
_BubbleSort 3539 msek
_RippleSort 3498 msek
_ShakerSort 2606 msek
_InsertSort 2572 msek
#cePS: Ja ich kenne _ArraySort

-
habs doch selber hinbekommen

für alle die es interessiert hier das Skript:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit]
Dim $Feld[100]
Dim $neuesFeld[100]
For $i = 0 To 99 Step 1
$Feld[$i] = Random(1, 1000, 1)
Next
_ArrayDisplay($Feld)
$neuesFeld = _ShakerSort($Feld)
_ArrayDisplay($neuesFeld)
#cs
_ShakerSort
Der Array wird zu Erst von vorne nach hinten durchsucht und ausgetauscht, wie bei BubbleSort, aber nur einmal.
Dann wird der Array von hinten nach vorne durchsucht und ausgetauscht.
Danach ist die größte Zahl hinten und die kleinste Zahl vorne.
Dadurch müssen das erste und letzte Feld nicht mehr untersucht werden.
Das wird wiederholt und dann sind die beiden größten Zahlen hinten und die beiden kleinsten Zahlen vorne.
Das wird solange wiederholt, bis sich die beiden Fronten in der Mitte treffen.
Dann ist der Array sortiert.
Ein ähnliches Verfahren namens Selectsort funktioniert genauso, jedoch wird immer von vorne nach hinten durchsucht und immer nur das letzte Feld abgeschnitten.
#ce
Func _ShakerSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
$links = 0
$rechts = UBound($iArray,1)-1
Do
$iArray = _ShakerLinks($iArray,$links,$rechts)
$links += 1
$iArray = _ShakerRechts($iArray,$links,$rechts)
$rechts -= 1
Until $links > $rechts
Return $iArray
EndFunc
Func _ShakerLinks($lArray,$l,$r)
For $i=$l To $r-1 Step 1
If $lArray[$i] > $lArray[$i + 1] Then
_ArraySwap($lArray[$i + 1], $lArray[$i])
EndIf
Next
Return $lArray
EndFunc
Func _ShakerRechts($rArray,$l,$r)
For $i = $r-1 To $l Step -1
If $rArray[$i] < $rArray[$i - 1] Then
_ArraySwap($rArray[$i - 1], $rArray[$i])
EndIf
Next
Return $rArray
EndFunc -
Hast du das Skript ausgeführt?
Bei mir wird das Programm schon vor Beendigung von _ShakerLinks beendet.
CodeC:\Users\XXXXXX\Desktop\AutoIt v3 Script (neu).au3 (42) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: If $lArray[$i] > $lArray[$i + 1] Then If $lArray[$i] > ^ ERROR ->10:18:13 AutoIT3.exe ended.rc:1 >Exit code: 1 Time: 2.7521.) die For-Schleife läuft nicht bis 100, sie läuft bis $r-1, $r = $rechts aus _ShakerSort, $rechts ist Ubound($iArray), Ubound($iArray) ist 100;
==>> sie läuft bis 100-1 ==>> 99
2.) stimmt es müsste so heißen:
[autoit]$links += 1
[/autoit]3.) wenn ich das richtig verstanden hab dann ist das damit ^ behoben
Es funktioniert aber immer noch nicht, der Fehler bleibt der Selbe
-
Hey Leute
ich versuche gerade einen Sortieralgorithmus namens Shakersort zu schreiben, aber ich bekomme einen Fehler wo ich keinen sehe.
ich hoffe ihr könnt mir helfen.
Danke
DFPWare
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit]
Dim $Feld[100]
Dim $neuesFeld[100]
For $i = 0 To 99 Step 1
$Feld[$i] = Random(1, 1000, 1)
Next
_ArrayDisplay($Feld)
$neuesFeld = _ShakerSort($Feld)
_ArrayDisplay($neuesFeld)
#cs
_ShakerSort
Der Array wird zu Erst von vorne nach hinten durchsucht und ausgetauscht, wie bei BubbleSort, aber nur einmal.
Dann wird der Array von hinten nach vorne durchsucht und ausgetauscht.
Danach ist die größte Zahl hinten und die kleinste Zahl vorne.
Dadurch müssen das erste und letzte Feld nicht mehr untersucht werden.
Das wird wiederholt und dann sind die beiden größten Zahlen hinten und die beiden kleinsten Zahlen vorne.
Das wird solange wiederholt, bis sich die beiden Fronten in der Mitte treffen.
Dann ist der Array sortiert.
Ein ähnliches Verfahren namens Selectsort funktioniert genauso, jedoch wird immer von vorne nach hinten durchsucht und immer nur das letzte Feld abgeschnitten.
#ce
Func _ShakerSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
$links = 0
$rechts = UBound($iArray,1)
Do
$iArray = _ShakerLinks($iArray,$links,$rechts)
$links -= 1
$iArray = _ShakerRechts($iArray,$links,$rechts)
$rechts -= 1
Until $links > $rechts
EndFunc
Func _ShakerLinks($lArray,$l,$r)
For $i=$l To $r-1 Step 1
ConsoleWrite($i&@CRLF)
If $lArray[$i] > $lArray[$i + 1] Then
_ArraySwap($lArray[$i + 1], $lArray[$i])
EndIf
Next
Return $lArray
EndFunc
Func _ShakerRechts($rArray,$l,$r)
For $i = $r-1 To $l Step 1
If $rArray[$i] < $rArray[$i - 1] Then
_ArraySwap($rArray[$i - 1], $rArray[$i])
EndIf
Next
Return $rArray
EndFunc -
stimmt so macht das alles Sinn.
Danke
aber gibt es da nicht eine einfache Funktion, die mir einfach jede Spalte sortiert?
-
Hey Leute
ich habe mal eine Frage zu meinem Lottoprogramm...
Es sollen Zufallszahlen erzeugt werden und dann sortiert wieder ausgegeben werden.
Die Funktion _ArraySort macht mir jedoch Probleme.
Es wird immer nur die letzte Spalte des Arrays sortiert.
Ich hoffe Ihr könnt mir helfen.
Danke
DFPWare
Spoiler anzeigen
[autoit]#include <GuiConstants.au3>
[/autoit]
#include <Array.au3>
GUICreate("LOTTO",320,480)
GUICtrlCreateLabel("Lotto [1 aus 49]",120,30)
GUICtrlCreateLabel("Anzahl der Tipps",10,80)
$input = GUICtrlCreateInput("",100,80,100)
$lotto = GUICtrlCreateButton("Tipp",210,78,100)
$liste = GUICtrlCreateListView("A|B|C|D|E|F",10,110,300,300)
$beenden = GUICtrlCreateButton("Beenden",120,430,100)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $lotto
$anzahl = GUICtrlRead($input)
Dim $array[6][$anzahl]
For $i = 0 To $anzahl-1 Step 1
For $p = 0 To 5 Step 1
$array[$p][$i] = Random(1,49,1)
Next
If $array[0][$i] <> $array[1][$i] And $array[0][$i] <> $array[2][$i] And $array[0][$i] <> $array[3][$i] And $array[0][$i] <> $array[4][$i] And $array[0][$i] <> $array[5][$i] And $array[1][$i] <> $array[2][$i] And $array[1][$i] <> $array[3][$i] And $array[1][$i] <> $array[4][$i] And $array[1][$i] <> $array[5][$i] And $array[2][$i] <> $array[3][$i] And $array[2][$i] <> $array[4][$i] And $array[2][$i] <> $array[5][$i] And $array[3][$i] <> $array[4][$i] And $array[3][$i] <> $array[5][$i] And $array[4][$i] <> $array[5][$i] Then ContinueLoop
Else
$i -= 1
EndIf
Next
Case $beenden
_ArrayDisplay($array)
For $k = 0 To $anzahl-1 Step 1
_ArraySort($array,0,0,0,$k)
Next
_ArrayDisplay($array)
EndSwitch
WEnd