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

31

30.11.2009, 20:45

Wenn du SStein, ... in der LvlGenerator-Methode erzeugst, was bringt es dir dann. Sind ja wieder weg, sobald LvlGenerator fertig ist, bzw. Verlassen wird. Für den Späteren Spielverlauf sindse ja alle weg ?

32

02.12.2009, 16:27

Ja das ist mir schon klar,... wollte es auch in eine
switch(lvl); packen und wenn das ziel des lvls erreicht wurde
einfach die lvl variable "plusen". Also
lvl = +1; damit man zu case 2: kommt, also
zum nächsten lvl.

Aber das ich das noch nicht gemacht habe, löst doch nicht den
Fehler aus (also mit application contact support...), oder?
Ich hab mir vorhin nochmal überlegt wie man es
anders lösen könnte, aber so eine richtige idee kam mir
leider nicht. :?

33

02.12.2009, 17:09

Zeig doch noch mal deinen kompletten Code wie du ihn jetzt hast!

Also:
- LvlGenerator
- LoadAllSprites
- !main methode!
- ...

std::vector ist eigentlich kein großes Ding ;)

34

02.12.2009, 17:19

-main.cpp

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
#include "SFML/Graphics.hpp"
#include "SFML/Window.hpp"
#include "SFML/System.hpp"
#include "Animated.hpp"
#include "Collision.h"
#include "CLoad.hpp"
//Unwichtige... weitere sachen...

#include <iostream>

using namespace std;

int main()
{
    sf::RenderWindow App(sf::VideoMode (800, 600, 32), "Bow time");
    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed)
                App.Close();

            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                App.Close();
        }
        CLoad Load;
        Load.LoadAllSprites();
        Load.LvlGenerator("121212");
                App.Clear();
        App.Display();
    }
    return EXIT_SUCCESS;
}

-CLoad.cpp

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
#include "CLoad.hpp"
#include <vector>

void CLoad::LoadAllSprites()
{
    if(!Stein.LoadFromFile("Data/Stein.png")){}
    if(!Baum.LoadFromFile("Data/Baum.png")){}
    if(!Monster.LoadFromFile("Data/Monster.png")) {}
    if(!Held.LoadFromFile("Data/Held.png")) {}
}
void CLoad::LvlGenerator(char *pObjekt)
{

    std::vector<sf::Sprite> SStein;
    std::vector<sf::Sprite> SHeld;
    std::vector<sf::Sprite> SBaum;
    std::vector<sf::Sprite> SMonster;
    SStein.push_back(Stein);
    SHeld.push_back(Held);
    SBaum.push_back(Baum);
    SMonster.push_back(Monster);
    for (DWORD dwChar = 0; dwChar < strlen(pObjekt); dwChar++)
    {
        if(pObjekt[dwChar] != ' ')
        {
        }
            if(pObjekt[dwChar] == '1')
            {
                App.Draw(SHeld.at(0));
    
            }
            else if(pObjekt[dwChar] == '2')
            {
                App.Draw(SStein.at(1));

            }
        }
    }

-CLoad.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef CLOAD_HPP
#define CLOAD_HPP
#include "SFML/Graphics.hpp"
#include "SFML/System.hpp"
#include "SFML/Window.hpp"

class CLoad
{
public:
    sf::RenderWindow App;
    sf::Image Held;
    sf::Image Stein;
    sf::Image Baum;
    sf::Image Monster;
    void LoadAllSprites();
    void LvlGenerator(char *pObjekt);
};
#endif

Mehr ist da auch nicht drinn was damit zutun hat.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

35

02.12.2009, 17:25

Dir ist aber schon klar, dass du jeden Frame eine neue CLoad instanz erstellst und das level neu lädst ?
Und das nichts angezeigt wird ist auch klar. Du rufst die draw() methode vor dem Clear() auf.

Also auf deutsch:
Zeichne zeug. Lösche Buffer. Buffer swappen. Von vorne.

Du musst das draw() zwischen clear() und display() aufrufen.

36

02.12.2009, 17:28

ähm...
Nicht:
App.Draw(SStein.at(1));

Sondern So:
App.Draw(SStein.at(0));

Du hast nur ein Element hinzugefügt!

http://www.cplusplus.com/reference/stl/vector/

37

02.12.2009, 17:43

Ok. Jetzt gibt es keine Fehlermeldung in der Konsole mehr. :D
Ich habe es jetzt so gemacht.

C-/C++-Quelltext

1
2
3
4
5
6
7
        CLoad Load;
        Load.LoadAllSprites();
        App.Clear();
        int ilevel = 1;
                if(ilevel == 2){}
                else{Load.LvlGenerator("121212");}
        App.Display();

Jedoch werden die Bilder immer noch nicht geladen,
woran liegt das jetzt noch?
Also, die bilder werden schon geladen, nur werden sie nicht
auf dem Bildschirm angezeigt.

Edit: Ich hab irgendwie das gefühl das es daran liegt,
das jetzt SBaum und co. nicht sf::Sprite sind sondern
jetzt ein vector sind.

38

02.12.2009, 17:58

Also :

C-/C++-Quelltext

1
2
3
4
5
sf::Image Stein
...
std::vector<sf::Sprite> SStein
...
SStein.push_back(Stein)


-Du fügst einem Sprite-vector ein Image hinzu ?

-Du musst aus dem sf::Image ein Sprite erzeugen (setImage):

http://www.sfml-dev.org/tutorials/1.5/graphics-sprite.php

Ganz genau durchlesen!


Zitat

Edit: Ich hab irgendwie das gefühl das es daran liegt,
das jetzt SBaum und co. nicht sf::Sprite sind sondern
jetzt ein vector sind.


NEIN!

39

02.12.2009, 18:21

So :? ?

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
#ifndef CLOAD_HPP
#define CLOAD_HPP
#include "SFML/Graphics.hpp"
#include "SFML/System.hpp"
#include "SFML/Window.hpp"

class CLoad
{
public:
    sf::RenderWindow App;
    sf::Image Held;
    sf::Image Stein;
    sf::Image Baum;
    sf::Image Monster;
    sf::Sprite spHeld;
    sf::Sprite spStein;
    sf::Sprite spBaum;
    sf::Sprite spMonster;
    void LoadAllSprites();
    void LvlGenerator(char *pObjekt);
};
#endif

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
#include "CLoad.hpp"
#include <vector>

void CLoad::LoadAllSprites()
{
    if(!Stein.LoadFromFile("Data/Stein.png")){}
    if(!Baum.LoadFromFile("Data/Baum.png")){}
    if(!Monster.LoadFromFile("Data/Monster.png")) {}
    if(!Held.LoadFromFile("Data/Held.png")) {}
    spHeld.SetImage(Held);
    spStein.SetImage(Stein);
    spMonster.SetImage(Monster);
    spBaum.SetImage(Baum);
}
void CLoad::LvlGenerator(char *pObjekt)
{
    
    std::vector<sf::Sprite> SStein;
    std::vector<sf::Sprite> SHeld;
    std::vector<sf::Sprite> SBaum;
    std::vector<sf::Sprite> SMonster;
    SStein.push_back(spStein);
    SHeld.push_back(spHeld);
    SBaum.push_back(spBaum);
    SMonster.push_back(spMonster);
    for (DWORD dwChar = 0; dwChar < strlen(pObjekt); dwChar++)
    {
        if(pObjekt[dwChar] != ' ')
        {
        }
            if(pObjekt[dwChar] == '1')
            {
                App.Draw(SHeld.at(0));
    
            }
            else if(pObjekt[dwChar] == '2')
            {
                App.Draw(SStein.at(0));

            }
        }
    }

Hoffentlich ist das falsch, weil es funktioniert immer
noch nicht.. :?

40

02.12.2009, 18:37

Versuch das Sprite zu ändern :

C-/C++-Quelltext

1
2
3
4
5
spHeld.SetColor(sf::Color(r, g, b, alpha));
spHeld.SetPosition(x, y);
spHeld.SetRotation(float);
spHeld.SetCenter(x, y);
spHeld.SetScale(x, y);


vielleicht ist dein Bild zu klein :

spHeld.SetScale(100, 100);

Werbeanzeige