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

27.04.2011, 20:44

tilebased side scroller

ich habe mal angefangen mich so mit tilebased maps und sidescrollen herumzuspielen.

im prinzip is es so ich hab eine map die NxN tiles groß ist.
und zeichnen tu ich immer 16x12.

wenn ich jetzt mit der figur in der mitte des screens bin, dann scroll ich die map in die "falsche " richtung und die person bleibt stehn.
im prinzip geht das schon nicht so schlecht aber jetzt kommt mein problem:
ich kann immer nur um 1 tile scrollen.

ich lauf eben in meiner render-schleife ein map int array durch und zeichne eben den gewünshten ausschnitt (abhängig vom offset um den die map schon verschoben is...)

nur möcht ich eben haben dass ich auch kleinere einheiten scrollen kann als immer ein 30x30 großes tile.
wenn man schnell läuft fallt es kaum auf, aber bei "gehen" sieht es halt rucklig aus...

versteht ihr was ich meine?

lg Aly

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

2

27.04.2011, 20:55

Benutzt du C# und XNA dafür? Wenn ja kannst du einfach eine Transformationsmatrix an spriteBatch.Begin() übergeben. Falls du auch noch ein Beispiel für einen Side Scroller suchst hab ich hier noch ein Link:
http://msdn.microsoft.com/en-us/library/…udio.31%29.aspx
Für das Prinzip des Scrollens:
http://msdn.microsoft.com/en-us/library/…udio.31%29.aspx

3

27.04.2011, 21:00

sry... ganz vergessen.

ja, ich verwende XNA.

mh.... du meinst also ich zeichne immer die ganze map und wende eine translationsmatrix an um sie mir in die mitte des screens zu schieben?

dann muss ich mir überlegen wie ich das mit dem spieler mache und der collisionserkennung. weil jetzt rechne ich den verschiebungsoffset zur position des spielers dazu... dann müsst ich halt seine aktuellen coords auch mit der gleichen matrix verschieben, dass ich wieder bei der richtigen position bin...

hast du das so gemeint? oder hab ich dich falsch verstanden?

btw: weiß jemand wie ich mir in xna einen vector2 aus integers mache. ich finde da irgendwie nix nur möcht ich mir die casts sparen, da ich alles (zumindest bei der jetzigen implementation) mit integers berechne

lg

4

27.04.2011, 21:34

ok... super danke!

lg

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

5

27.04.2011, 21:56

Für den Anfang kannst du die ganze map zeichnen, später solltest du aber nur den sichtbaren Bereich rendern. Die Translationsmatrix dient halt dazu den richtigen Ausschnitt zu rendern. Dabei kannst du die map auch flüssig scrollen (solange du für die Positionen ints benutzt, denn bei floats kann es zu Rundungsfehlern kommen). Die Spielerposition musst du dann natürlich auch noch transformieren um die kollision zu berechnen. Also im Prinzip genau wie du gesagt hast.

Das Einzige was dem Vektor ähnelt und mit int ist, ist Point. Der bietet sich dann aber eigentlich nur für Positionen an. Ansonsten halt selber schreiben.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Phalax« (27.04.2011, 22:02)


6

27.04.2011, 22:03

jetzt hab ich nur eine frage.

naja aber ganz um floats werd ich ja wohl nicht rumkommen oder?

wenn ich jetzt den spieler in einem frame um "speed * milliseconds" verschiebe und speed ja ein float is....

das rundungsproblem hatte /habe ich jetzt bei der kollisionserkennung, weil ich eben 0.2f als bewegungsgeschwindigkeit für den spieler habe. das gleiche mit hüpfen und gravity (0.4f)...

lg

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

7

27.04.2011, 22:06

Dafür bieten sich floats an das stimmt. Aber wie kann es denn bei der Kollisionserkennung zu Rundungsfehlern kommen? Wie funktioniert sie denn? Mit Rects?

Wichtig ist halt, dass du zwar die Positionen mit floats berechnen kannst, aber beim rendern die Positionen in ints konvertieren solltest.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Phalax« (27.04.2011, 22:14)


8

27.04.2011, 22:38

naja meine kollisionserkennung lauft so dass ich schau wo der spieler steht und bevor er sich bewegt schau ich ob seine zuküftige position an einer stelle in der map is wo sie nicht sein darf...

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

9

27.04.2011, 22:45

Achso ok. Aber was genau funktioniert denn dann nicht?

10

28.04.2011, 08:16

naja... die kollisionserkennung funktioniert eh halbwegs.
aber der spieler hat ca 1,2 pixel zwischen sich und dem boden, die ich nicht wegbekomme. wenn ich die spierposition um 1,2 int nach unten versetze steht er halb im boden und lasst sich dann auch nicht mehr bewegen.

außerdem kann sein, dass mal ein gröberer abstand zwischen dem spieler und der mauer is, wenn er reinläuft.

aber ich hab bis jetzt eher spaghetticode produziert nur um ein bisschen herumzuspielen.
werd das ganze jetzt dann mal (mit dem neu gewonnenen wissen) refactoren und schaun ob dann noch immer solche fehler auftreten.

ich danke dir auf jeden fall für deine links( die sind echt hilfreich) und für deine tipps.

lg

Werbeanzeige