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

17.04.2011, 03:25

[SFML] Runtime Error beim Laden der tiles

Gute Nacht,
ich habe leider ein Fehler zur Laufzeit, wenn zwei tiles geladen werden.
Der Code ist folgender:

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
  // map size
    const unsigned int map_width = 10;
    const unsigned int map_height  = 10;

// map
    unsigned int tilemap[map_height][map_width] =  
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    // create Sprites
    sf::Image map_sprites[1];
    sf::Sprite Sprite[1];
    map_sprites[0].LoadFromFile("ressourcen/ground.jpg");
    map_sprites[1].LoadFromFile("ressourcen/hedge.jpg");

    for( int i = 0; i <= 1;i++)
    {
        Sprite[i].SetImage(map_sprites[i]);
    }


Das ist der Code, der Probleme macht. Beim Debuggen kommt er bis zur Schleife, führt diese einmal aus und dann spuckt er einen Fehler aus. Ich sehe leider den Wald vor lauter Bäumen nicht mehr. Könnte mir jemand auf die Sprünge helfen?!
Vielen Dank!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

17.04.2011, 09:21

map_sprites besteht aus nur einem Element, du greifst aber auf das (nicht vorhandene) zweite Element zu.

3

17.04.2011, 10:34

So müsste dein Code jetzt gehen ;)

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
  // map size
    const unsigned int map_width = 10;
    const unsigned int map_height  = 10;

    // map
    unsigned int tilemap[map_height][map_width] =  
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

    // create Sprites
    sf::Image map_sprites[2]; 
    // Dein array sieht jetzt folgender maßen aus
    /*
      map_sprites[0] und map_sprites[1] jetzt besteht dein array aus zwei elemte. Es wird immer bei 0
      angefangen zu zählen.
    */
    sf::Sprite Sprite[2];

    if( !map_sprites[0].LoadFromFile("ressourcen/ground.jpg") )
       std::cout << "Konnte das Bild ground.jpg nicht laden!" << std::endl;

    if( !map_sprites[1].LoadFromFile("ressourcen/hedge.jpg") )
    std::cout << "Konnte das Bild hedge.jpg nicht laden!" << std::endl;

    for( int i = 0; i <= 1;i++)
    {
        Sprite[i].SetImage(map_sprites[i]);
    }


Bitte auch immer auf Fehler prüfen.

Gruße nero

4

17.04.2011, 13:55

Hallo,
vielen Dank, für die Antworten! Hat nun alles seine Richtigkeit.
Leider habe ich schon den nächsten Fehler, wenn die Tiles angezeigt werden sollen.
Code ist folgender:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// alle spalten durchlaufen
for( int i = 0; i < map_height; i++)
{
// alle zeilen durchlaufen
for( int j = 0; j < map_width; j++)
{
App.Clear();

// je nach Sprite-Nummer in der Map, anderes Sprite zeichnen
unsigned int sprite_nummer = tilemap[i][j];

// kleine Vorsichtsmaßnahme
if(sprite_anzahl <= sprite_nummer)
continue;

   
App.Draw(Sprite[sprite_nummer]);
App.Display();
}
}


Das sieht dann beim Ausführen folgendermaßen aus:
http://www.imagebanana.com/view/d37ab8e6/Fehler.png

PS: Wollte noch anmerken, dass das Programm während der Ausführung sehr langsam ist, obwohl die CPU-Auslastung gering ist.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

17.04.2011, 14:03

clear und display sollte ausserhalb der schleifen sein sonst rufst du die pro "hauptschleifendurchgang" map_height*map_width mal auf, es wird immer nur ein sprite angezeigt und das programm läuft sehr langsam.
die position solltest du auch noch anpassen. sonst werden alle sprites an der gleichen stelle gezeichnet. glaub nicht das liegt in deinem interesse^^
"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?

6

17.04.2011, 14:13

Zitat

die position solltest du auch noch anpassen. sonst werden alle sprites an der gleichen stelle gezeichnet.


Etwa so?

C-/C++-Quelltext

1
Sprite[tilemap[i][j]].SetPosition(j*tile_breite, i*tile_hoehe);


Leider ist immernoch nur ein Sprite zu sehen, diesmal aber innerhalb des Fensters (und nicht oben links).

Clear() und Display() habe ich aus der Schleife genommen und das Programm läuft wirklich nicht mehr so langsam.

7

17.04.2011, 14:35

wohl eher so:

C-/C++-Quelltext

1
2
3
4
5
6
 sf::Sprite Mapsprites[map_height][map_width];
//...
//...

Mapsprites[i][j]= Sprite[tilemap[i][j]];
Mapsprites[i][j].SetPosition(j*tile_breite, i*tile_hoehe);

Zitat

Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.

8

17.04.2011, 14:45

Wow! Es klappt! Danke ;-).

Werbeanzeige