C++ error C2065, kann Fehler aber nicht finden!

vdrenzo

Cadet 1st Year
Registriert
Mai 2017
Beiträge
13
Hallo Zusammen,

ich habe ein Spiel programmiert um C++ zu lernen und in meiner anfänglichen Version ging noch alles. Nun habe ich ein paar Dinge geändert um ein Hauptmenu etc...(also verschiedene GameStates) hinzuzufügen.

Das Spiel ist ein Clon von CurveFever, wie gesagt, um C++ zu lernen.

Jetzt bekomme ich immer den "error C2065: "PowerUp": nichtdeklarierter Bezeichner" Fehler. Eigentlich kein Ding, aber ich kann meinen Fehler einfach nicht finden und hocke nun schon seit einer Woche dran - bin hart am verzweifeln.

Ich nehme an es liegt an meiner falschen Anwendung der #include Direktive.
Bitte nicht erschrecken, es sind viele Dateien - ich hoffe Ihr könnt mir helfen und ich etwas dazulernen!

Der Fehler:
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(27): error C2065: "PowerUp": nichtdeklarierter Bezeichner
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(27): error C2923: "std::vector": "PowerUp" ist kein gültiges Vorlage-Typargument für den _Ty-Parameter.
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(27): error C3203: "allocator" : Klasse Vorlage (nicht spezialisiert) kann nicht als Vorlage-Argument für den Vorlage-Parameter "_Alloc" verwendet werden, ein realer Typ wurde erwartet.
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\powerup.cpp(15): warning C4244: "Argument": Konvertierung von "int" in "float", möglicher Datenverlust
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\powerup.cpp(39): warning C4244: "+=": Konvertierung von "sf::Int64" in "int", möglicher Datenverlust
1>Player.cpp
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(26): error C2065: "Player": nichtdeklarierter Bezeichner
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(26): error C2923: "std::vector": "Player" ist kein gültiges Vorlage-Typargument für den _Ty-Parameter.
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(26): error C3203: "allocator" : Klasse Vorlage (nicht spezialisiert) kann nicht als Vorlage-Argument für den Vorlage-Parameter "_Alloc" verwendet werden, ein realer Typ wurde erwartet.
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\player.cpp(17): warning C4244: "Argument": Konvertierung von "int" in "float", möglicher Datenverlust
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\player.cpp(32): warning C4244: "=": Konvertierung von "double" in "float", möglicher Datenverlust


Der Code:
Code:
//PlayState.h
#pragma once
#include <iostream>
#include<SFML\Graphics.hpp>
#include <SFML\System\Vector2.hpp>
#include <SFML\OpenGL.hpp>
//#include "Gamestate.h"
#include "Game.h"
#include "eV.h"
//#include <vector>
#include "PowerUp.h"
#include "Player.h"
#define _USE_MATH_DEFINES 
#include <math.h>
#include <cmath> 


class PlayState : public Gamestate
{
public:
	PlayState();
	~PlayState();
	void HandleEvents(Game& game);
	void Update(Game& game);
	void Draw(Game& game);
	void HandlePowerups();
	std::vector<Player> players;
	std::vector<PowerUp> powerups;
	
private:
	
	sf::Font font;
	sf::Text playtxt;
	int width, height,k;
	float elapsedTime, pTime, pTime2;
	float speed;
	std::vector<sf::Color> C;
	std::vector<sf::Keyboard::Key> K;
	sf::Texture speedmintxt;
	sf::Texture speedmaxtxt;
	sf::Texture dicktxt;
	sf::Texture duenntxt;
	sf::Clock clock;
	sf::RectangleShape rectsplit;
};

Code:
//PlayState.cpp
#pragma once
#include "PlayState.h"

int score=0;

PlayState::PlayState()
{
	width = 600;
	height = 600;
	pTime = 0;
	pTime2 = 0;
	k = 0;
	//setup
	speedmintxt.loadFromFile("speedmintxt.png");
	speedmaxtxt.loadFromFile("speedmaxtxt.png");
	dicktxt.loadFromFile("dicktxt.png");
	duenntxt.loadFromFile("duenntxt.png");
	speed = 0.0015;

	C.resize(4);
	C[0] = sf::Color::Blue;
	C[1] = sf::Color::Red;
	C[2] = sf::Color::Green;
	C[3] = sf::Color::Yellow;
	K.resize(8);
	K[0] = sf::Keyboard::Right;
	K[1] = sf::Keyboard::S;
	K[2] = sf::Keyboard::V;
	K[3] = sf::Keyboard::Num2;
	K[4] = sf::Keyboard::Left;
	K[5] = sf::Keyboard::A;
	K[6] = sf::Keyboard::B;
	K[7] = sf::Keyboard::Num3;

	for (int i = 0; i < Number; i++)
	{
		sf::Vector2<int> x(rand() % width, rand() % height);
		Player nP(C[i], x, K[i], K[i + 4]);
		players.push_back(nP);
	}
}

void PlayState::HandleEvents(Game& game)
{
	elapsedTime = clock.restart().asMicroseconds();
	pTime += elapsedTime;
	pTime2 += elapsedTime;

	sf::Event event;
	while (game.window.pollEvent(event))
	{
		switch (event.type)
		{
		case sf::Event::Closed:
			game.window.close();
			game.running = false;
			break;
		case sf::Event::KeyPressed:
			if (event.key.code == sf::Keyboard::Escape)
			{
				game.ChangeState(Game::gameStates::MAINMENU);
			}
			break;
		}

	}

}

void PlayState::HandlePowerups()
{
	//powerups spawnen
	if (pTime2 > 4000000)
	{
		int z = rand() % 4;
		if (z == 0)
		{
			PowerUp Pow(speedmintxt, 0,5000000);
			powerups.push_back(Pow);
		}
		else if (z == 1)
		{
			PowerUp Pow(speedmaxtxt, 1,5000000);
			powerups.push_back(Pow);
		}
		else if (z == 2)
		{
			PowerUp Pow(dicktxt, 2, 5000000);
			powerups.push_back(Pow);
		}
		else if (z == 3)
		{
			PowerUp Pow(duenntxt, 3, 5000000);
			powerups.push_back(Pow);
		}
		pTime2 = 0;
	}

	//check PowerUp Time
	for (int i = 0; i < powerups.size(); i++)
	{
		int m = powerups[i].Time();
		if(m==1)
		powerups.erase(powerups.begin() + i);
	}
}

void PlayState::Update(Game& game)
{	
	HandlePowerups();

	for (int i = 0; i < players.size(); i++)
	{
		players[i].Update(game, elapsedTime);
	}
}

void PlayState::Draw(Game& game)
{
	for (int i = 0; i < players.size(); i++)
	{
		players[i].Draw(game);
	}


	for (int i = 0; i < powerups.size(); i++) {
		powerups[i].Render(game);
	}

	rectsplit.setSize(sf::Vector2f(5, height));
	rectsplit.setPosition(sf::Vector2f(width - 200, 0));
	rectsplit.setFillColor(sf::Color(220,220,220));
	game.window.draw(rectsplit);

	game.window.display();

}

PlayState::~PlayState()
{
	std::cout << "GameScreen destruktor wurde aufgerufen" << std::endl;
}

Code:
//PowerUp.h
#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Game.h"

class PowerUp
{
public:
	PowerUp(sf::Texture &a, int type, int lifetime);
	int Type();
	int Eaten(sf::Vector2f x);
	void Render(Game& game);
	int Time();
	
private:
	int type2, lifetime2;
	sf::Texture textur;
	sf::Sprite sprite;
	bool Active;
	int eT;
	sf::Clock clock;
};

Code:
//PowerUp.cpp
#pragma once
#include "PowerUp.h"

PowerUp::PowerUp(sf::Texture &a, int type, int lifetime)
{
	lifetime2 = lifetime;
	type2 = type;
	sprite.setTexture(a);
	eT = 0;
	clock.restart().asMicroseconds();
	if (type == 0 || type == 1 || type==2 ||type==3)
	{
		sprite.setOrigin(300, 300);
		sprite.scale(.05f, .05f);
		sprite.setPosition(rand() % 741, rand() % 535);
	}
}


int PowerUp::Type()
{
	return type2;
}

int PowerUp::Eaten(sf::Vector2f x)
{
	if (sprite.getGlobalBounds().contains(x))
	{
		return type2;
	}
	else
	{
		return -1;
	}
}

int PowerUp::Time()
{
	eT += clock.restart().asMicroseconds();
	if (eT > lifetime2)
	{
		return 1;
	}
	else 
	{
		return 0;
	}
}

void PowerUp::Render(Game& game)
{
	game.window.draw(sprite);
}

Ok..das sind jetzt mal die PlayState.h /cpp und PowerUp.h/cpp
bei Bedarf kann ich auch den restlichen Code posten.
 
vdrenzo schrieb:
Code:
1>c:\users\vinc\documents\visual studio 2017\projects\curvefever4\curvefever4\playstate.h(27): 
error C2065: "PowerUp": nichtdeklarierter Bezeichner
und
Code:
// PlayState.h
 ...
 ...
// #include "Gamestate.h"   <== Hier auskommentiert?
 ... ...
 ...

class PlayState : public Gamestate   // <== Gamestate?
{
public:
    PlayState();
    ~PlayState();
    void HandleEvents(Game& game);
    void Update(Game& game);
    void Draw(Game& game);
    void HandlePowerups();
    std::vector<Player> players;
 ...
  ...

Was hast Du denn am Originalprojekt genau geändert, das dazu führte, daß es nicht mehr compilierte?
 
Wahrscheinlich inkludiert beim kompilieren von Powerup.cpp die Game.h die Playstate.h. Dann ist Powerup unbekannt.
 
Zuletzt bearbeitet von einem Moderator:
Was heißt das?
Ergänzung ()

Ich habe im Vergleich zum Vorgänger in der es nur den PlayState gab und die PowerUp.h und die Player.h gab anderen Gamestates hinzugefügt.
Ergänzung ()

Hier noch die restlichen Dateien:

Code:
//main.cpp
#pragma once
#include "Game.h"

int main()
{
	Game Curve;
	Curve.ChangeState(Game::gameStates::MAINMENU);

	while (Curve.isRunning())
	{
		Curve.Run();
	}

	return 0;
}

Code:
//Game.h
#pragma once
#ifndef GAME_HPP
#define GAME_HPP

#include <iostream>
#include <memory>
#include <SFML/Graphics.hpp>
#include "Gamestate.h"
#include "MainMenuState.h"
#include "PlayerSelectState.h"
#include "PlayState.h"

class Game
{
public:
	Game();

	enum class gameStates { MAINMENU, PLAYERSELECT, PLAY };

	void Run();
	bool isRunning();
	void ChangeState(gameStates newstate);
	bool running;
	sf::RenderWindow window;

private:
	std::unique_ptr<Gamestate> CurrentState;
};

#endif

Code:
//Game.cpp
#pragma once
#include "Game.h"

Game::Game()
{
	window.create(sf::VideoMode(1280, 720), "Curve Fever 4");
	running = true;
}

void Game::Run()
{
	while (window.isOpen())
	{
		CurrentState->HandleEvents(*this);

		window.clear(sf::Color(0, 0, 0));

		CurrentState->Update(*this);
		CurrentState->Draw(*this);

		window.display();
	}
}

bool Game::isRunning()
{
	return running;
}

void Game::ChangeState(gameStates newState)
{
	switch (newState)
	{
	case gameStates::MAINMENU:
		CurrentState = std::move(std::unique_ptr<MainMenuState>(new MainMenuState));
		break;

	case gameStates::PLAYERSELECT:
		CurrentState = std::move(std::unique_ptr<PlayerSelectState>(new PlayerSelectState));
		break;
	case gameStates::PLAY:
		CurrentState = std::move(std::unique_ptr<PlayState>(new PlayState));
		break;
	}
}

Code:
//Gamestate.h
#pragma once
#ifndef GAMESTATE_HPP
#define GAMESTATE_HPP

class Game; //vorwaertsdeklaration

class Gamestate
{
public:
	virtual void HandleEvents(Game& game) = 0;
	virtual void Update(Game& game) = 0;
	virtual void Draw(Game& game) = 0;
	virtual		 ~Gamestate() {};
};

#endif

Code:
//MainMenuState.h
#pragma once
#ifndef MAINMENUSTATE_HPP
#define MAINMENUSTATE_HPP

#include <SFML/Graphics.hpp>
#include "Game.h"

class MainMenuState : public Gamestate
{
public:
	MainMenuState();
	~MainMenuState();
	void HandleEvents(Game& game);
	void Update(Game& game);
	void Draw(Game& game);
	

private:

	void moveup();
	void movedown();

	int width, height, Pos;
	sf::Font font;
	sf::Text playtxt;
	sf::Text exittxt;
};

#endif

Code:
//MainMenuState.cpp
#pragma once
#include "MainMenuState.h"

MainMenuState::MainMenuState()
{
	font.loadFromFile("Jokerman.TTF");
	
	width = 600;
	height = 600;

	playtxt.setFont(font);
	playtxt.setOrigin(40, 40);
	playtxt.setPosition(width / 2, height / 2);
	playtxt.setCharacterSize(30);
	playtxt.setString("Play!");
	playtxt.setFillColor(sf::Color::Red);
	
	exittxt.setFont(font);
	exittxt.setOrigin(40, 40);
	exittxt.setPosition(width / 2, height / 2 + 50);
	exittxt.setCharacterSize(30);
	exittxt.setString("Exit!");
	exittxt.setFillColor(sf::Color(220, 200, 220));

	Pos = 0;

}

void MainMenuState::moveup()
{
	if (Pos == 0)
	{
		Pos = 1;
		playtxt.setFillColor(sf::Color(220, 200, 220));
		exittxt.setFillColor(sf::Color::Red);
	}
	else
	{
		Pos = 0;
		playtxt.setFillColor(sf::Color::Red);
		exittxt.setFillColor(sf::Color(220, 200, 220));
	}
}

void MainMenuState::movedown()
{
	if (Pos == 0)
	{
		Pos = 1;
		playtxt.setFillColor(sf::Color(220, 200, 220));
		exittxt.setFillColor(sf::Color::Red);
	}
	else
	{
		Pos = 0;
		playtxt.setFillColor(sf::Color::Red);
		exittxt.setFillColor(sf::Color(220, 200, 220));
	}
}

void MainMenuState::HandleEvents(Game& game)
{
	sf::Event event;

	while (game.window.pollEvent(event))
	{
		switch (event.type)
		{
		case sf::Event::Closed:
			game.window.close();
			game.running = false;
			break;

		case sf::Event::KeyPressed:
			if (event.key.code == sf::Keyboard::Up)
			{
				moveup();
			}
			if (event.key.code == sf::Keyboard::Down)
			{
				movedown();
			}
			if (event.key.code == sf::Keyboard::Return)
			{
				switch (Pos)
				{
				case 0:
					game.ChangeState(Game::gameStates::PLAYERSELECT);
					break;
				case 1:
					game.window.close();
					game.running = false;
					break;
				}
			}
			break;
		}
	}
}

void MainMenuState::Update(Game& game)
{
	
}

void MainMenuState::Draw(Game& game)
{
	game.window.draw(playtxt);
	game.window.draw(exittxt);
}

MainMenuState::~MainMenuState()
{
	std::cout << "Menuedestruktor wurde aufgerufen" << std::endl;
}

Code:
//PlayerSelectState.h
#pragma once
#ifndef PLAYSTATE_HPP
#define PLAYSTATE_HPP

#include "Game.h"
//#include "Gamestate.h"
#include "eV.h"

class PlayerSelectState : public Gamestate
{
public:
	PlayerSelectState();
	~PlayerSelectState();
	void HandleEvents(Game& game);
	void Update(Game& game);
	void Draw(Game& game);

private:
	
	sf::Font font;
	sf::Text atxt, btxt;
	void moveup();
	void movedown();
	int width, height;
	int global;
};

#endif

Code:
PlayerSelectState.cpp
#pragma once
#include "PlayerSelectState.h"

int Number;

PlayerSelectState::PlayerSelectState()
{
	width = 600;
	height = 600;

	font.loadFromFile("Jokerman.TTF");
	
	atxt.setFont(font);
	atxt.setOrigin(40, 40);
	atxt.setPosition(width / 2 - 100, height / 2);
	atxt.setCharacterSize(30);
	atxt.setString("# Player");
	atxt.setFillColor(sf::Color(220, 200, 220));
	
	btxt.setFont(font);
	btxt.setOrigin(40, 40);
	btxt.setPosition(width / 2 + 100, height / 2);
	btxt.setCharacterSize(30);
	btxt.setString("1");
	btxt.setFillColor(sf::Color::Red);
	
	Number = 1;
}

void PlayerSelectState::moveup()
{
	Number++;
	if (Number == 5)
		Number = 1;
	btxt.setString(std::to_string(Number));
}

void PlayerSelectState::movedown()
{
	Number--;
	if (Number == 0)
		Number = 4;
	btxt.setString(std::to_string(Number));
}

void PlayerSelectState::HandleEvents(Game& game)
{
	sf::Event event;

	while (game.window.pollEvent(event))
	{
			switch (event.type)
			{
			case sf::Event::Closed:
				game.window.close();
				game.running = false;
				break;
			case sf::Event::KeyPressed:
				if (event.key.code == sf::Keyboard::Up)
				{
					moveup();
				}
				if (event.key.code == sf::Keyboard::Down)
				{
					movedown();
				}
				if (event.key.code == sf::Keyboard::Return)
				{
					game.ChangeState(Game::gameStates::PLAY);
					break;
				}
				if (event.key.code == sf::Keyboard::Escape)
				{
					game.ChangeState(Game::gameStates::MAINMENU);
					break;
				}
			}
	}
}

void PlayerSelectState::Update(Game& game)
{

}

void PlayerSelectState::Draw(Game& game)
{
	game.window.draw(atxt);
	game.window.draw(btxt);
}

PlayerSelectState::~PlayerSelectState()
{
	std::cout << "Playstate wurde zerstoerst" << std::endl;
}

Code:
//Player.h
#pragma once
#include <iostream>
#include <SFML\Graphics.hpp>
#include <SFML\System\Vector2.hpp>
#include <SFML\Graphics\Rect.hpp>
#include <SFML\OpenGL.hpp>
#define _USE_MATH_DEFINES 
#include <math.h>
#include <cmath> 
#include "Game.h"
#include "PowerUp.h"


class Player
{
public:
	Player(sf::Color col, sf::Vector2<int> pos, sf::Keyboard::Key K1, sf::Keyboard::Key K2);
	void Update(Game& game, float &elapsedTime);
	void PchangeSpeed(float s);
	void Draw(Game& game);
	std::vector<float> sinus, cosinus;
	float alpha;
	float speed;
	sf::Vector2<float> R;
	void Player::Collision(Game& game);
	//std::vector<sf::FloatRect> Trace;
	std::vector<sf::FloatRect> Trace;
	sf::Vector2f getHead();
	std::vector<sf::Vertex> vertices;
	std::vector<std::vector<sf::Vertex>> tris;
	std::vector<sf::Vertex> tri;
	

private:
	sf::Font font;
	sf::Text playtxt;
	int width, height;
	sf::CircleShape circle;
	sf::Keyboard::Key Key1;
	sf::Keyboard::Key Key2;
	sf::Vector2f P,oldP,D;
	
	sf::RectangleShape rect;
	int n = 0;
	int m = 0;
	int eT,z,count,r,thickness;
	double randomN;
	bool gameoverB = false;
	bool hole = false;
	bool Peaten=false;
	sf::Color Col, oldCol;
};

Code:
//Player.cpp
#pragma once
#include "Player.h"


//#include "eV.h"

std::vector< unsigned char > pixels(1 * 1 * 3);



Player::Player(sf::Color col, sf::Vector2<int> pos, sf::Keyboard::Key K1, sf::Keyboard::Key K2)
{
	width = 600;
	height = 600;
	circle.setRadius(6);
	circle.setOrigin(circle.getRadius(), circle.getRadius());
	circle.setPosition(pos.x,pos.y);
	//sf::Vector2f m = circle.getPosition();
	circle.setFillColor(col);

	sf::Vertex vertex(circle.getPosition(), col);
	vertices.push_back(vertex);
	Col = col;

	Key1 = K1;
	Key2 = K2;

	sinus.resize(32);
	cosinus.resize(32);
	for (int j = 0; j < 32; j++)
	{
		sinus[j] = sin((M_PI / 16) * j)*0.1;
		cosinus[j] = cos((M_PI / 16) * j)*0.1;
	}
	alpha = 8;
	R = { 0.07f,0.07f };
	z = 0;
	count = 0;
	randomN = 0;
	r = 0;
	speed = 0.0015;
	thickness = 5;
}

void Player::Update(Game& game, float &elapsedTime)
{
	eT = elapsedTime;
	
	if (gameoverB == false) {
		if (sf::Keyboard::isKeyPressed(Key1))
		{
			alpha = alpha + 0.015*0.002*elapsedTime;
			if (alpha >= 32)
			{
				alpha = 0;
			}
			R.x = cosinus[alpha];
			R.y = sinus[alpha];
		}
		if (sf::Keyboard::isKeyPressed(Key2))
		{
			alpha = alpha - 0.015*0.002*elapsedTime;
			if (alpha < 0)
			{
				alpha = 31.9999;
			}
			R.x = cosinus[alpha];
			R.y = sinus[alpha];
		}
		//circle.move(R.x*elapsedTime*speed, R.y*elapsedTime*speed);
	}
}

void Player::PchangeSpeed(float s)
{
	speed = speed*s;
}

sf::Vector2f Player::getHead()
{
	return sf::Vector2f(circle.getPosition());
}

void Player::Collision(Game& game)
{
	
	z += eT; //Loch erzeugung nach random zeit
	if (z>randomN)
	{	
		z = 0;
		randomN = (rand() % 5000000)+2000000;
		hole = true;
	}
		
		n++; //Spur zeichnen in 100 Frames Schritten
		if (n > 100*(0.002/speed))
		{
			n = 0;
			P = circle.getPosition();
			float N = 1 / (sqrt(R.x*R.x + R.y*R.y));
			
			if(hole==true) //Loch zeichnung
			{
				count++;
				if (count == 1)
				{
					oldCol = Col;
					Col = sf::Color::Black;
					r = (rand() % 15)+10; //lochbreite in x100 Frames
				}
				if (count == r)
				{
					Col = oldCol;
					hole = false;
					count = 0;
				}
			}
			sf::Vertex vertex(sf::Vector2f(P.x + N*R.y * thickness, P.y - N*R.x * thickness), Col);
			vertices.push_back(vertex);
			sf::Vertex vertex2(sf::Vector2f(P.x - N*R.y*thickness, P.y + N*R.x*thickness), Col);
			vertices.push_back(vertex2);
		}
		
		game.window.draw(&vertices[0], vertices.size(), sf::TriangleStrip);

	//Collisions-Erkennung
		//m++;
		//if (m > 100*(0.002 / speed)) //alle 100 Frame Pixel auslesen
		//{
		//	m = 0;
		//	
		//	glReadBuffer(GL_FRONT); //pixel auslesen
		//	glReadPixels(P.x+ R.x*120, 600-P.y-R.y*120, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixels[0]); //Pixel Pos vorm kopf
		//	std::cout << std::to_string(pixels[0]) << " " << std::to_string(pixels[1]) << " " << std::to_string(pixels[2]) << std::endl;
		//	
		//	if (pixels[0] == 0 && pixels[1] == 0 && pixels[2] == 0) 
		//		{//wenn schwarz passiert nichts
		//		}
		//	else
		//	{//sonst Überprüfung ob Powerup gegessen
		//		for (int i = 0; i < powerups.size(); i++)
		//		{ // wenn ja wende powerup an
		//			float m = powerups[i].Eaten(sf::Vector2f(P.x+R.x*120,P.y+R.y*120));
		//			if (m == 0)
		//			{
		//				PchangeSpeed(0.8);
		//				powerups.erase(powerups.begin() + i);
		//				Peaten = true;
		//			}
		//			if (m == 1)
		//			{
		//				PchangeSpeed(1.2);
		//				powerups.erase(powerups.begin() + i);
		//				Peaten = true;
		//			}
		//			if (m == 2)
		//			{
		//				thickness+=3;
		//				powerups.erase(powerups.begin() + i);
		//				Peaten = true;
		//			}
		//			if (m == 3)
		//			{
		//				thickness -= 3;
		//				powerups.erase(powerups.begin() + i);
		//				Peaten = true;
		//			}
		//		}
		//		if (Peaten == false) //wenn nein--> GameOver
		//		{
		//			std::cout << "gameover" << std::endl;
		//			R = { 0,0 };
		//			gameoverB = true;
		//		}
		//		Peaten = false;//falls powerup gegessen Indikator zurücksetzten
		//	}
		//}
		circle.move(R.x*eT*speed, R.y*eT*speed);
}

void Player::Draw(Game& game)
{
	Collision(game);
	game.window.draw(circle);
}

Code:
//PlayState.h
#pragma once
#include <iostream>
#include<SFML\Graphics.hpp>
#include <SFML\System\Vector2.hpp>
#include <SFML\OpenGL.hpp>
//#include "Gamestate.h"
#include "Game.h"
#include "eV.h"
//#include <vector>
#include "PowerUp.h"
#include "Player.h"
#define _USE_MATH_DEFINES 
#include <math.h>
#include <cmath> 


class PlayState : public Gamestate
{
public:
	PlayState();
	~PlayState();
	void HandleEvents(Game& game);
	void Update(Game& game);
	void Draw(Game& game);
	void HandlePowerups();
	std::vector<Player> players;
	std::vector<PowerUp> powerups;
	
private:
	
	sf::Font font;
	sf::Text playtxt;
	int width, height,k;
	float elapsedTime, pTime, pTime2;
	float speed;
	std::vector<sf::Color> C;
	std::vector<sf::Keyboard::Key> K;
	sf::Texture speedmintxt;
	sf::Texture speedmaxtxt;
	sf::Texture dicktxt;
	sf::Texture duenntxt;
	sf::Clock clock;
	sf::RectangleShape rectsplit;
	
};

Code:
//PlayState.cpp
#pragma once
#include "PlayState.h"

int score=0;

PlayState::PlayState()
{
	width = 600;
	height = 600;
	pTime = 0;
	pTime2 = 0;
	k = 0;
	//setup
	speedmintxt.loadFromFile("speedmintxt.png");
	speedmaxtxt.loadFromFile("speedmaxtxt.png");
	dicktxt.loadFromFile("dicktxt.png");
	duenntxt.loadFromFile("duenntxt.png");
	speed = 0.0015;

	C.resize(4);
	C[0] = sf::Color::Blue;
	C[1] = sf::Color::Red;
	C[2] = sf::Color::Green;
	C[3] = sf::Color::Yellow;
	K.resize(8);
	K[0] = sf::Keyboard::Right;
	K[1] = sf::Keyboard::S;
	K[2] = sf::Keyboard::V;
	K[3] = sf::Keyboard::Num2;
	K[4] = sf::Keyboard::Left;
	K[5] = sf::Keyboard::A;
	K[6] = sf::Keyboard::B;
	K[7] = sf::Keyboard::Num3;

	for (int i = 0; i < Number; i++)
	{
		sf::Vector2<int> x(rand() % width, rand() % height);
		Player nP(C[i], x, K[i], K[i + 4]);
		players.push_back(nP);
	}
}

void PlayState::HandleEvents(Game& game)
{
	elapsedTime = clock.restart().asMicroseconds();
	pTime += elapsedTime;
	pTime2 += elapsedTime;

	sf::Event event;
	while (game.window.pollEvent(event))
	{
		switch (event.type)
		{
		case sf::Event::Closed:
			game.window.close();
			game.running = false;
			break;
		case sf::Event::KeyPressed:
			if (event.key.code == sf::Keyboard::Escape)
			{
				game.ChangeState(Game::gameStates::MAINMENU);
			}
			break;
		}

	}

}

void PlayState::HandlePowerups()
{
	//powerups spawnen
	if (pTime2 > 4000000)
	{
		int z = rand() % 4;
		if (z == 0)
		{
			PowerUp Pow(speedmintxt, 0,5000000);
			powerups.push_back(Pow);
		}
		else if (z == 1)
		{
			PowerUp Pow(speedmaxtxt, 1,5000000);
			powerups.push_back(Pow);
		}
		else if (z == 2)
		{
			PowerUp Pow(dicktxt, 2, 5000000);
			powerups.push_back(Pow);
		}
		else if (z == 3)
		{
			PowerUp Pow(duenntxt, 3, 5000000);
			powerups.push_back(Pow);
		}
		pTime2 = 0;
	}

	//check PowerUp Time
	for (int i = 0; i < powerups.size(); i++)
	{
		int m = powerups[i].Time();
		if(m==1)
		powerups.erase(powerups.begin() + i);
	}
}

void PlayState::Update(Game& game)
{	
	HandlePowerups();

	for (int i = 0; i < players.size(); i++)
	{
		players[i].Update(game, elapsedTime);
	}
}

void PlayState::Draw(Game& game)
{
	for (int i = 0; i < players.size(); i++)
	{
		players[i].Draw(game);
	}


	for (int i = 0; i < powerups.size(); i++) {
		powerups[i].Render(game);
	}

	rectsplit.setSize(sf::Vector2f(5, height));
	rectsplit.setPosition(sf::Vector2f(width - 200, 0));
	rectsplit.setFillColor(sf::Color(220,220,220));
	game.window.draw(rectsplit);

	game.window.display();

}

PlayState::~PlayState()
{
	std::cout << "GameScreen destruktor wurde aufgerufen" << std::endl;
}

Code:
//PowerUp.h
#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Game.h"

class PowerUp
{
public:
	PowerUp(sf::Texture &a, int type, int lifetime);
	int Type();
	int Eaten(sf::Vector2f x);
	void Render(Game& game);
	int Time();
	
private:
	int type2, lifetime2;
	sf::Texture textur;
	sf::Sprite sprite;
	bool Active;
	int eT;
	sf::Clock clock;
};

Code:
//PowerUp.cpp
#pragma once
#include "PowerUp.h"

PowerUp::PowerUp(sf::Texture &a, int type, int lifetime)
{
	lifetime2 = lifetime;
	type2 = type;
	sprite.setTexture(a);
	eT = 0;
	clock.restart().asMicroseconds();
	if (type == 0 || type == 1 || type==2 ||type==3)
	{
		sprite.setOrigin(300, 300);
		sprite.scale(.05f, .05f);
		sprite.setPosition(rand() % 741, rand() % 535);
	}
}


int PowerUp::Type()
{
	return type2;
}

int PowerUp::Eaten(sf::Vector2f x)
{
	if (sprite.getGlobalBounds().contains(x))
	{
		return type2;
	}
	else
	{
		return -1;
	}
}

int PowerUp::Time()
{
	eT += clock.restart().asMicroseconds();
	if (eT > lifetime2)
	{
		return 1;
	}
	else 
	{
		return 0;
	}
}

void PowerUp::Render(Game& game)
{
	game.window.draw(sprite);
}


Ok...hier mal der gesamte Code. Ich weiß es ist viel...Auf jeden Fall Danke an die die schon draufgeguggt haben und werden!
Ergänzung ()

Ja die Game.h inkludiert die PlayState.h aber warum ist dann die PowerUp unbekannt?
 
1. Powerup.cpp wird kompiliert.
2. Game.h wird inkludiert.
3. Playstate.h wird inkludiert.
4. Hier wird in Zeile 27 Powerup benötigt wegen std::vector<Powerup> (größe muss bekannt sein). Powerup.h wird aber erst später inkludiert. Deshalb ist es an der Stelle unbekannt.

Dadurch hast du einen Include bzw. Designfehler. Am leichtesten (aber nicht am korrektesten) kannst du das jetzt beheben in dem du #include "Game.h" von Powerup.h in Powerup.cpp verschiebst (nach dem include von Powerup.h). und du Game vorwärts deklarierst indem du

class Game;

vor
class Powerup : public....

in Powerup.h schreibst.


Code:
//PowerUp.h
#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>

class Game;
 
class PowerUp
{
public:
	PowerUp(sf::Texture &a, int type, int lifetime);
	int Type();
	int Eaten(sf::Vector2f x);
	void Render(Game& game);
	int Time();
	
private:
	int type2, lifetime2;
	sf::Texture textur;
	sf::Sprite sprite;
	bool Active;
	int eT;
	sf::Clock clock;
};


Code:
//PowerUp.cpp
#pragma once
#include "PowerUp.h"
#include "Game.h"
 
PowerUp::PowerUp(sf::Texture &a, int type, int lifetime)
{
	lifetime2 = lifetime;
	type2 = type;
	sprite.setTexture(a);
	eT = 0;
	clock.restart().asMicroseconds();
	if (type == 0 || type == 1 || type==2 ||type==3)
	{
		sprite.setOrigin(300, 300);
		sprite.scale(.05f, .05f);
		sprite.setPosition(rand() % 741, rand() % 535);
	}
}
 
 
int PowerUp::Type()
{
	return type2;
}
 
int PowerUp::Eaten(sf::Vector2f x)
{
	if (sprite.getGlobalBounds().contains(x))
	{
		return type2;
	}
	else
	{
		return -1;
	}
}
 
int PowerUp::Time()
{
	eT += clock.restart().asMicroseconds();
	if (eT > lifetime2)
	{
		return 1;
	}
	else 
	{
		return 0;
	}
}
 
void PowerUp::Render(Game& game)
{
	game.window.draw(sprite);
}
 
Zuletzt bearbeitet von einem Moderator:
wayne_757 schrieb:
1. Powerup.cpp wird kompiliert.
2. Game.h wird inkludiert.
3. Playstate.h wird inkludiert.
4. Hier wird in Zeile 27 Powerup benötigt wegen std::vector<Powerup> (größe muss bekannt sein). Powerup.h wird aber erst später inkludiert. Deshalb ist es an der Stelle unbekannt.

Danke für die schnelle Antwort! Damit gehts...

Aber wirklich verstanden habe ich es nicht...ich kann deine Punkte 1. bis 3. nachvollziehen, aber wieso powerup.h in Punkt 4 erst später inkludiert wird, verstehe ich nicht, da es ja in power.cpp als erstes drin steht...

Gibt es eine Regel der Reihenfolge oder unter welchem Stichwort kann ich suchen und das nachlesen?
 
Ok ich habs unglücklich formuliert
Der Präprozessor ersetzt die #includes durch den eigentlichen Text.
D.h. zuerst wird durch game.h Playstate.h inkludiert. Dadurch steht nach dem Präprozessor die Klassendeklaration von Playstate vor der PowerUp:

Code:
//PowerUp.h
#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Game.h" /* <-- Hier kommt Playstate.h ins Spiel, dass die Größe von PowerUP kennen muss */
 
class PowerUp /* <-- Hier wird aber erst PowerUp deklariert. */
{
public:
	PowerUp(sf::Texture &a, int type, int lifetime);
	int Type();
	int Eaten(sf::Vector2f x);
	void Render(Game& game); /* Vorwärtsdeklaration reicht hier, da nur eine Referenz übergeben wird */
	int Time();
	
private:
	int type2, lifetime2;
	sf::Texture textur;
	sf::Sprite sprite;
	bool Active;
	int eT;
	sf::Clock clock;
};
 
Super, ich habe es verstanden! Vielen Dank! Wie ich das jetzt korrekt designed haben könnte weiß ich zwar nicht aber das passt schon...danke für die Erklärung!
 
Code:
//a.h
#pragma once
#include "c.h"

struct a
{
};
Code:
//b.h
#pragma once
struct b
{
};
Code:
//c.h
#pragma once
struct c
{
};
Code:
//main.cpp

#include "a.h"
#include "b.h"
#include "c.h"

int main()
{
}
Code:
//Nach dem Präprozessor von main.cpp

struct c
{
};
struct a
{
};
struct b
{
};

int main()
{
}

Du inkludierst zwar a,b,c in main.cpp. Dadurch dass in a.h aber zuerst c.h inkludiert wird rückt die Deklaration von struct c nach ganz oben
 
Zurück
Oben