Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.04.2013, 18:40

Kollisions fehler?

Hay,

ich versuche in XNA meine Rectangles in einer Foreach-Schleife mit 'cursRec' Kollidieren zu lassen, aber es funktioniert nur bei dem letzten (mr500)..

Hier mal mein Code:

C#-Quelltext

1
            List<Rectangle> mRecs = new List<Rectangle>(); 

C#-Quelltext

1
mRecs.Add(mr0); mRecs.Add(mr1); mRecs.Add(mr2); mRecs.Add(mr3); //...

C#-Quelltext

1
foreach (Rectangle r in mRecs) {  if (cursRec.Y + cursRec.Height < r.Y ) nobottom = true;                        else nobottom = false;  } 

Weiss jemand wie es für alle geht, oder besser eine andere Methode für die Kollision?

MfG
BlackS

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

14.04.2013, 18:53

mr500? Du hast hoffentlich nicht 501 einzelne Variablen, oder?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

14.04.2013, 18:53

Ein Rectangle bei XNA hat schon eine Methode. Intersects heißts da glaube. Einfach mal bei MSDN nachgucken. Ansonsten prüfst du doch bei dir keine wirkliche Kollision. In deinem Fall überprüfst du ob die untere Kante von cursRec über den einzelnen Rechtecken r ist. Und der Wert den du manipulierst ist global. Das heißt, du änderst ihn für jedes Rechteck neu. So hast du am Ende natürlich nur die letzte Änderung, welche immer die deines letzten Rechteckes ist. Entweder musst du ab einer bestimmten Bedingung abbrechen, wie zum Beispiel, sobald auch nur eine einzige Kollision gefunden wurde, setze den Boolwert und breche die Schleife ab. Wenn du die Kollision für jedes Objekt einzeln merken musst (willst, dann musst du dein Konzept ändern). Vermutlich ist das aber nicht mal gewollt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

4

14.04.2013, 19:25

@Blue Doch, hab ich :D

@Schorsch Intersects ist aber für einen Character ungeeignet.. Ich will ja auch zur Seite laufen können, also muss ich für jede Seite ne Abfrage haben.. Damit das die Abfrage gestoppt wird funkt es so grob.. Also 1 Kollision geht, aber wenn ich das Rectangle verschiebe soll der Spieler weiter nach unten fallen. Wie mache ich das? Habe die Abfrage so geändert:


C#-Quelltext

1
2
3
4
5
6
7
8
9
foreach (Rectangle r in mRecs)
{
if (cursRec.Y + cursRec.Height < r.Y && colC == true) nobottom = true;
else
{
nobottom = false;
colC = false;
}
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

14.04.2013, 19:27

Warum hast Du 500 Variablen? Um Gottes Willen!
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

14.04.2013, 19:30

@Blue Doch, hab ich :D
Ein passendes Beispiel fuer das was ich letztens hier sagte: Doppelter Pointer in manchen Programmen ;-)

7

14.04.2013, 23:36

Die 500 Variablen werden nicht immer komplett genutzt. Es soll einen Map Editor geben und die Variablen die in der Datei angegeben werden werden genutzt.. Ich weiß es ist schlecht und sobald ich eine andere Idee habe werd ich es umschreiben aber die Kollision muss es ja trotzdem geben.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

14.04.2013, 23:52

Es gibt sowas wie Arrays oder Listen ...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

15.04.2013, 11:53

Benutzt er doch?
Hier mal mein Code:


C#-Quelltext
1
List<Rectangle> mRecs = new List<Rectangle>();


C#-Quelltext
1
mRecs.Add(mr0); mRecs.Add(mr1); mRecs.Add(mr2); mRecs.Add(mr3); //...


C#-Quelltext
1
foreach (Rectangle r in mRecs) { if (cursRec.Y + cursRec.Height < r.Y ) nobottom = true; else nobottom = false; }


Du könntest dabei jetzt anfangen deine Daten in einer Schleife zu generieren oder aus einer Datei zu lesen falls das so ohne weiteres Möglich ist.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige