Kollisionsabfrage auf drawline / drawrect Objekte ?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Oxcom

Betreff: Kollisionsabfrage auf drawline / drawrect Objekte ?

BeitragMo, Okt 24, 2005 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

Doppelpostings vermeide ich normalerweise grundsätzlich. Aber mein neues Problem geht vermutlich in meinem vorhergehenden Thread aufgrund anderer Problembeschreibung ein bisschen unter.

Zum Thema Kollision:

Momentan habe ich mittels drawline und drawrect ein simples Labyrinth gezeichnet. Mit drawline einen Rand und mit drawrect 4 gleichgrosse Hindernisse innerhalb des Rahmens. Linien und Rechtecke haben die gleiche Farbe.

Weiterhin habe ich ein animiertes Image mit 8 Frames als Spielfigur, welches sich per Zufall in diesem Labyrinth bewegt.

Die Kollision mittels x und y Koordinaten abfragen habe ich schon gemacht. Ist mir aber zu unflexibel. So müsste ich den Rand und jedes Hindernis innerhalb des Rands müsham abfragen.

Meine Vorstellung wäre eventuell die Abfrage der Farbe. Beispielsweise:

Wenn aktuelle x position+1 = bestimmte Farbe dann dementsprechende Aktion ausführen

Wäre das so in Ordnung oder gibt es da noch bessere Möglichkeiten ?

Imagescollide ist ja in diesem Fall aufgrund nur einem Image nicht relevant. Zumal ich erstmal eine Lösung für den beschriebenen Vorgang suche.

Gibt es also eine geeignete Kollisionsabfrage für Linien und Rechtecke ohne festdefinierte Koordinatenabfrage ? Ich benötige auch keine fertige Routine, sondern einfach ein paar Hinweise. Lernen und Ausknobeln möchte ich es selbst. Sonst wird das niemals etwas.

Habe übrigens das ganze offizielle Blitzforum durchsucht und auch hier bisher noch nichts gefunden. An diesem Rätsel versuche ich mich jetzt schon 2 Wochen ...

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Smily

BeitragMo, Okt 24, 2005 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Farbe kannst du mit Getcolor(X,Y) Bekommen.
Da kansnt du dann mit ColorRed(), ColorGreen() und ColorBlue() erfragen
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Freeman

BeitragMo, Okt 24, 2005 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe vor einiger zeit das hier gecodet : https://www.blitzforum.de/viewtopic.php?t=12291 . Das ist eine function die prüft ob rechtecke sich berühren oder nicht. Sie könnte dir helfen.

Fr3eMaN
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28

Oxcom

BeitragMo, Okt 24, 2005 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Werde ich nach Feierabend gleich mal testen. Ansonsten muss ich leider nochmal auf die Frage zurückommen.

Im fertigen Spiel werde ich das Labyrinth natürlich mit Tiles gestalten. Trotzdem möchte ich erstmal diese Abfrage in den Griff bekommen.

Vielen Dank jedenfalls für die Hinweise.

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragDi, Okt 25, 2005 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Freeman:

Habe mir gestern Abend deinen Code nochmal in aller Ruhe angeschaut. Falls ich falsch liege ... bitte korrigieren:

In diesem Code werden im Prinzip auch Koordinaten eines Objekts abgefragt. In diesem Fall das Rechteck. Wenn Du jetzt beispielsweise 5 Rechtecke gezeichnet hättest, müsste man doch für alle Rechtecke neue Variablen vergeben und diese alle abfragen richtig ? Dann kann man doch normalerweise gleich alle Koordinaten direkt abfragen. Und genau dass wollte ich eigentlich vermeiden.

Egal ob Oval, Rechteck oder einzelne Pixel in einem Labyrinth vorausgesetzt gleiche Farbe ... und selbst bei zufällig platzierten Objekten muss es doch eine Abfragemöglichkeit geben. Vermutlich wird man doch die Farbe abfragen müssen oder ?

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragMi, Okt 26, 2005 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat wirklich keiner mehr eine Idee ? Sad Soll ich vielleicht meinen Code posten ?

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Freeman

BeitragMi, Okt 26, 2005 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Oxcom hat Folgendes geschrieben:
Freeman:

Wenn Du jetzt beispielsweise 5 Rechtecke gezeichnet hättest, müsste man doch für alle Rechtecke neue Variablen vergeben und diese alle abfragen richtig ? Dann kann man doch normalerweise gleich alle Koordinaten direkt abfragen.


ja, aber wenn du alle als type machst in eie liste reinhaust, kannst du die ganze sache mit einer schleife checken .
zeig einfach ma nen code, ich helf dir dann,oder probier es zumindest

Fr3eMaN
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28

Oxcom

BeitragDo, Okt 27, 2005 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Freeman,

bin momentan noch in der Arbeit. Heute abend kann ich dann meinen Code posten. Vielen Dank schon mal soweit.

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragSo, Okt 30, 2005 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für die Verspätung ! Hier nun mein Programmcode. Bin wie gesagt noch absoluter Noob ! Hier noch das Image:

granim.png

Code: [AUSKLAPPEN]

Strict
Incbin "granim.png"
SeedRnd MilliSecs()

Graphics 800,600,0

Global ghostred:Timage=LoadAnimImage("granim.png",14,14,0,8)
If ghostred = Null Then DebugLog "ghostred kann nicht geladen werden" End

Global draw_last_pixel:Int

Local x = 400 ' startposition x
Local y = 100 ' startposition y
Local count = 0 ' zaehler framewechsel
Local timer = 0 ' zaehler zufallsrichtungsswechsel
Local rndirection = Rnd(4) ' zufallsrichtung
Local framegrr = 2 ' startframe ghostred rechts
Local framegrl = 0 ' startframe ghostred links
Local framegru = 4 ' startframe ghostred oben
Local framegrd = 6 ' startframe ghostred unten

Repeat     
   
   ' abfrage timer zufallsrichtungswechsel
   
   If timer = 50 rndirection = Rnd(4) timer = 0 Else
   SetColor 255,255,255
   
   ' zufallsrichtungen ghostred
               
   Select rndirection
      
   Case 0
   
   DrawImage(ghostred,x,y,framegrr)   
   If count = 9 count = 0 framegrr:+1
   If framegrr = 4 framegrr = 2
   count:+1
   x:+1
            
   Case 1   
   
   DrawImage(ghostred,x,y,framegrl)   
   If count = 9 count = 0 framegrl:+1
   If framegrl = 2 framegrl = 0
   count:+1
   x:-1
               
   Case 2
   
   DrawImage(ghostred,x,y,framegru)   
   If count = 9 count = 0 framegru:+1
   If framegru = 6 framegru = 4
   count:+1
   y:+1
                     
   Case 3   
   
   DrawImage(ghostred,x,y,framegrd)   
   If count = 9 count = 0 framegrd:+1
   If framegrd = 8 framegrd = 6
   count:+1
   y:-1
               
   End Select
      
   timer:+1
      
Flip
Cls

   ' labyrinth

   SetColor 0,100,200

   SetLineWidth(5)

   DrawRect(100,100,100,100)
   DrawRect(350,100,100,100)
   DrawRect(600,100,100,100)
   DrawRect(100,400,100,100)
   DrawRect(350,400,100,100)
   DrawRect(600,400,100,100)
   DrawLine(20,20,780,20,draw_last_pixel=True)
   DrawLine(20,580,780,580,draw_last_pixel=True)
   DrawLine(22,20,22,580,draw_last_pixel=True)
   DrawLine(777,580,777,20,draw_last_pixel=True)

Until KeyHit(key_escape)


Ich würde gerne die Farbe der Objekte im Labyrinth und den Aussenrand abfragen. Die Abfrage via Drawrect bzw. Drawline habe ich mittlerweile selbst herausgefunden. Es sollte so funktionieren, dass jede Art von Objekt ( Buchstabe, Linie, Oval, Rechteck ) aufgrund der Farbe erkannt werden kann und somit eine Kollision entsteht.

Parallel werde ich es natürlich selbst weiterhin versuchen. Sad

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragSo, Okt 30, 2005 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

nun habe ich heute wieder geschlagene 10 Stunden in dieses Problem investiert. Bin zwar noch Noob ... aber so langsam werde ich das Gefühl nicht mehr los, dass es in der aktuellen Blitzmax Version gar keine Abfragemöglichkeit ( ausser Pixmap Konvertierung ) von einer Koordinate direkt zur Farbe ( wie bereits beschrieben ) gibt. Anscheinend war das in Blitzbasic bzw. Blitz 2D noch ein bisschen komfortabler gelöst. Siehe Statement von Smiley. Wäre mit Sicherheit sehr hilfreich, wenn die Procoder auch bei Ratlosigkeit ein Statement schreiben würden. Dann wüsste man jedenfalls, wo man steht.

Gruss Oxcom ( gebe nicht auf )
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF
 

Dreamora

BeitragSo, Okt 30, 2005 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein es gibt auch keine andere Möglichkeit aktuell als ein Pixmap zu nutzen, da BlitzMax auf Kompatibilität und Crossplattform setzt.

Du kannst die Farbe eines Pixels jedoch mit einer 1x1 Pixmap abfragen, hat meines Wissens sogar hier drin in der BlitzMax Sektion den dafür notwendigen Code.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Oxcom

BeitragSo, Okt 30, 2005 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Bingo ! Dann bin ich ja glücklicherweise nicht so doof wie ich gedacht habe ! Deine Aussage hat mir jedenfalls schon sehr viel weitergeholfen. Ich glaube, ich hätte noch unzählige Stunden damit verschwendet. Nun weiss ich wenigstens wo ich ansetzen muss. Trotz allem ... meiner Meinung nach wäre so eine Abfrage für eine spieleorientierte Programmiersparache doch sinnvoll.

Viele Grüsse !

Oxcom ( der nun ins Bett geht )
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF

Oxcom

BeitragMo, Okt 31, 2005 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Du kannst die Farbe eines Pixels jedoch mit einer 1x1 Pixmap abfragen, hat meines Wissens sogar hier drin in der BlitzMax Sektion den dafür notwendigen Code.


Diese Lösung wäre vermutlich sehr performancebelastend. Werde nun mit Tiles arbeiten.

Gruss Oxcom
Apple Mac Mini 1.42 Ghz / 1 GB Ram / Samsung Syncmaster 930 BF
 

Dreamora

BeitragMo, Okt 31, 2005 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
In einer Steinzeitsprache die keine Grafikkarte kennt, wäre eine Pixelabfrage tatsächlich von bedeutung. Aber heutzutage speichert man Texturen (nicht mehr Bilder wie früher) möglichst nicht mehr im Systemspeicher aus Speedgründen.
Kollisionen werden heutzutage meist nur noch durch swept Polygon Kollision realisiert, nicht "extrem langsame" pixelbasierende Kollisionen.

Wenn du dennoch bei einem Bild einen speziellen Pixel abfragen willst, speicherst du dir am besten eine Kopie davon als Pixmap im Speicher, damit du direkt darauf zugreifen kannst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group