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

15.04.2011, 08:54

problem mit xna und tilemap

hallo leute.

ich hab mich mal ein bisschen mit tilemaps gespielt. vom prinzip her ja wirklich total einfach zu verstehen und umzusetzen.

Jetzt hab ich eine int[,] tilemap...
das problem is die collisionserkennung.

ich berechne mir in einer funktion die nächste position des spielers und schau ob er wo ankommt oder nicht.
das funktioniert prinzipell schon, aber es is a bissal ungenau.

teilweise hab ich halt 3,4 pixel zwischen boden und spieler frei und das schau halt nicht so gut aus...
ich hab halt members wie char_speed und gravity und so weiter, die alle floats sind.

jetzt bin ich mir sicher,dass ich meine paar fehlenden pixel bei der umrechnung von floats in ints verliere.


kann mir da jemand helfen, wie ich das am besten löse? mit fällt gerade nix ein

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

15.04.2011, 10:20

jetzt bin ich mir sicher,dass ich meine paar fehlenden pixel bei der umrechnung von floats in ints verliere.

Wie kommst du zu dem Schluss? Was treibst du denn da dass Rundungsfehler sowas ausmachen können!?

3

15.04.2011, 14:26

naja... meine spielfigur hat 30x30 pixel. und der punkt links oben is die koordinate von der es ausgeht.
Jetzt berechne ich eine kollision mit der unterseite meiner figur in dem ich vom linken oberen punkt einfach 30 dazuzähle...
das sollt doch passen oder?

so scheit mein aufruf auf:

C-/C++-Quelltext

1
2
if (!checkCollision(gameTime, null, true) && jumping == false)
                char_pos_.Y += (float)gravity_ * gameTime.ElapsedGameTime.Milliseconds;

und so der check auf kollision

C-/C++-Quelltext

1
2
3
4
5
6
 col = ((int)(Y + (float)gravity_ * time.ElapsedGameTime.Milliseconds) / tilesize);
                int check1 = (map[col, (int)X / tilesize]);
                int check2 = (map[col, (int)(X + charsize / tilesize]);
                if (not_walkable.Contains(check1)||
                    not_walkable.Contains(check2))
                    return true;

4

15.04.2011, 16:38

kann es sein dass du bei

C#-Quelltext

1
2
 int check1 = (map[col, (int)X / tilesize]);
        int check2 = (map[col, (int)(X + charsize / tilesize]);

etwas falsch berechnest?

c# kennt nämlich die punkt-vor-strich-rechnung:

C#-Quelltext

1
2
        Console.WriteLine(5+5/5);   //=6
        Console.WriteLine((5+5)/5); //=2


dadurch kann das ergebnis stark abgefälscht werden wenn du bei stadt

C#-Quelltext

1
X + charsize / tilesize]

C#-Quelltext

1
(X + charsize) / tilesize]
verwenden musst

Zitat

Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.

5

15.04.2011, 20:13

sry.... hab den fehler nicht gesehen... nein... die klammer hab ich da schon. hab nur der einfachheit halber im code oben in der funktion x,y + width und das wollt ich mir im posting sparen. denn eigentlich habe ich da ein richtungsabhängiges -widh weil ich ja teilweise schon die linke seite brauche...

also... sry... aber daran liegts nicht...
ich denke halt dass es irgendeine casting geschichte is, weil ich in der checkCollision funktion die größe des spieler +5 rechnen kann und da ändert sich nix. wenn ich dann aber +6 hinschreiben, dann steht er im boden... also dachte ich das riecht stark nach rundungsfehlern...

lg

6

15.04.2011, 20:33

dann probiers mal mit

C#-Quelltext

1
col = ((int)Math.round((Y + (float)gravity_ * time.ElapsedGameTime.Milliseconds) / tilesize));

dadurch wird es nicht immer abgerundet sondern aufs nähere gerundet
vll kommst du dann deinen ergebnis etwas näher

Zitat

Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.

7

16.04.2011, 12:09

mh... danke... werd ich gleich mal einbauen und schaun was rauskommt...

lg

Werbeanzeige

Ähnliche Themen