webForumDet fria alternativet

OOP

18 svar · 660 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 579 inlägg
#1

Jag har en klass (CSpaceShip), en för varje spelare (2 just nu). Sen har jag klassen CAsteroid som hanterar alla asteroider.

Vart ska jag lägga koden för att testa kollision?

Just nu har jag inte implementerat missiler, men när jag gör det och de ska kunna krocka med både CSpaceShip och asteroider, var ska jag lägga den koden då?

Alpha IIMedlem sedan maj 20002 579 inlägg
#2

Så här ser CAsteroid ut

typedef struct
{
	GLfloat	x;
	GLfloat	y;
	GLfloat radie;
} Asteroid;

class CAsteroids
{
private:
	Asteroid asteroids[MAX_ASTEROIDS];
public:
	CAsteroids() {};
	void InitAsteroids();
	void Draw();

	Asteroid GetAsteroid(int n) { return asteroids[n]; }
};

Och såhär ser spaceship ut

class CSpaceShip
{
private:
	GLfloat		x;
	GLfloat		y;
	CVector2f	velocity;
	float		angle;
	int		radie;
public:
	// Konstruktor
	CSpaceShip();
	~CSpaceShip() {};

	// Funktioner
	void Draw();
	void Update();
	void Collision();
	void Rotate(float degree);
	void Move(float speed);
	void SlowDown();
	void Fire();
};

Vill kontrollera efter kollisioner i Collision, men hur får jag reda på asteroiderna då? Eftersom jag inte kan anropa asteroids objektet ifrån CSapceShip.

Alpha IIMedlem sedan maj 20002 579 inlägg
#3

Fotsätter att försöka..

Varför får jag fel här?

void CSpaceShip::Collision(CAsteroids * asteroids)
{
	int i=0;
	bool collision = false;
	Asteroid a;
	{
		a = asteroids->GetAsteroid[i];  // fel här <<<<<<<<

		float deltaXSqr = pow(a.x - x, 2);
		float deltaYSqr = pow(a.y - y, 2);
		float sumRadii	= pow(a.radie + radie, 2);

		if(deltaXSqr+deltaYSqr < sumRadii)
		{
			float dx = a.x - x;
			float dy = a.y - y;
			float r = sqrt(pow(dx,2) + pow(dy,2));
			float rx = dx / r;
			float ry = dy / r;
			float k = 2 * (rx * velocity.x + ry * velocity.y);
			velocity.x -= k * rx;
			velocity.y -= k * ry;

			collision = true;
		}

		i++;

	} while(i<MAX_ASTEROIDS && !collision);
}
nikoMedlem sedan juni 20022 415 inlägg
#4

För att getAsteroid är en funktion och inte en array.

a = asteroids->GetAsteroid[b]([/b]i[b])[/b];
PeWMedlem sedan juni 20006 839 inlägg
#5

Jag har just nu inte tid att sätta mig in i ditt problem, Alpha II. Men en gyllene regel är att tänka över vilka ansvarsområden objekten ska ha. Det är ofta förespråkat att klasser ska ha så lite ansvar som möjligt och egentligen bara representera objektet i sig. Exempelvis består en stol av fyra ben, men den har ingen inbyggd förmåga att vandra iväg av sig själv eller hålla koll på avståndet till andra stolar ;)

Alpha IIMedlem sedan maj 20002 579 inlägg
#6

Så hur bör jag bäst hantera detta problem? Har lite problem att förstå OOP, när man ska lägga nånting i en viss klass, hur de ska hantera varandra och när man ska ha separata funktioner.

Sang-draxMedlem sedan juli 2002570 inlägg
#7

Det klassiska svaret är att ha en abstrakt basklass CObject och sedan ha en funktion

bool Collision(CObject*, CObject*)

som fungerar med alla objekt

Alpha IIMedlem sedan maj 20002 579 inlägg
#8

Just nu har jag en fil som heter asteroids.h/cpp och en som heter spaceship.h/cpp. Hur ska jag dela upp det isf? Lägga allt i en fil och kalla de objects, eller vad är bäst?

Alpha IIMedlem sedan maj 20002 579 inlägg
#9

Hur gör jag klasserna så att jag kan skicka dom till en funktion som tar CObject som argument?

Är ny på c/c++ :)

Alpha IIMedlem sedan maj 20002 579 inlägg
#10

Trooor jag kom på hur jag ska göra, men det verkar som om jag måste skroiva om en stor del av koden :( :( OCh sent är det också :l

Alpha IIMedlem sedan maj 20002 579 inlägg
#11

Jag har lyckats med att göra en abstrakt basklass som de andra klassena ärver ifrån. Men om jag f rösöker anropa funktioner hos en CSpaceShip som inte finns med i basklassen blir det fel. Hur ska jag lösa detta???

Sang-draxMedlem sedan juli 2002570 inlägg
#12

Detta är ganska avancerad C++, så om du är ny på C++ kanske det är bäst att hålla sig på en enkel nivå.

Hur som helst är svaret du söker dynamic_cast

CObject& obj = ...
...
try
{
  CSpaceShip& ship = dynamic_cast<CSpaceShip&>(obj);
  //gör saker med skeppet
  ship.move(..);
  ship.fire(..);
}
catch ( bad_cast& error)
{
  //Det var inget skepp
}
Alpha IIMedlem sedan maj 20002 579 inlägg
#13

Programmet kraschar :(

Alpha IIMedlem sedan maj 20002 579 inlägg
#14

Detta är koden om den skulle vara till någon hjälp.
Skulle vara sjysst om någon ville rätta koden så att den funkar :)

Alpha IIMedlem sedan maj 20002 579 inlägg
#15

Den fungerar fortfarande inte :(

Alpha IIMedlem sedan maj 20002 579 inlägg
#16

Ingen som kommer på vad som är fel? :(
Ska jag göra som jag hade innan där jag testade efter kollision i CSpaceShip? Problemet är ju att jag också måste testa efter kollisioner i CMisisle också....

PeWMedlem sedan juni 20006 839 inlägg
#17

I'm sorry :r ... men om jag ska tala för mig själv så är det som så att jag inte har tid. Sitter just nu i finalen på protokollabbarna från skolan (programmera routing med dynamiska vägvalstabeller).. kikar nu in som hastigast bara för att se om ni sköter er :e

Såg dock din kod tidigare, det verkar inte helt trivialt så jag prioriterade mina egna kymmer :l

Men wF vimlar ju av C++ hackers så nån borde väl nu för böveln ta sig an Alpha II !

*uppmaning* :)

PhorpherMedlem sedan feb. 20002 059 inlägg
#18

Alpha II skrev:

Ingen som kommer på vad som är fel? :(
Ska jag göra som jag hade innan där jag testade efter kollision i CSpaceShip? Problemet är ju att jag också måste testa efter kollisioner i CMisisle också....

När kraschar programmet? Direkt vid uppstart? Vid en kollisionstest?

Har du tillgång till en debugger så underlättar det avsevärt då du enkelt kan stega igenom och kapsla in var problemet ligger.

aasahMedlem sedan mars 20033 451 inlägg
#19

Re: OOP

Alpha II skrev:

Jag har en klass (CSpaceShip), en för varje spelare (2 just nu). Sen har jag klassen CAsteroid som hanterar alla asteroider.

Vart ska jag lägga koden för att testa kollision?

Just nu har jag inte implementerat missiler, men när jag gör det och de ska kunna krocka med både CSpaceShip och asteroider, var ska jag lägga den koden då?

Varför skapar du inte en tredje fil game.h/game.cpp som du sköter interaktionen mellan klasserna i? Du måste ju i vilket fall som helst instansiera dina objekt någonstans ifrån. Ta hand om de som dör och skapa nya asteroider, rymdskepp...

Se upp när du använder dynamic_cast. Om du t.ex. lagrar dina instanser i en vektor/annan lagringsstruktur som tar typen DinAbstraktaKlass så kan du få problem när du gör dynamic_cast, eftersom det som läggs in i vektorn bara är den del av objektet som tillhör basklassen. Detta kommer man runt genom att i stället lagra pekare till DinAbstraktaKlass.

Om du inte har en debugger så släng in cout på strategiska ställen med någon vettig utskrift. På så sätt ser du hur långt programmet kommer innan det kollapsar.

Genererad på 369 ms · cache AV · v20260730165559-full.f96bc7eb