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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

20.07.2015, 18:52

Typename-Error

Hallo Leute,

ich programmiere im 2-er Team Snake und im laufe des Spiels sollte man auch die Richtung der Schlange ändern können :) . Dazu haben wir eine Methode geschrieben, die das machen soll:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Player::ChangeDirection(Direction dir)
{
    // Darf nicht komplett die Richtung ändern (von UP zu DOWN, ...)
    if ((direction == UP && dir == DOWN) ||
        (direction == LEFT && dir == RIGHT) ||
        (direction == RIGHT && dir == LEFT) ||
        (direction == DOWN && dir == UP))
    {
        return;
    }
    direction = dir;

}


Nun bekomme ich folgenden Fehler:
Fehler 1 error C2597: Ungültiger Verweis auf nicht-statischen Member 'Player::Direction'
Fehler 2 error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'dir'
Fehler 3 error C2761: 'void Player::ChangeDirection(Direction)': Die erneute Deklaration der Memberfunktion ist unzulässig
Fehler 4 error C2059: Syntaxfehler: ')

Hier die Deklaration in der Header:

C-/C++-Quelltext

1
void ChangeDirection(Direction dir);


Vielen Dank im Voraus!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cojo2015« (20.07.2015, 20:57)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

20.07.2015, 18:56

Bist du sicher das ChangeDirection eine Funktion ist? Für mich sieht das aus wie eine Methode wenn Player:: davor steht.

3

20.07.2015, 19:02

Vielleicht stimmt etwas mit dem Direction nicht

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SlyGamer72HD« (20.07.2015, 19:23)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

21.07.2015, 11:50

Und wie wurde Direction deklariert/definiert?
@SlyGamer72HD: Wenn man seinen Beitrag zitiert, sieht man, dass der Fehler auf Player::Direction und nicht auf Player::direction verweist, es wird also sehr wahrscheinlich daran liegen. ;)

Abgesehen davon würde ich dir empfehlen, nicht zu prüfen, ob die Ausnahme vorliegt, um dann abzubrechen und andernfalls den Normalfall zu behandeln, sondern zu prüfen, ob es sich um den "Normalfall" handelt, und andernfalls die Ausnahme zu handhaben. In Falle dieser Methode wäre es nichts, was in Ausnahmefall gemacht werden muss, daher würde die Methode so vereinfacht werden.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

5

21.07.2015, 12:42

Das Prüfen geht übrigens schneller, wenn man Direction als enum{ Up=0, Down=1, Left=2, Right=3} definiert und dann einfach (dir & 2) == (direction & 2) prüft. Siehe bitweise Operatoren: https://de.m.wikipedia.org/wiki/Bitweiser_Operator
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

6

21.07.2015, 13:04

Und wie wurde Direction deklariert/definiert?


Deklaration:

C-/C++-Quelltext

1
2
3
4
5
6
7
enum Direction
{
    UP,
    DOWN,
    LEFT,
    RIGHT
};


Definition:

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
// In der board.cpp

    switch (event.key.code)
    {
    case sf::Keyboard::Up:
        direction_selected = UP;
        break;

    case sf::Keyboard::Down:
        direction_selected = DOWN;
        break;

    case sf::Keyboard::Left:
        direction_selected = LEFT;
        break;

    case sf::Keyboard::Right:
        direction_selected = RIGHT;
        break;

    default:
        break;
    }

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

21.07.2015, 13:50

Ah mein erster Post war quatsch, gerade noch mal gelesen dass ihr ja eine Methode geschrieben habt.

Sieht das aktuell vielleicht so aus?

C-/C++-Quelltext

1
2
3
4
5
class Foo{
   enum Bar{
        A, B, C
   }
}


Dann fehlt das static vor dem enum Bar um auch von außerhalb darauf zuzugreifen: Foo::Bar::A
Du postest etwas wenig Code um das sehen zu können ^^
Nimm doch mal sowas wie pastebin und poste den ganzen header.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

21.07.2015, 13:58


Nimm doch mal sowas wie pastebin und poste den ganzen header.


Hier der ganze Header:

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
#ifndef BOARD_HPP
#define BOARD_HPP

#include <SFML\Graphics.hpp>
#include <memory>

enum Cell
{
    EMPTY,
    FOOD,
    SNAKE
};

enum Direction
{
    UP,
    DOWN,
    LEFT,
    RIGHT
};

class Player;   // Vorwärtsdeklaration

class Board
{
public:
    Board();
    ~Board();

    bool Update_Board();            // Updatet das Spielfeld

    void Change_Direction(const sf::Event& event);


    // getter
    Cell Get_Cell(int x, int y);
    int Get_Length();
    int Get_Score();

private:
    void Place_Food();

private:
    std::unique_ptr<Player> mPlayer;

protected:
    Cell board[40][40];                 // Spielfeld
    Direction direction_selected;       // Bestimmt in welche Richtung der Spieler gezeichnet werden soll
};

#endif

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

21.07.2015, 14:04

Das sieht okay aus, jetzt den Header vom Player.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

10

21.07.2015, 14:05

Header vom Player:

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
#ifndef PLAYER_HPP
#define PLAYER_HPP

#include <deque>

#include "board\include\board.hpp"

struct Point
{
    int x;
    int y;
};

class Game;

class Player : protected Board
{
public:
    Player();
    ~Player();

    bool Update();
    
    // getter
    bool getIsAlive()   { return alive; };
    Point GetHeadPosition();
    Point GetTailPosition();
    int GetLegth();


    // setter
    void setIsAlive(bool isAlive)   { alive = isAlive; }

    std::deque<Point> body; // Alle Koordinaten von der Schlange
    Direction direction;

private:
    void ChangeDirection(Direction dir);
    void loadPlayer();
    void setStartPos();
    void RemoveTail();

private:
    float StartXHead;
    float StartYHead;

    float ElapsedTime;

    int   Direction;    // Richtung, in der sich der Kopf bewegt
    int   Length;       // Länge des Spielers

    bool alive;

};

#endif

Werbeanzeige