Ausschnitt aus einem Windows bearbeiten

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Ausschnitt aus einem Windows bearbeiten

Beitrag 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)

Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 )
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich würde ja direkt auf den screen zugreifen.
warum erst noch nen umständlichen copyvorgang durchführen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

Mach bitte von einem Viereck am einen Vorschlag.

mfg
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten