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

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

1

23.07.2013, 20:03

Krieg der Klötze [ erstes grafisches Testspiel ]

Einen wunderschönen guten Abend,

ich habe soeben mein erstes kleines, wohl eher sehr kleines, grafisches Testspiel mit C++ und SFML programmiert.


Ich würde einfach mal gerne wissen, ob das Grundgerüst dieses Spieles denn vernünpftig aussieht, oder ob ich irgendwelche großen Fehler begehe.


Anbei noch der Code, ein Bild und die .exe.

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <SFML/Graphics.hpp>
#include <iostream>
#include <list>
#include <ctime>

int main()
{
    srand ( time ( NULL ) );
    sf::RenderWindow window(sf::VideoMode(800, 600), "Krieg der Klötze" );
    window.setMouseCursorVisible ( false );


    std::list<sf::RectangleShape*> Schussliste;
    std::list<sf::RectangleShape*>::iterator i;

    

    sf::RectangleShape Ziel ( sf::Vector2f ( 50, 50 ) );
    Ziel.setFillColor ( sf::Color::Blue );

    sf::RectangleShape Spieler ( sf::Vector2f ( 50, 50 ) );
    Spieler.setFillColor ( sf::Color::Green );
    Spieler.setPosition ( 0, 550 );

    sf::RectangleShape *Schuss_Temp = 0;

    bool Schussaktiv = false;



    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if ( sf::Keyboard::isKeyPressed ( sf::Keyboard::Space ) && Schussaktiv == false)
        {
            Schussaktiv = true;

            Schuss_Temp = new sf::RectangleShape ( sf::Vector2f ( 4, 15 ) );

            Schuss_Temp->setPosition( Spieler.getPosition ().x + 25, 550 ); 
            Schuss_Temp->setFillColor ( sf::Color::Red );

            Schussliste.push_back ( Schuss_Temp );
        }
        if ( event.type == sf::Event::KeyReleased )
        {
            if ( event.key.code == sf::Keyboard::Space )
            {
                Schussaktiv = false;
            }
        }

        if ( sf::Keyboard::isKeyPressed ( sf::Keyboard::Right ) && Spieler.getPosition ().x <= 750 )
        {
            Spieler.move ( 2, 0 );
        }
        if ( sf::Keyboard::isKeyPressed ( sf::Keyboard::Left ) && Spieler.getPosition ().x >= 0 )
        {
            Spieler.move ( -2, 0 );
        }

        if ( Schussliste.begin () != Schussliste.end () )
        {
            for ( i = Schussliste.begin (); i != Schussliste.end (); ++i )
            {
                if ( (*i)->getPosition ().x >= Ziel.getPosition ().x && (*i)->getPosition ().x <= Ziel.getPosition ().x + 50 &&
                     (*i)->getPosition ().y >= Ziel.getPosition ().y && (*i)->getPosition ().y <= Ziel.getPosition ().y + 50 )
                {
                    delete *i;
                    Schussliste.erase (i++);
                    Ziel.setPosition ( rand () % 775 + 1, 0 );
                }
            }
        }

        if ( Schussliste.begin () != Schussliste.end () )
        {
            for ( i = Schussliste.begin (); i != Schussliste.end (); ++i )
            {
                if ( (*i)->getPosition ().y <= 0 )
                {
                    delete *i;
                    Schussliste.erase (i++);
                }
            }
        }

        window.clear ();
        window.draw ( Ziel );

        if ( Schussliste.begin () != Schussliste.end () )
        {
            for ( i = Schussliste.begin (); i != Schussliste.end (); i++ )
            {
                window.draw((**i));
                (*i)->move ( 0, -1 );
            }
        }
        window.draw ( Spieler );
        window.display ();
    }
    return 0;
}




Würde mich über Kritik freuen :)
Simon
»BK Simon« hat folgende Bilder angehängt:
  • Snapshot.png
  • Unbenannt.png
»BK Simon« hat folgende Dateien angehängt:
  • Spiel NEUE VERSION.zip (732,21 kB - 38 mal heruntergeladen - zuletzt: 25.03.2024, 23:30)
  • Spiel.zip (77,33 kB - 67 mal heruntergeladen - zuletzt: 25.03.2024, 23:58)
  • main.cpp (2,69 kB - 76 mal heruntergeladen - zuletzt: 26.03.2024, 00:01)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BK Simon« (31.07.2013, 00:50)


Crazy007

Treue Seele

Beiträge: 186

Wohnort: Tirol

  • Private Nachricht senden

2

23.07.2013, 20:16

Das sieht doch schonmal gut aus :)

Ich würde jedoch Variablen usw. in Englisch schreiben. Schaut etwas komisch aus wenn ein englisches Wort wie Rectangle neben einem deutschen Wort wie Spieler steht.

Ich weiß nicht wie erfahren du mit C++ bist aber du solltest als nächsten Schritt mal versuchen alles in Klassen zu packen.
Also eine Klasse für Spieler, Ziel, Schuss usw. Diese Klassen haben dann jeweils eine Update und Render funktion. In der Update funktion kommt die ganze Spiellogik hinein und in Render zeichnest du das ganze dann. Diese Funktionen sollen dann in der Hauptschleife (while(window.isOpen())) aufgerufen werden.
Dann sieht der Code nochmal schöner aus.

Hoffe ich konnte dir helfen,
Crazy007
Der Error sitzt meistens vor dem Bildschirm! :D

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

3

23.07.2013, 20:26

Jop Klassen und Co. sind mir bekannt, wollte nur mal mit SFML rumprobieren und da ist dies bei raus gekommen :)

Aber gut als nächste separiere ich mal den Code in verschiedene Klassen :)

Danke für die Antwort !

xXSlayerXx

Treue Seele

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

4

23.07.2013, 20:40

Ist das richtig, dass sich der spieler so schnell bewegt?
Wenn ich die rechte Pfeiltaste drücke, ist dieser innerhalb von Bruchteilen von Sekunden auf der anderen Spielfeldseite.

Addierst du zu der Position einfach einen Wert oder Arbeitest du da mit Zeit?
Wenn du einfach einen Wert addierst, bewegt sich der Spieler auf langsamen PCs "normal" schnell und auf schnelleren PCs "extrem" schnell.
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

5

23.07.2013, 20:43

Ja zurzeit ist es noch so, dass ich nur eine Zahl addiere. Habe noch keine Zeit mit ins Spiel gebracht, außer beim Setzen der neuen Position des Zieles!

6

23.07.2013, 20:46

Zitat


if ( sf::Keyboard::isKeyPressed ( sf::Keyboard::Right ) && Spieler.getPosition ().x <= 750 )
{
Spieler.move ( 2, 0 );
}
if ( sf::Keyboard::isKeyPressed ( sf::Keyboard::Left ) && Spieler.getPosition ().x >= 0 )
{
Spieler.move ( -2, 0 );
}

;)

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

7

23.07.2013, 20:49

Ja genau das ist es :)

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

8

23.07.2013, 22:13

Ich bin gerade dabei den Code in Klassen zu unterteilen und habe mit der Spieler Klasse angefangen.

Gerade wollte ich die Renderfunktion schreiben und bin da auf das Problem gestoßen, dass die Spieler Klasse ja nichts von dem window weiß und ich somit ja nicht einfach window.draw ( Spieler ) schreiben könnte.

Übergibt man jetzt einfach das window an die Renderfunktion oder wie macht man das ?

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

9

23.07.2013, 23:05

Sieh dir mal das Interface sf::Drawable an.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »patrick246« (24.07.2013, 01:57)


BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

10

23.07.2013, 23:25

Habe eben schon in nem Thread gelesen, dass man das Window sowieso nicht übergeben kann und nun habe ich einfach das Window per Referenz übergeben

Werbeanzeige