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

13.02.2010, 11:30

Snake - wie sollte man die Schlange am besten darstellen?

Hallo zusammen,

ich sitze im Moment an einem Snake, meinem ersten größeren Projekt. Grafik mache ich mit DirectX 9. Hier ein Screenshot, noch mit einem Platzhalter-Level: http://i.imagehost.org/0243/SnakeScreenshot.jpg

Mit der Darstellung der Schlange bin ich allerdings nicht wirklich zufrieden. Die Schlange besteht aus einzelnen Punkten, deren Positionen in einem std::vector gespeichert werden und pro Frame aktualisiert und dann gezeichnet werden. Das hat mehrere Nachteile:
- obwohl die "Schlangenpunkt-Grafik" nur aus schwarzen und transparenten Pixeln besteht, sieht man graue Ränder. Keine Ahnung, warum das so ist. Hier der Link, falls jemand die png-Datei prüfen möchte: http://f.imagehost.org/0382/SnakePointPng.png
- Die Position des nächsten Schlangenpunktes wird durch Position += Bewegungsvektor*ZeitSeitLetzterAktualisierung errechnet. Wenn aber durch irgendeinen Hintergrundtask mein Netbook-Prozessor kurz beschäftigt ist und die Zeit seit der letzten Aktualisierung deshalb größer wird, bemerkt man sofort einen Sprung in der Schlange.
- je länger die Schlange wird, desto mehr Punkte müssen in jedem Durchgang gerendert werden, was zumindest auf meinem System zu spüren ist.

Mir ist bis jetzt einfach keine bessere Möglichkeit eingefallen bzw. bei google über den Weg gelaufen. Der Ansatz hier http://spieleprogrammierer.de/phpBB2/vie…php?p=2109#2109 bringt imho auch keine Verbesserung, da ich immer noch eine große Menge an Punkten anzeigen und den ersten Punkt oft aktualisieren müsste.
Auch die Schlange aus größeren Teilen zusammenzusetzen geht imho nicht, weil dann die Kurven nicht mehr wirklich rund aussehen...

Deshalb meine Frage: Hat jemand einen guten Vorschlag für mich, wie ich eine flüssige, runde Bewegung in die Schlange bringen könnte, die möglichst von Hintergrundtasks unabhängig ist? Und die evtl sogar so performant ist, dass mein System damit zurechtkommt (oder kann ich das auf meinem Netbook mit Grafikchip vergessen?)?

Vielen Dank für eure Antworten!
PPretzel

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

13.02.2010, 11:56

Hi,

die grauen Ränder können entstehen wenn der Punkt gestreckt wird, weil dann zwischen den Farbpunkten interpoliert wird. Das Problem mit den größeren Zeitsprüngen kannst du verhindern, indem du einfach einen maximalen Wert für die vergangene Zeit festlegst, z.B. eine Viertelsekunde. Für die Verwaltung der Schlangenpunkte bietet sich vielleicht eine Liste an: Da kannst du das Ende entfernen, für dieses Element die neue Position berechnen, vorne anfügen und anschließend alle Elemente zeichnen. Vielleicht hilft das ja.

Gruß

3

13.02.2010, 12:23

Zitat von »"rewb0rn"«


die grauen Ränder können entstehen wenn der Punkt gestreckt wird, weil dann zwischen den Farbpunkten interpoliert wird.


Aber wie kann das passieren? Ich hab die oben verlinkte png-Datei mit 16x16 px, die lade ich mit CreateTextureFromFile und zeichne sie mit LPD3DXSPRITE->Draw(pSnakePointTexture, NULL, &Center, &Tmp, 0xFFFFFFFF). Bildschirmauflösung ist 1024x600.
Wo könnte da etwas gestreckt werden?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

13.02.2010, 13:07

Schalt mal jeglichen Texturfilter aus (Nach dem Sprite->Begin()), vermutlich werden die Ränder dann weg sein. Wenn dem so ist, dürfte es sich um einen Bug in ID3DXSprite handeln, ich dachte zwar dass der eigentlich schon seit langem behoben sein sollte, aber wer weiß: http://www.gamedev.net/reference/programming/features/d3dsprite/

Wie in dem Artikel steht kannst du auch schnell mal versuchen ob die Ränder verschwinden wenn du deinem Bild links und unten einen 1 Pixel Rand verpasst (also 17x17 machen).

5

13.02.2010, 14:59

danke, dot, die Vergrößerung um einen Pixel hat die Ränder beseitigt!!

Das versöhnt mich jetzt auch mit den anderen Nachteilen.. Die Beschränkung der Zeit seit dem letzten Update werd ich mal ausprobieren.

Danke für eure Hilfe!
PPretzel

Werbeanzeige