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.