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

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

11

16.07.2012, 16:28

wie David schon angemerkt hatte, solltest du die Position für den Spieler ruhig als Fließkommazahl speichern und die Interpretation unabhängig von der Darstellung vornehmen
so zum Beispiel sollte die Position des Spielers, was David ja gesagt hat, nach Möglichkeit die Mitte seiner "Unterseite" darstellen
weiterhin wäre es sinnvoll, für den Spieler auch die Breite und Höhe zu speichern
und du solltest an keiner Stelle im Spiel (abgesehen von dem Teil, der die Spielszene darstellt) mit absoluten Pixelwerten hantieren (Positionen und Größen sollten beispielsweise "Feld"/"Blockbreite" als Einheit haben)
so wäre es später einfach möglich, eine Zoomfunktion o. ä. zu integrieren, ohne dass dies zu einem enormen Aufwand führen würde

nachfolgend noch 2 Dinge, über die du dir zwar schonmal Gedanken machen könntest, die dich allerdings nicht von einer Implementierung deiner bisherigen Idee abhalten

du solltest dir auch überlöegen, ob du ein Array hin und her reichen willst oder ob du dafür eine eigene Klasse implementierst
diese könnte dann noch diverse Funktionalität bereitstellen

und du wolltest überlegen, ob eine Blockart ihr Bild kennt, mit welchem sie gezeichnet wird
vlt. willst du später mal abhängig von den Benachbarten Blöcken einen Block anders darstellen (beispielsweise Dreck unterhalb einer freien Fläche ergibt Gras auf der Blockoberseite, während Dreck unter Dreck Dreck ergibt usw.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

16.07.2012, 18:41

Da nach Artikeln gefragt war:
Benötige Denkanstöße für 2D TileEngine Direkt mal ein schöner Thread aus diesem Forum.
http://www.virtual-maxim.de/pixelgenaue-kollisionserkennung/ nicht unbedingt jetzt, aber vllt. mal für später interessant.
http://www.virtual-maxim.de/tilemap-1/
http://www.tonypa.pri.ee/tbw/start.html
Vllt. ein wenig zu Tiled:
http://www.mapeditor.org/
http://www.nekura.net/programmierung/til…bung-mit-tiled/
ein wenig Eigenwerbung auch mal: http://blog.rswhite.de/archives/14 (auch wenns D ist)

Und wenn du irgendwann Wegfindung auf deinem Grid brauchst: http://theory.stanford.edu/~amitp/GamePr…parison.html#S3
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

pFreak

Frischling

  • »pFreak« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Essen

Beruf: Ausbildung zum Fachinformaiker (Anwendungsentwicklung)

  • Private Nachricht senden

13

16.07.2012, 18:56

Hallo Sacaldur,
vielen Dank für deine Tipps.

Da ich schon frühere einmal einen Prototypen entworfen hatte, habe ich die meisten Bedenken/Tipps deinerseits schon implementiert, weil ich auf genau dieselben Dinge gestoßen bin. Ein paar hatte ich aber noch nicht bedacht und werde diese in meine Überlegungen aufnehmen.


Nach ein wenig coden bin ich nun zu dem Teil der Physik/Schwerkraft gekommen. Dieser hat mir immer am meisten Probleme bereitet, weil es hier wirklich schon etwas kniffliger wird.

Ich hatte beispielsweise den Sprung damals so umgesetzt:

Der Spieler hat eine boolean-Variable mit dem Namen 'jump' welche definiert, ob er sich momentan in der Sprungphase ist. Des weiteren hat er eine "currentJump" und eine "maxJump"-Variable, die angibt, wie hoch er springen kann und wie weit er bereits gesprungen ist. Durch einen gewissen "jumpSpeed" wird definiert, wie hoch er pro Berechnung sich nach oben bewegt.
Bei betätigen der Sprung-Taste wird die jump-Variable auf true gesetzt und der Spieler hebt um seinen "jumpSpeed" vom Boden ab. Dieser Wert wird in "currentJump" gespeichert. Bei jedem Aufruf des Berechnungs-Threads bewegt er sich weiter nach oben und sein "currentJump" erhöht sich. Das ganze geht solange, bis er seinen "maxJump" erreicht hat. Danach wird "currentJump" wieder auf 0 gesetzt und "jump" auf false. Somit fällt er ganz normal runter.
Ich habe das damals so implementiert, fand es aber nie schön und wollte es eigentlich anders lösen. Mir fällt allerdings kein gescheiter Lösungsansatz ein.


Außerdem habe ich noch einen Punkt, der mir Bauchschmerzen bereitet:
Ich möchte, dass meine Blöcke fallen. Das Problem ist, dass sie sich in dieser Matrix befinden (array[x][y]). Somit kann ich meine Blöcke nur ganze Schritte nach unten bewegen, was sehr hässlich aussieht.
Ich habe mich damals von Minecraft inspirieren lassen:
Hier ist es so, dass ein fallender Block eine Animationsphase hat, in der er einen Block nach unten fällt.
Erst wenn er an der Position des nächsten Blocks angekommen ist, wird berechnet und der Rest über ihm fällt runter.
Soweit keine schlechte Idee, allerdings sieht das in einem 2D-Spiel nicht so klasse aus, wenn der Spieler in der Luft steht, wenn der Block (auf dem er steht) fällt und er danach (sobald der Block eine Ebene tiefer angekommen ist) auf einmal mit dem Fallen beginnt. Ich musste also umdenken und habe das so implementiert, dass der Player sich dann AUCH in einer Animationsphase befindet und somit auch sich mit nach unten verschiebt. Allerdings traten dadurch eine ganze Menge Probleme auf, die mir dann irgendwann den Spaß geraubt haben, weil es mir zu hässlich wurde.



Jemand eine Idee, wie man DAS gut umsetzt? :)


Ich hoffe, ich konnte das einigermaßen erklären. Echt schwierig, dass nur mit Worten zu umschreiben.

@Architekt: Auch dir ein herzliches Dankeschön für die Links.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

16.07.2012, 19:01

Lass dich hiervon inspirieren, sowohl Springen als auch fallen:
http://www.tonypa.pri.ee/tbw/tut07.html
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

16.07.2012, 20:37

Außerdem habe ich noch einen Punkt, der mir Bauchschmerzen bereitet:
(...)
Jemand eine Idee, wie man DAS gut umsetzt? :)

Ja, genau das habe ich für mein Spiel Blocks 5 gemacht.
Wenn dort ein Stapel Blöcke fällt, fallen sie alle gleichzeitig und es wird eine Animation "vorgetäuscht", obwohl die Objekte eigentlich immer nur an ganzzahligen Koordinaten sind.
Gelöst habe ich es wie folgt: Jedes Objekt hat "logische Koordinaten" und "visuelle Koordinaten". Die logischen sind immer ganzzahlig. Die visuellen sind floats und bestimmen, wo das Objekt angezeigt wird. Wenn der Block nun fällt, dann ändere ich schlagartig seine logischen Koordinaten. Die visuellen Koordinaten werden den logischen langsam angepasst, und zwar so schnell, dass insgesamt eine einigermaßen fließende Animation entsteht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

16.07.2012, 21:56

Sehr interessantes Konzept, bei mir ist es genau andersrum.
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]

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

17

17.07.2012, 10:06

Ich habe es für einen Prototypen ähnlich wie David gelöst: http://www.the-exire.net/app/minerush/ (Benötigt Flash)

Wenn das Tile nicht an seiner richtigen Position steht (also x*Tilegrösse;y*Tilegrösse), einfach die Werte langsam anpassen.

Werbeanzeige