Beginners Vraag

Status
Niet open voor verdere reacties.
Maar het is ook mogelijk om een andere console te gebruiken toch?? :)

Volgens mij ligt het namelijk ZEKER niet aan de console.h

Want ik verander alleen nog maar dingen in player.h en player.cpp

Groetjes Bierens
 
Hallo, ik ben de schrijver van de tutorial die hier besproken wordt, dus misschien kan ik helpen.

Het probleem met de Console API is inderdaad het makkelijkst op te lossen door de broncode toe te voegen aan je project in plaats van console.a te gebruiken. Overigens is de Console API geen onderdeel van DevC++, maar een stukje code dat ik zelf geschreven heb.

Het probleem met Player kan wel eens te maken hebben met het feit dat je player.cpp include. In C++ include je (bijna) nooit een cpp-bestand, alleen maar een .h-bestand. Je moet de regel
#include "player.cpp"
dus vervangen door
#include "player.h"
Hetzelfde geldt voor console.cpp; dat moet console.h zijn.

Dan nog iets ter opheldering. Er is niets mis met de code van CreatePlayer(). Het teruggeven van de variabele met de speler die je net hebt aangemaakt is geen probleem. Het gaat om de volgende functie.

Code:
Player CreatePlayer()
{
	// maak nieuwe speler
	Player myPlayer;

	// stel standaardwaarden in
	myPlayer.X = 40;
	myPlayer.Y = 12;
	myPlayer.Direction = 0;

	// geef speler terug
	return myPlayer;
}

Zoals je aan de eerste regel kunt zien, moet deze functie een waarde van het type Player teruggeven. Dat gebeurt met het statement return myPlayer. myPlayer wordt aangemaakt met het statement Player myPlayer. Het klopt dat myPlayer ophoudt te bestaan zodra de functie stopt (dus na de return), maar C++ maakt een kopie van myPlayer en die kopie is wat je terugkrijgt uit de functie. Met class en struct heeft dat dus niets te maken.

Code:
int mijn_functie()
{
    int x = 5;    // hier begint x zijn leven als een int
    return x;    // hier maakt C++ een kopie van x en deze kopie wordt teruggegeven
} // hier houdt x op met bestaan (maar dat is oké, want we hebben een kopie)

void main()
{
    int y = mijn_functie();    // de kopie van x komt hier in y terecht
}
 
Sorry dat ik hier beetje laat op reageer, dit probleem had ik al een tijdje verholpen....

Maar wees niet getreurd, Want ik heb nog een probleem....

Ik probeer nu mijn Pengo te compilen en krijg weer verschillende errors.

Zit in het onderdeel LEVEL.

Level.cpp
Code:
// maak een speler en zet 'm in het level
myLevel.Player = CreatePlayer(20, 10);


Als je je code zonder problemen wilt kunnen compileren, dan moet je ook in main de functie-aanroep van CreatePlayer even van parameters voorzien.

Daar dus om precies te zijn

Ik denk dat ik niet helemaal begrijp wat er met die onderste 2 regels (hierboven maar 1 regel) word bedoeld en dat ik daardoor deze fout krijgt:

48 C:\Programmeer\Makefile.win [Warning] overriding commands for target `level.o'
45 C:\Programmeer\Makefile.win [Warning] ignoring old commands for target `level.o'
C:\Programmeer\Player.h In function `int main()':
52 C:\Programmeer\Player.h too few arguments to function `Player CreatePlayer(int, int)' << Verwijst naar: Player CreatePlayer(int x, int y);
61 C:\Programmeer\Main.cpp at this point in file >>> Verwijst naar: Player myPlayer = CreatePlayer(); <<moeten nog parameters in maar welke???
C:\Programmeer\Makefile.win [Build Error] [Main.o] Error 1

Als jullie meer info/bestanden nodig hebben hoor ik het wel, heb namelijk alles opgeslagen per les :)
 
Laatst bewerkt:
Ik zou zeggen: probeer eens 20 en 10. :)

De parameters die je opgeeft, vormen de positie waar de speler het spel start. Waar je de speler wilt neerzetten, is afhankelijk van hoe je level eruit ziet. In het voorbeeld van de tutorial, moet 20, 10 prima werken. Als die startpositie je niet bevalt, kun je 'm later altijd veranderen.
 
Helaas was het niet zo simpel want ook dat had ik al geprobeerd :)

Krijg nu volgende meldingen als ik dus die 20, 10 in de main.cpp toevoeg:

C:\Programmeer\Level.cpp In function `Level LoadLevel()':
40 C:\Programmeer\Level.cpp 'struct Level' has no member named 'Player'

Kan dit met een vergeten include te maken hebben ofzo, want volgens mij staat Player nergens gedefinneerd ofzo, zoiets lees ik uit de error :)
 
Laatst bewerkt:
De foutmelding zegt dat je geen variabele Player in je struct Level hebt staan. Het struct Level moet er als volgt uitzien.

Code:
struct Level
{
	// de grootte van het level
	int Width, Height;

	// de blokken in het level
	vector<Block> Blocks;
	
	// de speler
	Player Player;
};

Volgens de compiler mis jij de de regel: Player Player;
 
Had daar op 1 of andere vage manier

Player myPlayer;

Staan maar is aangepast en nog steeds geeft hij een error met die player:

36 C:\Programmeer\Level.h declaration of `Player Level::Player'
25 C:\Programmeer\Player.h changes meaning of `Player' from `struct Player'

Hij verwijst daarmee naar die: Player Player; Regel

En naar:

struct Player
{

Naar dat stukje

Dit heb ik trouwens in player.h gezet:
/**
* Maakt een nieuwe speler aan en initialiseert de gegevens van de speler.
*
* @return een nieuwe speler
*/
Player CreatePlayer(int x, int y);
 
Laatst bewerkt:
Waarschijnlijk vindt de compiler het niet prettig dat je zowel de struct als de variabele Player noemt. Ik kan mij inderdaad herinneren dat de compiler van DevC++ daar problemen mee heeft. De enige oplossing is om één van de twee te hernoemen. Je kunt bijvoorbeeld de struct Level veranderen in:

Code:
struct Level
{
	// de grootte van het level
	int Width, Height;

	// de blokken in het level
	vector<Block> Blocks;
	
	// de speler
	Player ThePlayer;
};

Let er wel op dat dan overal waar Level.Player staat in de tutorial, jij Level.ThePlayer in je code moet zetten.
 
Heb dat gevonden en aangepast, maar nergens staat Level.Player maar wel myLevel.Player, ik neem aan dat die dan gewijzigd moeten worden naar myLevel.ThePlayer.

Heb dat gedaan maar krijg nu de volgende fout:

45 C:\Programmeer\Makefile.win [Build Error] multiple definition of `Loadlevel()'

Kan dit komen door teveel includen of maakt dat niet uit? heb eigenlijk bij elke.h alle andere .h geinclude
 
Laatst bewerkt:
Sorry heb het al gevonden, ik had mijn level.dat ook in de compiler gemaakt, maar die veroorzaakte dat dubbele gegevens, heb nu level.dat uit mijn project gegooid en gewoon als bestand in de map gezet
 
Laatst bewerkt:
Ok vanaf daar weer verder gegaan, les 4 eigenlijk afgesloten, laatste maal dat ik hem wil compileren , Weer een fout :(

[Linker error] undefined reference to `LoadLevel()'

Hij geeft nu geen regel aan of niets, maar het lijkt erop alsof hij LoadLevel() niet pikt?
 
Laatst bewerkt:
Heb je level.cpp toegevoegd aan je project (en niet per ongeluk weer weggehaald)? Bevat level.cpp de functie LoadLevel()?
 
Deze staat er nog in, en dit is wat er in staat over dat loadlevel:
Code:
Level Loadlevel()
{
	// maak nieuw level
	Level myLevel;
    
    // open levelbestand
	ifstream myFile(LevelFile.c_str());

	// lees de breedte en de hoogte
	myFile >> myLevel.Width;
	myFile >> myLevel.Height;

	// lees de rijen in
	for (int y = 0; y < myLevel.Height; y++)
	{
		// lees de kolommen in
		for (int x = 0; x < myLevel.Width; x++)
		{
// lees veld in
int myField;
myFile >> myField;

// wat voor veld is dit?
switch (myField)
{
case BlockField:
	{
		// maak nieuw blok
		Block myBlock = CreateBlock(x, y);

		// voeg blok toe aan level
		myLevel.Blocks.push_back(myBlock);
	} break;
}

		}
	}
    
    // maak een speler en zet 'm in het level
	myLevel.ThePlayer = CreatePlayer(20, 10);

	// geef level terug
	return myLevel;
};

Ook heb ik in level.h dit staan:
Code:
/**
 * Leest het level uit een bestand en zet het level in het geheugen.
 *
 * 
 */
Level LoadLevel();
 
Laatst bewerkt:
Dat was het inderdaad, even kijken of dit dan toevallig fout op je website staat :)

Vreemd volgens mij staat het er wel goed, toch iets fout overgenomen ofzo :( dom-dom-dom
 
Laatst bewerkt:
Ben ik weer:

Loop vast op het schoppen van de blokken, alles gaat goed met compilen enzo totdat ik dit toevoeg in mijn main.cpp:

case PengoKick:
{
// laat speler schoppen
Kick(GlobalLevel.Player);
} break;


Heb er al GlobalLevel.ThePlayer van gemaakt omdat ik met die 'bug' zit.

72 C:\programmeer\Player.h too few arguments to function `void Kick(const Player&, Block&)'

Dat geeft hij als fout: slaat op deze regel:

void Kick(const Player& player, Block& block);
 
Kick verwacht twee parameters en je geeft er maar één. Je moet ook het blok meegeven waar de speler tegenaan schopt.
 
Dat begrijp ik ff niet heb er nu dit van gemaakt, maar meer staat er niet in de tutorial, misschien daar toch een stukje vergeten dan?

case PengoKick:
{
// laat speler schoppen
Kick(GlobalLevel.Player);

// verplaats de blokken
for (int i = 0; i < GlobalLevel.Blocks.size(); i++)
{
MoveBlock(GlobalLevel.Blocks.at(i));
}
} break;


Ik begrijp dat hier nog iets bij moet komen ofzo:

Kick(GlobalLevel.Player&........);
 
In de tutorial staat dit:

Code:
case PengoKick:
{
	// laat speler schoppen
	Kick(myPlayer, myBlock);
} break;
 
Als ik je tutorial open staat er toch echt dit:

case PengoKick:
{
// laat speler schoppen
Kick(GlobalLevel.Player);
} break;


Maar ik ga kijken of dat van jou werkt :)

Met het stukje wat jij geeft geeft hij de volgende fout:

undeclared myPlayer in function
undeclared myBlock in function
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan