Kollisionen [ehem. "Spiegeln?"]

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Janiboy
Beiträge: 71
Registriert: 02.01.2005 15:22

Beitrag von Janiboy »

So, hab mal alles geändert, aber ein Fehler steckt noch drin, ich hab dir den Code mal geschickt (Gibt man die Höhe und Breite des gesamten Bildes an wenn noch nichts transparent ist oder nur die Höhe und Breite des tatsächlich angezeigten Bildes?)

Gruß,
Janiboy
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> ich hab dir den Code mal geschickt
wo?


> Gibt man die Höhe und Breite des gesamten Bildes an wenn noch nichts transparent ist oder nur die Höhe und Breite des tatsächlich angezeigten Bildes?

ehm?

du meinst, wenn das sprite nen transparenten rand hat?

das ist eben der vorteil:
bei dieser proc kannst du die koordinaten so angeben, dass du nen transparenten rand abziehen kannst.

natürlich musst du dann auch ne dementsprechend größere X-Pos und Y-Pos angeben.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Janiboy
Beiträge: 71
Registriert: 02.01.2005 15:22

Beitrag von Janiboy »

so, hab ne pn geschrieben mit dem quellcode.

Gruß,
Janiboy
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, habn jetzt...

bevor ich mir das genau ansehe, fällt mir erstmal ein bisschen was auf:

1) procedures müssen VOR dem hauptcode stehen
2) repeat-forever is nich so dolle... mach lieber

Code: Alles auswählen

Until EXIT = 1
und ersetz in der Escape-Abfrage das End durch EXIT = 1
3) das sprite-laden zu testen ist gut, aber bringt nur dann wirklich was, wenn du auch drauf reagierst...
4) wenn du für alle die gleiche transparenzfarbe hast, kannst du auch VOR den Load-Befehlen einfach

Code: Alles auswählen

TransparentSpriteColor(-1, 255, 255, 0) 
schreiben

so.. hab mir den rest auch angesehen...
was für ein fehler tritt denn auf?

ach... btw... wenn du deine sprite-files einfach "sprite001"-"sprite025" nennst,
kannst du die auch in ner schleife laden... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Janiboy
Beiträge: 71
Registriert: 02.01.2005 15:22

Beitrag von Janiboy »

Hab jetzt mal umgebastelt, sieht dann so aus:

Code: Alles auswählen

If KG_SpriteCollision( 0, 5, 100, 300, 300, -5, 100, 300 ) 
   MessageRequester("Kollision","Es fand eine Kollision statt ",0) 
    EndIf 
0, 5 ist startpunkt der figur
300, -5 ist startpunkt des gegners

Nun geschieht aber nichts, warum?

Hatte am Anfang

Code: Alles auswählen

If KG_SpriteCollision( 0, 5, 100, 300, 0, 5, 100, 300 ) 
aber da die koordinaten ja gleich waren wurde sofort bei programmstart eine kollision gemeldet.

Wie gekommt man denn den befehl so flexibel, dass es egal ist, wo die sich treffen bzw. dass eine Reaktion stattfinden wenn die Sprites in der Bildmitte kolllidieren?

Gruß,
Janiboy
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

mach das doch einfach separat. ob sie kollidieren ist eine sache. und ob sie sich in der bildmitte befinden (was immer du unter bildmitte verstehst..) ist eine ander sache.

Code: Alles auswählen

If KG_SpriteCollision( 0, 5, 100, 300, 300, -5, 100, 300 )
  If inBildmitte(0, 5, 100, 300) Or inBildmitte(300, -5, 100, 300)
    ;kollision, wobei sich eines der sprites in der bildmitte befindet
  Else
    ;kollision, irgendwo ringsrum
  EndIf
EndIf
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@#NULL

nein, absolut nicht. >__<

die kollision wird daraus ermittelt, wo sich die "testblöcke" momentan befinden.
es ist nichts weiter als eine prüfung, ob die beiden rechtecke sich überschneiden.

das ganze ist nur dann sinnvoll, wenn du Variablen einsetzt.
wenn du feste zahlen einsetzt, ist es blödsinn, weil das sieht man beim programmieren ob die gleich sind.

eine breite von 100 und eine höhe von 300 ist sowieso reichlich groß,
wieso sollte bei so riesigen blocks eine kollision interessieren?
ist deine figur wirklich 100x300 pixel groß? :?

so passts vielleicht eher:

Code: Alles auswählen

If KG_SpriteCollision( Figur_X, Figur_Y, Figur_Breite, Figur_Hoehe, Gegner_X, Gegner_Y, Gegner_Breite, Gegner_Hoehe ) 
wobei du Breite und Höhe der sprites am anfang direkt nach dem laden ermitteln kannst,
aber die Position der Sprites sollte sich ja dauernd ändern,
also musst du auch immer die aktuellen werte prüfen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ja, mit konstanten ist mein beispiel irgendwie doof, das stimmt.

ich wollte eigentlich nur sagen, das man Kollision_? und Position_? eher getrennt untersuchen, und die ergebnisse dann nach bedarf kombinieren sollte.

aber ich weiß auch nicht ganz was Janiboy mit bildschrimmitte meint, und ich hab den thread auch nicht ganz verfolgt..
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das hättest du vielleicht sollen... ;)

meine Kollisionsroutine ist eine reine positionsabfrage....

also, eine extra-positionsprüfung kann man sich schenken,
so aufwendig ist die proc nicht,
dass man sie nicht hundert mal pro frame durchhangeln könnte... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ja, das is schon klar. ich wollte darauf hinaus:
"bzw. dass eine Reaktion stattfinden wenn die Sprites in der Bildmitte kolllidieren?"

ich dachte, er will auch wissen, in welchem bereich des screens die kollision stattfindet, also zb rechts von der mitte, links, oberhalb, oder so.
beispiel: "Chemie-Game".
3 verschiedene substanzen können zusammen reagieren und explodieren. eine davon ist in in einem kleinen bereich in der mitte des bildschrims fixiert. eine explosion findet also nur statt, wenn die beiden beweglichen substanzen kollidieren UND sich in dem bereich befinden.

..aber ich spekuliere euren thread voll, sorry 8)
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten