JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=85629b87854b9311cf5956edd46801aeMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Frage zu BreakOut Spiel Programmierung
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
marco93
Mini JLI'ler



Anmeldedatum: 03.08.2006
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 08:51    Titel: Frage zu BreakOut Spiel Programmierung Antworten mit Zitat

Guten Tag,
ich habe eine Frage zu der Programmierung von sogenannten "BreakOut" Spielen oder so ähnlich (Man hat einen Bat und einen Ball, der nicht nach unten verloren gehen darf und der Ball zerstört die Bricks)

Meine Frage ist: Soll ich jeden Brick (jeden Stein) als einzelnen Sprite darstellen? Dann hätte ich ja bei 10 Bricks schon einen laangen Code! Und das erst bei 50 Steinen udn mehr???

Es wäre schön wenn ihr mir ein kleines Tutorial schreiben könntet.


Marco
_________________
Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX

Programmiert Spiel: BreakOut Game


Zuletzt bearbeitet von marco93 am 03.08.2006, 11:56, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 10:04    Titel: Re: Frage zu BreakOut Spiel Programmierung Antworten mit Zitat

Herzlich Willkommen im JLI erstmal

marco93 hat Folgendes geschrieben:

Meine Frage ist: Soll ich jeden Brick (jeden Stein) als einzelnen Sprite darstellen? Dann hätte ich ja bei 10 Bricks schon einen laangen Code! Und das erst bei 50 Steinen udn mehr???

nun ja, so lang wird der COde net, sowas stellt man dan in for-Schleifen dar. d.h., du musst net jeden Sprite einzeln erstellen. Ne andere Möglichkeit ist, dass du nur einen Block-Sprite hast, und ein Array von Daten jedes einzelnen Blocks. Dann könntest du den Sprite jedes mal an der richtigen Stelle rendern; d.h. es sieht so aus als ob jeder block ein einzelner sprite ist, in wirklichteit ist das nur eine Ansammlung von Daten, die durch ein und dieselbe Textur nur immer an anderen Plätzen gerendert wird.

marco93 hat Folgendes geschrieben:

Es wäre schön wenn ihr mir ein kleines Tutorial schreiben könntet.

hmm, ich glaub da suchst du mal bei Google, da findest du bestimmt was. Oder irgendeiner hier aus der Community, der selber schon ma sowas gemacht hat, könnte dir seine Hilfe anbieten.

Gruß DXer


Zuletzt bearbeitet von DirectXer am 03.08.2006, 10:07, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 10:06    Titel: Antworten mit Zitat

Ein Brick ist ein Objekt, welches unter Anderem ein Sprite-Objekt besitzen sollte, über welches gerendert wird. Die Bricks könnte man beispielsweise in ein 2D-Array packen, welches 2 Schleifen in der Main-Loop durchgehen und die einzelnen Sprites der Bricks rendern. Alles klar? ;)

Edit: Patrick hatte mal ein Tutorial über das Programmieren eines Breakout-Clones geschrieben, ist aber eventuell nicht ganz einfach zu verstehen... ;)
Unter "Funny Break" findest du die:
http://old.germangamedev.de/index.php?site=article
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 10:26    Titel: Antworten mit Zitat

Du könntest die Bricks ja auch in einer Schleife zeichnen.
Für jeden Bricktyp (Farbe und Konsistenz) machst du ein Sprite.

In einer Matrix könntest du dann den Aufbau des Spielfeldes speichern.
Code:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 3 3 3 3 3 3 1 1 1 0 0
0 0 0 1 1 1 2 2 2 2 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0

Diese Matrix enthält die Beschreibung für das Spielfeld. Angenommen dein Spielfeld kann in der Breite 16 Bricks aufnehmen.
Dann steht 0 für: kein Brick (frei)
1: Bricktyp1 (z.B Grün)
2: Bricktyp2 (z.B Gelb)
3. Brycktyp3 (z.B Rot)

Diese Matrix könntest du in ein int-Array aufnehmen.
Das sähe dann so aus:
CPP:
// Deklaration
int spielfeld[16][16] = {
                     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},     // Reihe 0
                     {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},      // Reihe 1
                     {0, 0, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 0, 0}     // Reihe 2
                     /* ... usw .... */
};

Und zeichnen könntest du es so:
CPP:
for(i = 0; i < 16; i++)
{
   for(j = 0; j <16;j++)
   {
      // zeichne Spritetyp spielfeld[i][j]
      // an Position x = i * Brickbreite und y = j * Brickhöhe
   }
}

Hoffe du hast das Prinzip verstanden.

Gruß KI
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 10:41    Titel: Antworten mit Zitat

Ein Tutorial wird dir hier bestimmt so schnell keiner schreiben, aber ne kurze Antwort ist wie du siehst drinn. (Auch wir haben nicht unendlich viel Zeit)

Also, normalerweise sollte im JLI Buch in den hinteren Beispielen sowas in der Art sein, dass man eine beliebige Anzahl von Objekten hat.
Meistens benutzt man für soetwas ein STL-Kontainer um die Variable Anzahl von Objekten zu speichern.
Der Ansatz auf den man als erstes normalerweise kommt, nämlich eben jedne Block einzelnt einzuprogrammieren geht zwar für den allerersten Anfang, aber dann muss man versuchen, Objekte wie zum Beispeil die Steine zu gruppieren, sodass man mit realtvi wenig Code eine vollkommen beliebige Anzahl Objekte verwalten kann. Und genau dafür sind Schleifen wie oben schon erwähnt perfekt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 11:22    Titel: Antworten mit Zitat

hab grad aufm ZFX-Board (eigentlich ja unser "Konkurent" Twisted Evil ) ein komplettes Breakout-Tutorial gefunden. Kannst du dir ja ma angucken:

http://www.zfx.info/Tutorials.php?ID=67

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
marco93
Mini JLI'ler



Anmeldedatum: 03.08.2006
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 11:56    Titel: Antworten mit Zitat

Hi,
erstmal danke für eure Antworten.
Zu der Idee von KI: Ich glaube so mach ichs! Das passt dann auch gleich mit dem Leveleditor (den ich zur Erstellung von Levels machen werde).

Alle Zahlen in eine Datei (am besten verschlüsselt damit keine anderen die Levels per Hand verändern, damit sie das schaffen Twisted Evil ) und dann im Spiel einfach reinholen (BinärDatei? ist das verschlüsselt? eigentlich ja oder?)

Ich versuch mal mein bestes (erstmal mit normalen Text-Dateien) und dann schreib ich hier mal hin ob es geklappt hat.

Ich weiß nicht ob es schonmal gefragt wurde aber kann man die Schriftgröße von TextOut auch ändern? ich hab bisher nur die Schriftfarbe ändern können.

Da gibts doch bestimmt SetTextSize oder so???

Marco
_________________
Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX

Programmiert Spiel: BreakOut Game
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 12:25    Titel: Antworten mit Zitat

Ich galube das geht ein wenig komplizeirter, man kann im Pirnzip jede beliebige Windows Schrift, (also TrueType Schrift) die installeit ist verwenden, aber so gaanz easy ist das nicht, in meinem Windows Buch (Petzold) stehen dazu ca. 40 Seiten, die hab ich ncoh net alle durch Wink

Binär ist nicht wirklich verschlüsselt, aber trotzdem eignetlihc besser. Der nahcteil ist, das du halt einen Editor brauchst, weil du den Texteditor nicht mehr benutzen kannst.
Der Vorteil ist, das das laden und spiechern einfacher ist, du musst nciht Zahl in Text und beim laden wieder Text in Zahl umwandeln.
Verschlüsseln kann man binär natürlich tortzdem gibt tausende Algos, von einfach bis sicher, aber wenn man erstmal den aufbau nicht kennt, und keinen Hexeditor benutzen will, sind die fast schon verschlüsselt genug.
Außerdem kommt es gut den Leveleditor mit zu veröffenltichen, dann kann jeder eigene Levels bauen, steigert den Wert des Spieles etwas. Und dann macht verschlüsselung keinen Sinn mehr, oder?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 12:38    Titel: Antworten mit Zitat

marco93 hat Folgendes geschrieben:
Zu der Idee von KI: Ich glaube so mach ichs! Das passt dann auch gleich mit dem Leveleditor (den ich zur Erstellung von Levels machen werde).

Genau dasselbe hatte ich auch vorgeschlagen. :P

Das mit den Dateien ist so 'ne Sache. Verschlüsseln ist Quatsch, ich glaube niemand wird sich die Mühe machen und deine Levels verändern um zu cheaten, zudem hat die unverschlüsselte Variante den Vorteil, dass du eben auch mal schnell per Hand ein paar Levels schreiben kannst, zumal sich ein Editor für Breakout nicht wirklich lohnt.
Zur Frage Text- oder Binärdatei: Textdateien haben eben den Vorteil, dass du sie mit jedem x-beliebigen Textprogramm schnell und unproblematisch verändern kannst, dafür lassen die sich eventuell etwas schwieriger lesen und konvertieren, da die im Grunde ja nur aus Zeichen bestehen. Binärdateien bearbeiten sich etwas komplizierter - aber auch nicht wirklich schwierig - lassen sich dafür aber recht einfach einlesen und verarbeiten, da die einzelnen Block-IDs etc. einfach der Reihe nach als z.B. Integer gespeichert werden, du musst also lediglich wissen wie dein eigenes Format aufgebaut ist. ;)

Edit: Hrmpf, Jonathan war irgendwie schneller und hat dasselbe geschrieben. :P
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
marco93
Mini JLI'ler



Anmeldedatum: 03.08.2006
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 13:19    Titel: Antworten mit Zitat

Ich muss ja auch keine eigene Datei anlegen, ich kann ja einfach ein Boardset machen mit verschiedenen Levels die integriert sind. Und die selbst erstellten Levels werden irgendwo gelagert z.n. /levels/testlevel.bin .

Zum Code hab ich mir folgendes überlegt: Es werden auf jedenfall viele bunte Steine sein, also sollte es ungefähr so aussehen:

CPP:
....

// Schleife (i=Spalte, j=Reihe)
for(int i = 0; i < 10; i++) {
 for(int j = 0; j < 20; j++) {

  if(brick == 0) { } // nichts zeichnen
  elseif(brick >= 1) { .... } // Sprite (Brick) zeichnen

 }
}

....


Und dann muss ich noch ein wenig lesen und dann gibts wahrscheinlich die normalen bricks (ball lässt sie verschwinden prallt dann wieder ab) und PowerUps oder so (ball trifft gegen, das power-up bewegt sich nach unten und wird aufgefangen (irgend nen bonus) oder verschwindet im unteren Bildschirmrand (weg)).

Aber erstmal reichen die normalen Bricks, ich guck mir das mal an.

Marco

PS: Achja, @GreveN: Ich weiß. Nur KI hat es etwas genauer geschrieben. Hehe.
_________________
Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX

Programmiert Spiel: BreakOut Game
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
manu
Super JLI'ler


Alter: 35
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 14:06    Titel: Antworten mit Zitat

Hi,

zu der unterschiedlichen Schriftgröße mit TextOut.
Ich hatte mich das auch mal gefragt und darauf hin mal google benutzt und wurde fündig. Leider hab ich die seite nicht mehr... Ich habe aber gerade mal die Methode, die ich mir daraus zusammengebastelt hatte, rausgesucht und ich hoffe du kannst damit was anfangen Smile

Die ersten 3 Parameter beschreiben die Textfarbe, LPCSTR den text (Wenn du es mit unicode willst musst du halt den Parameter dementsprechend abändern).
x und y beschreiben die Text Position auf dem Bildschirm.
width und height beschreiben die Textgröße und rotate die Rotation des textes....

CPP:
bool DrawGDITextEx(int r, int g, int b, LPCSTR text, int x, int y, int width, int height, int rotate)
{
        HDC m_hDC;
   if(m_lpBack->GetDC(&m_hDC) == DD_OK)
   {
         HFONT m_font;
      //Font erstellen
      m_font = CreateFont(width, height, rotate, 0,
            FW_NORMAL, FALSE, FALSE, FALSE,
            ANSI_CHARSET, OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
            DEFAULT_PITCH | FF_ROMAN,
            "Times New Roman");
      SelectObject(m_hDC, m_font);

      SetBkMode(m_hDC, TRANSPARENT);
      SetTextColor(m_hDC, RGB(r,g,b));
      TextOut(m_hDC, x, y, text, strlen(text));
      m_lpBack->ReleaseDC(m_hDC);

      DeleteObject(m_font); // Font löschen
      return true; // alles OK
   }
   else
      return false; //Fehler
}


PS: Die Funktion hatte ich als Methode zusammen mit den benötigten Variablen in ner Klasse gekapselt und hab se grad für dich im phpbb texteditor zu ner "normalen" funktion ungeschrieben etc... Ich hoffe ich hab dabei kein Fehler gemacht Rolling Eyes

wichtiges edit: m_lpBack ist der Backbuffer und die Fehlerüberprüfung mit DD_OK kommt noch von DirectDraw. das ganze musst du halt an dein Programm anpassen


Zuletzt bearbeitet von manu am 03.08.2006, 14:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 03.08.2006, 14:11    Titel: Antworten mit Zitat

Also entweder machst du das ganz einfach, dafür statisch, in dem du einfach anhand der IDs im Array unterscheidest was getan werden soll (z.B.: 1 = nichts, nur zerstören; 2 = neues Leben; 3 = 2. Ball; ... ), oder du löst das über die Vererbungsschiene. Beispielsweise könntest du eine Zusatzklasse 'Extra' mit einer virtuellen Methode 'give' machen, von der du verschiedene konkrete Boni ableitest und jeder 'Brick' bekommt einen Pointer auf ein oder mehrere solche Extras und bei einer Kollision wird dann dieses Array/ diese Liste durchgegangen und alle Methoden 'give' werden aufgerufen (ob in diesem Fall eine "ist"- oder "besitzt"-Beziehung vorliegt ist streitbar, ich denke das die "besitzt"-Beziehung vorteilhafter ist, da sie ermöglicht einem Brick Kombinationen aus mehreren Boni zu zuweisen). Generisch könnte man das auch über Templates lösen, aber das dürfte für deine Zwecke schon fast zu weit gehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
marco93
Mini JLI'ler



Anmeldedatum: 03.08.2006
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 06.08.2006, 08:57    Titel: Antworten mit Zitat

ahh! jetzt hab ich es auch verstanden: z.B. 1 = roter Brick, 2 = blauer Brick usw., 3 = Extra Leben (PowerUp) usw.

Zur Programmierung: Man kann jetzt den Paddle nach links und rechts bewegen (mit Bildschirmbegrenzungen)


Marco
_________________
Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX

Programmiert Spiel: BreakOut Game
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.08.2006, 12:30    Titel: Antworten mit Zitat

Naja, Grenzen sind sehr leicht. Wenn die Position kleiner 0 ist, wird sie auf 0 gesetzt, ist sie größer als der rechte Dildschirmrand wird sie darauf gesetzt. Aslo zum Beispiel von 1200 auf 1024.
Bewegen geht mit DirectInput oder Windwosfunktionnen, nimm DI, das ist im Buch beschreiben. Wie man Sprites bewegt ist auch beschrieben, lies also am besten nochmal die entsprechenden Kapitel, das sollte die meisten Fragen beantworten.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
marco93
Mini JLI'ler



Anmeldedatum: 03.08.2006
Beiträge: 5

Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 11:42    Titel: Antworten mit Zitat

Hi,
ich habe noch eine Frage:

Wie bekomme ich so Ränder an die Seiten, also dass der Ball und der Paddle nicht auf dem ganzen Bildschirm sein können? Ich möchte nämlich rechts und links eine grenze haben, z.b. von 25 Pixel o.ä.

Zur Programmierung: Hab jetzt statt der Bricks (Sprites) schon 0 (no brick) und 1 (brick) auf den bildschirm bekommen, leider geht der Ball noch durch Very Happy ... Superball ^^ (ich versuch aber erstmal die bricks herzubekommen)

Marco
_________________
Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX

Programmiert Spiel: BreakOut Game


Zuletzt bearbeitet von marco93 am 08.08.2006, 11:46, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum