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

21.05.2011, 12:04

Der Wechsel zu den Pixeln

Hallo liebes Board,

ich habe bis jetzt einige Spiele programmiert. Dabei wären Tetris, Snake und Pong.
Damit ich mich halt in den Grundlagen festigen kann;) Ich denke ich beherrsche die Grundlagen nun doch recht gut.

Doch ich habe ein Problem. Bei all meinen Spielen habe ich eine Matrix verwendet, in der ich immer sagte:"Mach dieses Feld schwarz oder das Weiss". Dadurch sind die Bewegungen Ruckartig bzw. verschiebt sich ein "Feld" um mehrere Pixel.

Ich möchte mich aber jetzt gerne an einen Jump'n'Shoot Game wagen, doch wie bekomme ich schöne flüssige Bewegungen?
Klar ist, dass das sehr wahrscheinlich mit Pixelverschiebung funktioniert. Aber was ist wenn ich Flächen habe, in denen ich nicht hineinlaufen kann? Dazu müsste ich Pixelkollision programmieren, doch ich kann doch nicht für JEDE Fläche einen IF machen?

Auch habe ich sehr viel über Tile-Maps gelesen, doch was ist das genau und was macht das genau? Dient sie NUR der Darstellung der Map?

Arbeiten diese zwei Teile(Pixekollision und TileEngine) immer zusammen? Wie arbeiten sie zusammen?

Das was ich schon weiss:

- Meine Tilemap liegt in einem Array
- Zeichnen ist ja nicht schwer^^
- Jedes Tile bekommt eine Struktur mit der Position, Bild und ob es begehbar ist und genau hier komm ich nicht weiter xD

D.h. meine Konkrete Frage: Wie kommuniziert mein Spieler mit der Welt?:)

Ich hoffe ihr könntet mir meine Fragen beantworten:)

mfg timi19

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

21.05.2011, 12:28

3 Nützliche Links was Tile-Maps angeht:
#1
#2
#3
Danach solltest du aufgeklärt sein. :)

Btw: 600 \o/
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

21.05.2011, 12:57

Die Felder in Tetris und Snake sind Tiles. Wenn du das geschafft hast wirst du auch komplexere Tilemaps schaffen. Wie hast du das bei Pong gemacht? Da brauchst du doch eine flüssige Bewegung und Rechteck-Kreis Kollisionen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

21.05.2011, 13:31

Du nimmst einfach ein zweidimensionales Array. Als Indizes nimmst du die x und y Koordinaten, bzw kannst von Pixelkoordinaten auf die Indizes umrechnen. Einfach Koordinaten/Tilegröße=Index. Wenn du den Spieler bewegen willst prüfst du vorher, ob das Feld/die Felder die betreten werden dies auch zulassen, und keine Kollision vorhanden ist. Kannst du deiner Mapklasse einfach eine Funktion geben wie bool Collides(int x, int y). Wenn die Felder betretbar sind, dann bewegst du deinen Spieler halt. Eigentlich ein einfaches Prinzip. Du kannst natürlich anstatt eines zweidimensionalen Arrays auch ein eindimensionales nehmen, musst dann jedoch von beiden Koordinaten auf einen Index umrechnen. Index = y*breite+x, wobei x und y die Koordianten sind und breite die Breite deiner Karte.
„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.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

21.05.2011, 13:44

Dazu müsste ich Pixelkollision programmieren, doch ich kann doch nicht für JEDE Fläche einen IF machen?

Doch. Klar. Denn genau dafür gibt es Schleifen. Da reicht ein einziges IF im Code.
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]

Bas94

Frischling

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

6

22.05.2011, 19:41

für so ein jump 'n' shoot spiel würde ich vielleicht so rangehen dass ich erstmal eine Bitmap in paint oder ähnlcihes zeichne, die schwarze und weiße pixel enthält. Danach würde ich die welt in farbe designen.

Diese schwarzweißwelt wird dann dazu dienen herauszufinden wo boden und wo luft ist. du wirst ja dieses spiel sicherlich in 2d programmieren und in einer 2d seitenansicht.
da die figur springen soll muss ja auch eine funktion für die erdanziehung da sein .. diese funktion würde dann lediglich an der position wo sich der spieler befindet in der scharzweißbitmap schauen ob unterhalt boden ist oder nicht. wenn nicht dann wird der spieler halt eine einheit runtergesetzt.
und bei jeder anderen bewegungsrichtung schaut man halt ob dort luft(weißer pixel) oder boden(schwarzer pixel) ist.
der abtastbefehl wäre in etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
bool collision(double x, double y, int xricht, int yricht) 
 {
   if (SWBitmap[int(x)][int(y)]==255)
   {
    return true;
   }
    else
   {
    return false;
   }
 }


um das problem mit der flüssigkeit zu lösen würde ich vorschlagen, dass du eine schwarzweißbitmap erstellst die genauso groß ist wie die farbbitmap.
letztendlich hast du zB deine person die du spielst.. diese bewegst du nur auf und ab
die welt unten drunter bewegst du weiter auf dem bildschirm .. du zeigst also immer nu einen ausschnitt.. die Bitmap kannst du ja mit Verschiebungskoordinaten vom typ double versehen und sie zB mit 0.5 schritten bewegen. so springt das ganze pro frame ein pixel sodass es kaum zu bemerken ist
.. um die bmp zu zeichnen rundest du die verschiebungskoordinaten un ermittelst mit diesen deinen bmpausschnitt
(du musst dir allerdings noch einen kopf machen wie du zugriffe auf pixel vermeidest die außerhalb der bmp sind also nciht existieren)

den zähler(mit den koordinaten) für die verschiebung der bitmap kannst du dann mit der position des spielers addieren und in den kollisionsalgo reinwerfen.

hier eine kleine skizze zum verständnis:


Der rote bereich is der auf dem bildschirm zu sehende ausschnitt
die kreuze ist die spielerposition in den Bmp's
Murphys Gesetz gilt immer :!:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

22.05.2011, 20:36

Wieso belegst du 8Bit für Daten, die nur 1Bit benötigen?
Abgesehen davon brauch man das nur wenn man keine Tiles benutzt. Die Map also nicht aus "Bausteinen" zusammen baut, sondern z.b. komplett manuell zeichnet..

Wieso gibst du nicht gleich das Ergebnis der Bedingung zurück? ( return foo == 255; ) Wenn deine Verzweigung nicht vom Kompiler wegoptimiert wird ist es viel langsamer.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

22.05.2011, 20:44

Wieso belegst du 8Bit für Daten, die nur 1Bit benötigen?

Ansprechen voller Bytes geht schneller (man braucht keine SHIFTs oder ANDs) und Speicherknappheit ist vermutlich kein Argument. Allerdings stimme ich mit der Kürzung des IFs zu. Wird aber vermutlich durch einen Compiler eh wegoptimiert.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

22.05.2011, 20:48

Schon klar, aber diese Art von Bitmap ist unter umständen sehr, sehr groß. Da ist es eine überlegung Wert. Vermutlich greift man auch nicht sooo oft auf die Map zu und der Zugriff an sich ist auch relativ schnell.

edit: hast ja eigentlich nur die Frage beantwortet. xD Hab meinen Vorschlag wohl falsch formuliert.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (22.05.2011, 20:57)


Bas94

Frischling

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

10

22.05.2011, 22:22

ja das mit der if macht schon irgendwie sinn ^^
hatte aber grade bemerkt, dass ich sowieso die bewegungsrichtungsvariaben vergessen hab XD

C-/C++-Quelltext

1
bool collision(double x, double y, int xricht, int yricht) {  return SWBitmap[int(x+xricht)][int(y+yricht)]==255);}
Murphys Gesetz gilt immer :!:

Werbeanzeige