Seite 1 von 2
Ausschnitt aus einem Windows bearbeiten
Verfasst: 25.08.2008 21:13
von sechsrad
Hallo, nächstes Problem :
Ich habe ein Sprite als festes Hintergrundbild, wo sich an x=150,y=150,h=50,b=50 ein rotes Viereck befindet. Dieses rote Viereck möchte ich dauernd einlesen zum Auswerten. Möchte dann herausfiltern, wann sich das Sprite spr1 darin befindet, bzw das Viereck berührt. Möchte also eine Farbauswertung machen.
Wie kann ich das rote Viereck auslesen?
mfg
Code: Alles auswählen
OpenWindow(0,0,0,800,530,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
OpenWindowedScreen(WindowID(0),260,5,500,500,0,0,0)
.....
DisplaySprite(hintergrund1, 0,0)
DisplaySprite3d(spr1, 100,100)
Verfasst: 25.08.2008 21:50
von Kaeru Gaman
ist das nötig das so umständlich mit nem Farbcheck zu machen?
warum kein Koordinatencheck?
Code: Alles auswählen
Procedure P_StdColl(x1,y1,a1,b1,x2,y2,a2,b2)
Coll = #False
If x1 < x2
dx = x2 - (x1 + a1)
Else
dx = x1 - (x2 + a2)
EndIf
If y1 < y2
dy = y2 - (y1 + b1)
Else
dy = y1 - (y2 + b2)
EndIf
If dx < 0 And dy < 0
Coll = #True
EndIf
ProcedureReturn Coll
EndProcedure
RechteckX = 150 : RechteckY = 150
RechteckB = 50 : RechteckH = 50
Spr1X = 100 : Spr1Y = 100
Spr1B = SpriteWidth(spr1) : Spr1H = SpriteHeight(spr1)
Overlap = P_StdColl( RechteckX, RechteckY, RechteckB, RechteckH, Spr1X, Spr1Y, Spr1B, Spr1H )
Verfasst: 25.08.2008 22:01
von sechsrad
Danke für dein Vorschlag.
Da mein Sprite ein Auto ist, mit aussenliegenden Rädern , wollte ich auch prüfen wann das erste Rad im roten Viereck ist ohne den Restkörper.
mfg
Verfasst: 25.08.2008 22:10
von Kaeru Gaman
verstehe.
also, der Zugriff auf den Screen und ein Pixel prüfen kannst du
mit StartDrawing(ScreenOutput()) und Point(x,y).
bzw. GetDIBits wie du schon angesprochen hast, damit kenn ich mich nicht so aus,
denk nur dran dass in deinem Fall der Screen der Context ist, nicht das Window.
dieses Verfahren ist ziemlich effektiv, wenn es zum Beispiel darum geht,
verschiedene Gebiete auf einer Topografischen Karte zu unterscheiden.
dann kann man eine Referenzkarte erstellen, wo die Gebiete (Landkreise)
in verschiedenen Farben dargestellt sind.
das von dir angesprochene Beispiel hab ich auch schon mal durchdacht.
hierbei würde ich mich auf 4-8 referenzpunkte beschränken,
anstatt komplette shapes zu vergleichen.
es genügt doch zu wissen, ob ein Rad am Rand oder mittig auf dem fraglichen Untergrund ist.
wenn sich das nicht auf sehr wenige Punkte beschränken läßt,
ist oftmals eine etwas komplexere Koordinatenberechnung,
zum beispiel vier korrespondierende Bounding-Circles,
immer noch schneller als zig punkte auf deren Farbwerte zu vergleichen.
Verfasst: 25.08.2008 22:24
von sechsrad
Dieses Paint ist zu langsam.
Ich mache die Auswertung dann mit Asm.
Habe diese Asm-Frage schon gelöst bekommen hier im Forum.
Die Testschleife macht 100.000.000 abfragen nach RGB in ca 320ms.
Das ist doch was.
Mir geht es darum, dieses Viereck schnelltens zum Auswerten rauskopieren in eine Bitmap.
mfg
Verfasst: 25.08.2008 22:41
von Kaeru Gaman
yo klar, die abfrage ist schon etwas schicker so schnell.
trotzdem, überleg mal die anzahl checkpoints zu verringern.
mir vier bis fünf punkte pro reifen müßtest du doch eigentlich schon das maximum an informationen haben, was du brauchst.
du musst ja nicht nur die gewisse anzahl punkte auslesen,
du musst das ergebnis ja auch noch interpretieren und danach deine reaktion vorbereiten.
Verfasst: 25.08.2008 22:52
von sechsrad
Das werde ich dann später noch reduzieren. Steckt noch in den Anfängen.
Wichtig ist, wie bekomme ich jetzt meinem Wunschausschnitt zum Auswerten in eine Bitmap.
mfg
Verfasst: 25.08.2008 22:58
von Kaeru Gaman
ich würde ja direkt auf den screen zugreifen.
warum erst noch nen umständlichen copyvorgang durchführen?
Verfasst: 26.08.2008 08:25
von sechsrad
Mach bitte von einem Viereck am einen Vorschlag.
mfg
Verfasst: 26.08.2008 11:16
von Kaeru Gaman
na du sagst doch, du willst DIBits benutzen.
außerdem hast du ja schon eine ASM routine, wie du sagst.
also richte die so ein, dass sie auf deinen screenbuffer zugreift.
der ist auch eine Bitmap.
dort erst eine weitere bitmap rauszuholen, wäre ein zusätzlicher, überflüssiger, bremsender Vorgang.