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

03.07.2008, 16:33

Bildergrößen problematisch?

Hi,

Ich arbeite an einem 2D Spiel mit der SDL. Mein Spiel ist so aufgebaut, dass der gesamte Hintergrund ein sehr großes Bild ist. Von diesem wird immer der 800x600 große Ausschnitt gezeigt, indem sich die Spielfigur grade befindet. Momentan bin ich noch in der Testphase mit einem Bild, das 3000x1200 Pixel groß ist. Im Hauptspiel sollen aber Hintergrundbilder mit einer größe von ca 10000x1200 Pixel zum einsatz kommen.

Ich habe hier im Forum mal von jemanden gehört, dass es bei großen Bildergrößen zu Problemen kommen kann. Mich würde jetzt mal interesieren in wie weit, dass der Fall ist und welche Unterschiede es bei der Unterstützung von Bildergörßen in Hinblick auf die Grafikkarte gibt.

Gruß Abcd

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.07.2008, 16:37

Ja, für eine Textur ist das schon zu groß. Ich glaube 4096x4096 ist die gängige Obergrenze.
Teil das Bild einfach in mehrere kleine Bilde auf.

3

03.07.2008, 16:39

Gibt es evtl auch ältere Karten, die nichtmal mit 4096x4096 Pixel zuerecht kommen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

03.07.2008, 16:41

Zitat von »"Abcd1234"«

Gibt es evtl auch ältere Karten, die nichtmal mit 4096x4096 Pixel zuerecht kommen?


Ja, die gibt es mit Sicherheit.
@D13_Dreinig

5

03.07.2008, 16:56

Welche maximale Bildergröße sollte ich den nehmen, wenn ich mein Spiel auf möglichst allen Rechnern laufen lassen möchte?

Evtl sind nämlich auch 3000x1200 schon zu viel zumindest konnte man bei uns in der Schule auf den Rechnern nur kurz einen Schwarzen Bildschirm sehen...

Anonymous

unregistriert

6

03.07.2008, 17:02

512x512, du kannst doch die grafik so groß machen wie du willst, wenn du sie nur splittest beim Programmstart. :)

7

03.07.2008, 17:11

Hat die SDL nicht 'ne Funktion/Methode ähnlich GetDeviceCaps, mit der man die maximale Texturgröße herausfinden kann?

8

03.07.2008, 17:20

Wie könnte ich den eine Grafik spliten?

Also ich benutze zum laden der Bilder immer die SDL Funktion:

C-/C++-Quelltext

1
SDL_LoadBmp


Aber mit der Funktion kann ich ja nicht bestimmen, dass z.b nur ein Teil des Bildes geladen werden soll..

Gon

Treue Seele

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

9

03.07.2008, 17:29

also im buch "C++ für Spieleprogrammierer" werden animierte sprites so geladen und gerendert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Load

//

// Aufgabe: Animiertes Sprite laden

//

void CSprite::Load (const string sFilename, int NumFrames,
                    int FrameWidth, int FrameHeight)
{
  // Bitmap laden

  Load (sFilename);

  // Rect für Animationsphase initialisieren

  m_NumFrames   = NumFrames;
  m_FrameWidth  = FrameWidth;
  m_FrameHeight = FrameHeight;
  m_FrameRect.w = FrameWidth;
  m_FrameRect.h = FrameHeight;
  m_NumFramesX  = m_pImage->w / m_FrameWidth;

} // Load



// ========================================



// Render

//

// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)

//

void CSprite::Render (float fFrameNumber)
{
  // Ausschnitt der aktuellen Animationsphase berechnen

  //


  // Spalte berechnen

  int Column = static_cast<int>(fFrameNumber)%m_NumFramesX;

  // Zeile berechnen

  int Row = static_cast<int>(fFrameNumber)/m_NumFramesX;

  // Rect berechnen

  m_FrameRect.x = Column * m_FrameWidth;
  m_FrameRect.y = Row * m_FrameHeight;

  // Ausschnitt rendern

  SDL_BlitSurface (m_pImage, &m_FrameRect, m_pScreen, &m_Rect);

} // Render

da wie bei animierten sprites ja immer nur ein teil der grafik geladen wird, wird das auch in deinem fall funktionieren.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

03.07.2008, 17:30

Einmal komplett laden (als Nicht-Textur, also im Systemspeicher), dann die einzelnen kleinen Surfaces erstellen (im Grafikspeicher) und die Teile hineinkopieren (SDL_BlitSurface). Dann das große Bild wieder freigeben.

Werbeanzeige