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

21

22.03.2011, 18:52

Geht leider auch nicht

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

22

22.03.2011, 18:58

Wenn »Fail INIT« angezeigt wird, liegt der Fehler ja wohl in dieser Zeile:

C-/C++-Quelltext

1
g_pFramework->Init (800, 600, 32, false)

Zeig uns doch mal den Code von Init.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

23

22.03.2011, 18:59

Wie sollte es auch. Erst updaten, dann leeren und dann doublebuffer updaten, das ist totaler Non-Sense.
Welche Nachricht hast du nun ausgegeben bekommen und hast du etwas Code auskommentiert?

@Fred: ich wurde nicht ganz schlau draus, _ob_ das nun ausgegeben wurde oder ob der Code dort ausgeführt wurde.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

24

22.03.2011, 20:36

@Architekt: Stimmt, ich hab vergessen zu sagen, das die anderen g_pFramework Methodenaufrufe aus der while schleife gelöscht werden sollten. Sonst machts allerdings keinen Sinn.

@Tunfisch: Du nutzt doch denn Code aus dem Buch C++ für Spieleprogrammierer, oder?

Ich hab mal eben deinen Code kompiliert und hab die Fehler gefunden:
1. Irgendwie kann man mit der Sprite Klasse nur .bmp dateien laden. Mit .png gehts nicht.
2. Wie ich schon sagte lösche aus der while Schleife alle g_pFramework Aufrufe und schreibe Sie an die Stellen wie in meinem letzten Beitrag gennannt.
3. Für die map_sprites solltest du Zeiger nehmen.
4. Ich weiß nicht, ob du es nur vergessen hast, aber um in der main Funktion die SDL und die Singleton-Klasse zu nutzen mussst du auch die Dateien inkludieren.

Bei mir hats nach den Änderungen funktioniert (Im moment wird nur ein Sprite gezeichnet, den Rest solltest du alleine Ändern können).

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "Sprite.hpp"
#include "Framework.hpp"
#include "Singleton.hpp" // neu eingfügt
#include <iostream> // neu eingfügt
#include <SDL.h> // neu eingfügt

using namespace std; // neu eingfügt

//  map größe
const unsigned int map_breite = 20;
const unsigned int map_hoehe = 10;

// tile größe
const int tile_breite = 40;
const int tile_hoehe = 40;

// die map
unsigned int tilemap[map_hoehe][map_breite] =
  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

int main (int argc, char *argv[])
{
    int Auswahl = 0;

    if (g_pFramework->Init (800, 600, 32, false) == false)
    {
        std::cout << "Fail INIT" << std::endl;
    }

    // Sprites erstellen
    CSprite *map_sprites; // Vom Array zum Zeiger geändert

    map_sprites = new CSprite(); // Speicher resservieren

    // Grafiken laden
    map_sprites->Load("Texturen/boden.bmp", 0, 40, 40);
   /* map_sprites[1].Load("Texturen/wand.png", 0, 40, 40);
    map_sprites[2].Load("Texturen/kerkertuer.png", 0, 40, 40);
    map_sprites[3].Load("Texturen/zellentuer.png", 0, 40, 40);
    map_sprites[4].Load("Texturen/schatz.png", 0, 40, 40);
    map_sprites[5].Load("Texturen/monster.png", 0, 40, 40);
    map_sprites[6].Load("Texturen/held.png", 0, 40, 40);*/

    std::cout << "Fail Load" << std::endl;

    while (true)
    {
        g_pFramework->Update ();
        g_pFramework->Clear ();
        for( int i = 0; i < map_hoehe; i++)
        {
            // alle zeilen durchlaufen
            for( int j = 0; j < map_breite; j++)
            {
                    // boden zeichnen
                map_sprites->SetPos(j*tile_breite, i*tile_hoehe); // Vorerst nur das eine Sprite Zeichnen
                map_sprites->Render(); //

                std::cout << "Fail Render" << std::endl;

            }
        }
        g_pFramework->Flip ();
    
        std::cout << "Fail Schleife" << std::endl;
    }
    return 0;
}

Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »Phalax« (22.03.2011, 21:41)


25

25.03.2011, 16:23

Danke für die Antwort ich habe es zwar noch nicht ausprobiert aber wenn es bei dir geht wird es bei mir wahrscheinlich auch gehen ich werde es demnächst mal ausprobieren. Ich habe es aber in der letzten zeit mal mit sfml probiert und finde sfml auch um einiges einfacher und hab schon mal ein programm geschrieben wo es die tiles anzeigen soll nur leider habe ich probleme damit es sieht eigentlich sehr gut aus nur es geht noch nicht. Fehler: Es erscheint ein schwarzer Bildschirm mit blinkenden Vierecken. Hier ein Bild damit es deutlich wird.

http://www.fotos-hochladen.net/uploads/u…tvfino0x5ak.jpg


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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics.hpp>

//  map größe
const unsigned int map_breite = 20;
const unsigned int map_hoehe = 10;

// tile größe
const unsigned int tile_breite = 40;
const unsigned int tile_hoehe = 40;

// beschreibt die Anzahl der Sprites, 
// die in der Map verwendet werden
const unsigned int sprite_anzahl = 7;



// die map
unsigned int tilemap[map_hoehe][map_breite] =  
  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };


int main()
{
    // Create main window
    sf::RenderWindow App(sf::VideoMode(1280, 1024), "SFML Fonts");

    // Sprites erstellen
    sf::Image map_sprites[7];

    // Grafiken laden
    map_sprites[0].LoadFromFile("Data/Texturen/boden.png");
    map_sprites[1].LoadFromFile("Data/Texturen/wand.png");
    map_sprites[2].LoadFromFile("Data/Texturen/kerkertuer.png");
    map_sprites[3].LoadFromFile("Data/Texturen/zellentuer.png");
    map_sprites[4].LoadFromFile("Data/Texturen/schatz.png");
    map_sprites[5].LoadFromFile("Data/Texturen/monster.png");
    map_sprites[6].LoadFromFile("Data/Texturen/held.png");

    sf::Sprite Sprite[7];

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

    App.Clear ();

            // map zeichnen  
            // alle spalten durchlaufen
            for( int i = 0; i < map_hoehe; i++)
            {
                // alle zeilen durchlaufen
                for( int j = 0; j < map_breite; j++)
                {
                    // boden zeichnen
                    Sprite[tilemap[i][j]].SetPosition(j*tile_breite, i*tile_hoehe);
                    App.Draw ( Sprite[tilemap[i][j]] );

                }
            }
    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }
        App.Display ();
    }

        return EXIT_SUCCESS;
}

26

28.03.2011, 09:53

du solltest dir wirklich etwas genauer die tutorials durchlesen. ohne jetzt deinen code genau lesen zu müssen:

_außerhalb_ der "mainloop" clearst du den screen und zeichnest sprites.
_innerhalb_ der "mainloop" rufst du display auf, ohne das vorherige vom schirm zu löschen geschweige denn etwas neues nachzuzeichnen.

edit:
http://www.sfml-dev.org/tutorials/1.6/graphics-window.php

du solltest also eher sowas bauen:

Quellcode

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
int main()
{
    // Create the main rendering window
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics");
    
    // Start game loop
    while (App.IsOpened())
    {
        // Process events
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }

        // Clear the screen (fill it with black color)
        App.Clear();

       // deine sprites auf den schirm zaubern
       for( int i = 0; i<bla; ++i )
         App.Draw( sprites[i] );

        // Display window contents on screen
        App.Display();
    }

    return EXIT_SUCCESS;
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Draculark« (28.03.2011, 09:58)


Werbeanzeige