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

11

03.04.2016, 15:46

War nicht genau dafür der Dereferenzierungsoperator da oder verwechsel ich jetzt etwas
Wenn der iter das zu zeichnende Objekt wäre müsste man ihn dereferenzieren. Aber der iter ist nicht das zu zeichnende Objekt, sondern enthält es also must du über den iter drauf zugreifen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

12

03.04.2016, 16:42

Du könntest auch aufhören, einen Iterator zu benutzen und einfach eine Range-based for-Schleife nutzen.

OKay, bei mir sieht der Code jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
for (auto i : projektilArray)
        {
            i.updateProjektil();
            window.draw(i.rect);
        }

Ist das so richtig? ?(

Das Programm startet wieder (diesmal ohne Error :thumbsup: ) und scheint erstmal so zu funktionieren :)
ABER wenn ich nun die Pfeiltasten drücke (er also rote Laser, die durch rote Vierecke dargestellt werden sollen, schießen soll, ändert er das Sprite, aber schießen tut er nichts ... und es scheint alles deutlich langsamer zu laufen :S

Hier nochmal alles relevante dafür:

main.cpp:
(Ich weiß der Code ist noch etwas unübersichtlich und vieles erstmal nur provisorisch ausgeklammert ... das gehe ich dann an, wenn es so läuft, wie es soll :D )

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
// TheBindingOfZyklop.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <SFML/Graphics.hpp>  //Einbinden der SFML Lybary

#include "Schablone.hpp"
#include "player.hpp"
#include "projektil.hpp"

using namespace std;     
#include <iostream>
#include <vector>


int main()
{   
    //Fenster erstellen mit x=800, y=600
    sf::RenderWindow window(sf::VideoMode(800, 600), "TBoZ");


    //Spielertextur laden
    sf::Texture texturePlayer;
    texturePlayer.loadFromFile("TexturePlayer.png");
    sf::Sprite spritePlayer(texturePlayer);
    //spritePlayer.setPosition(window.getSize().x / 2, window.getSize().y / 2); //Sprite in der Mitte des Bildschirms platzieren
    //spritePlayer.setTextureRect(sf::IntRect(17 * 32, 0, 32, 32));


    //Spieler erstellen
    class CPlayer Spieler1;
    Spieler1.sprite.setTexture(texturePlayer);


    //Projektil Vektor Array erstellen
    vector<CProjektil>::iterator iter;
    vector<CProjektil> projektilArray;
    class CProjektil Projektil1; //Projektil erstellen


    //Main Loop!
    do
    {
        window.clear();  //Fenster resetten

        window.draw(Spieler1.sprite); //Spieler "spawnen"

        //Update Player
        Spieler1.updatePlayer();
        Spieler1.updateMovement();
        Spieler1.updateAttack();


        //Projektil abfeuern
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)))
        {
            Projektil1.rect.setPosition(Spieler1.rect.getPosition()); //Projektil bei Spieler spawnen
            Projektil1.Richtung = Spieler1.Richtung;
            projektilArray.push_back(Projektil1); //Projektil in Array verfrachten
        }

        //Projektile anzeigen
        //int i = 0;
        /*for (iter = projektilArray.begin(); iter != projektilArray.end(); ++iter);
        {
            //projektilArray[counter].updateProjektil();
            //window.draw(projektilArray[counter].rect);
            //counter++;
            iter->updateProjektil();
            window.draw(iter->rect);
        }*/
        for (auto i : projektilArray)
        {
            i.updateProjektil();
            window.draw(i.rect);
        }
        
        window.display();
    } while (!sf::Keyboard::isKeyPressed(sf::Keyboard::Escape));  //ESC beendet Programm

    return 0;
}


player.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
39
40
41
42
43
#include "stdafx.h"
#include <SFML/Graphics.hpp> 
#include "player.hpp"


CPlayer::CPlayer()
{der Übersichtlichkeit halber entfernt}

void CPlayer::updatePlayer()
{
    sprite.setPosition(rect.getPosition());
}

void CPlayer::updateMovement()
{ der übersichtlichkeit halber entfernt}

void CPlayer::updateAttack()
{
    //Angriff nach RECHTS
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) //Spieler drückt RECHTE Pfeiltaste)
    {
        sprite.setTextureRect(sf::IntRect(2 * 32, 0, 32, 32)); //Sprite anpassen/ändern
        Richtung = 1; //Richtung festlegen (Werte siehe Schablone.hpp)
    }
    //Angriff nach LINKS
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) //Spieler drückt LINKE Pfeiltaste
    {
        sprite.setTextureRect(sf::IntRect(9 * 32, 0, 32, 32));
        Richtung = 2;
    }
    //Angriff nach UNTEN
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) //Spieler drückt UNTERE Pfeiltaste
    {
        sprite.setTextureRect(sf::IntRect(16 * 32, 0, 32, 32));
        Richtung = 3;
    }
    //Angriff nach OBEN
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) //Spieler drückt OBERE Pfeiltaste
    {
        sprite.setTextureRect(sf::IntRect(23 * 32, 0, 32, 32));
        Richtung = 4;
    }
}


projektil.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
#include "stdafx.h"
#include <SFML/Graphics.hpp> 
#include "projektil.hpp"


//Konstruktor
CProjektil::CProjektil()
{
    rect.setSize(sf::Vector2f(5, 10));
    rect.setFillColor(sf::Color::Red);
}

void CProjektil::updateProjektil()
{
    if (Richtung == 1) //Projektil nach RECHTS
    {
        rect.move(m_Projektilgeschwindigkeit,0);
    }
    if (Richtung == 2) //Projektil nach LINKS
    {
        rect.move(-m_Projektilgeschwindigkeit,0);
    }
    if (Richtung == 3) //Projektil nach UNTEN
    {
        rect.move(0,m_Projektilgeschwindigkeit);
    }
    if (Richtung == 4) //Projektil nach OBEN
    {
        rect.move(0,-m_Projektilgeschwindigkeit);
    }
}

13

03.04.2016, 16:56

An der Stelle mal der Hinweis den Debuger zu benutzen!

Beim drüber schauen ist mir nichts aufgefallen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

14

03.04.2016, 17:02

Wichtig: Lerne den Unterschied zwischen

for(auto i : iterable)

for(auto& i : iterable)

for(auto&& i : iterable)

kennen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

15

03.04.2016, 17:27

An der Stelle mal der Hinweis den Debuger zu benutzen!

Habe ich laufen lassen, spuckt keine Fehler aus. Programm macht trotzdem nicht, was es soll :huh:

Wichtig: Lerne den Unterschied zwischen

for(auto i : iterable)

for(auto& i : iterable)

for(auto&& i : iterable)

kennen.

ohne &, wenn man den Wert nicht modifiziert. Das sollte ich also nicht nehmen, da wir ja den .rect Wert in updateProjektil ändern oder?

Der Unterschied zwischen & und && ist mir jetzt noch nicht wirklich klar. Irgendetwas mit r und l-value. Habe gelesen ein r-Value kann nur rechts von einer Zuweisung stehen.
Heißt das jetzt, dass ich das nicht nehmen kann, weil z.B. bei

C-/C++-Quelltext

1
Projektil1.Richtung = Spieler1.Richtung;

die Richtung auch links vorkommt? Heißt das jetzt ich muss auto&& verwenden?

16

03.04.2016, 17:39

An der Stelle mal der Hinweis den Debuger zu benutzen!

Habe ich laufen lassen, spuckt keine Fehler aus. Programm macht trotzdem nicht, was es soll :huh:

Deine Antwort lässt mich erahnen das du den Debuger nicht benutzt hast.
Debugger != Compiler

Mit dem Debuger kannst du prüfen ob auch alles so läuft (logische Fehler) wie du es möchtest/vorhattest.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

17

03.04.2016, 17:50

Naja ... oben beim Microsoft Visual Studio oben auf Debug und dann Start Debugging oder?

18

03.04.2016, 17:59

Vorher neben dem Code ein breakpoint setzten (mit der Maus klicken).
Dann unterbricht das Programm und du kannst dir anschauen was im Detail passiert.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

19

03.04.2016, 18:09

Vorher neben dem Code ein breakpoint setzten (mit der Maus klicken).

Ist es egal, wo ich den Breakpoint setze?

20

03.04.2016, 18:11

Vorangig da wo du glaubst das etwas schief läuft.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige