Autor Beitrag
discmix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 03.01.03 11:20 
Ich hab da mal ein Problem. Ich experimentiere nun seit ca. 2 Woche mit DelphiX. Für meine Idee (2D Game) eignet es sich sehr gut.

Nun bin ich an einem Punkt gelangt, an dem ich einfach Hilfe brauche. Folgende Situation: Ein Spielfeld mit weißen (1) und schwarzen (2) Steinen. Ich habe die Steine über eine Matrix mit SetMapSize(x,x) und Collisioned := True angelegt. Der Spieler bewegt ein Sprite (Größe: 20 x 20) von Start (S) zum Ziel (Z) über die weißen Steine. So weit so gut.

Berührt der Spiele einen schwarzen Stein, so fällt er „runter“ vom Spielfeld. Das mit der Kollisionsabfrage funktioniert auch. Nun soll das Sprite, das der Spieler über die Steine bewegt, nicht sofort bei der Berührung „runterfallen“, sondern erst wenn mindestens über die hälfte des Sprite den schwarzen Stein berührt. Also irgendwie eine Prüfung: Sprite ist 20x20 groß, berührt den schwarzen Stein aber nur bis 8 Pixel und geht wieder auf den weisen Stein und fällt somit nicht von seinem Weg herunter. Oder Sprite ist 20x20 groß, berührt den schwarzen Stein mit mehr als 10 Pixel und fällt nun herunter.

Wie kriege ich die Verzögerung bei der Spirtekollision hin? Oder gehe ich einen falschen Weg? Mache ich es mir zu kompliziert?

Danke für eure Hilfe
DiscMix
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Fr 03.01.03 14:10 
es wäre Hilfreich deinen Code für die Kollisionsabfrage zu sehen.
Ich würde das Zum Beispiel so machen:
a) Ich kenne die linke, obere Eckposition des Sprites
b) Ich kenne die Breite und Höhe des Sprites.

Normalerweise ist eine Kollision so:
ausblenden Quelltext
1:
2:
3:
if ((Sprite1.Left + 20) = Sprite2.Left) or (Sprite1.Top + 20) = Sprite2.Top) then
  Kollision := True;
end;

Ich weiß, das ist nur der Code dafür, wenn das erste Spriete zu nah an den linken oder oberen Rand vom zweiten Sprite kommt, verdeutlicht aber die Funktionsweise (hoffentlich :roll:).

So, mit 10 Pixeln mehr (also bis zur Hälfte) sieht's so aus:
ausblenden Quelltext
1:
2:
3:
if ((Sprite1.Left + 10) = Sprite2.Left) or (Sprite1.Top + 10) = Sprite2.Top) then
  Kollision := True;
end;

Das ganz noch übertragen auf rechts und unten, würde es schon bringen.
Sprite1.Left ist klar. So. 20 dazu, ist der rechte Rand. Wenn der gleich dem linken Rand des 2. Sprites ist, gibt's 'ne Kollision.
Addiert man nur 10, wäre es die Mitte des ersten Sprites (also bleiben auf der anderen Seite auch noch 10). Ist die Mitte des Ersten über dem Rand des zweiten, ist das Kollision. Dabei ist drauf zu achten, daß wenn die Mitte des ersten über dem Rand des zweiten ist, genau die Hälfte des ersten Sprites auf dem zweiten Sprite liegt. Also genau das, was du haben willst.

Wie deine Kollisionsabfrage aussieht weiß ich nicht, daher kann ich die auch nicht entsprechend modifizieren.

P.S.: Die oben genannte Funktion ist nicht unbedingt richtig. Zum einen ist das '=' in der IF-Abfrage durch entsprechende '<' oder '>' zu ersetzen, weil es sonst nur klappt, wenn es Position exakt stimmt, nicht wenn's drüber ist. Außerdem ist der Code nicht getstet, es könnten also noch weitere Fehler drin sein. Im Prinzip sollte es aber so oder so ähnlich (halt Bereichsabfrage, nicht Positionsabfrage) funktionieren. Wichtig ist die 10, die abgezogen, bzw dazugezählt wird.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
discmix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 10.01.03 10:04 
Vielen Dank,

ich habe dies jetzt aber anders gelösst.
Trotzdem danke für den Tip..