Archief - [PROG]C++ Een afbeelding als lid van een klasse.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Kr0meel

Legacy Member
Hey,

hier nog eens een noob vraagje van een DOS programmeureken (allegro) dat nu probeert over te stappen naar DirectX:

Vroeger stak ik in mijn klasses al eens gemakkelijk een bitmap, bv:

private:
BITMAP uitzicht;

Dat vond ik redelijk gemakkelijk voor alles wat tekenwerk betrof. Als ik nu echter hetzelfde probeer te doen met een LPDIRECTDRAWSURFACE4 dan is de compiler het daar helemaal niet mee eens. Na wat zoekwerk ben ik er al op uitgekomen dat de directdraw surfaces geen types of klasses zijn, maar wel macro's (als ik alles goed begrepen heb...). Dit maakt het onmogelijk ze als datalid in een klasse te steken.

Maar wat zijn dan WEL elegante oplossingen om dit onder directx gefixt te krijgen? Al uw suggesties en ervaring zijn welkom :-)


Btw: play toribash, play guntactyx!

Greetz,

Kr0meel.

killgore

Legacy Member
Dat gaat zeker wel :/. Volgens mij probeer je gewoon iets verkeerd op te slaan.

edit: trouwens: hebt gij die games gemaakt?

KeaTs

Legacy Member
Kr0meel zei:
Btw: play toribash, play guntactyx!

Hehe, toribash hebben we hier al meermaals geprobeerd op t werk maar da is keimoeilijk :) t Duurde al effe voor we de gameplay doorhadden. t Is wel origineel maar de leercurve ligt wa hoog :p

*edit* guntactyx looks fun, ga k zeker es proberen als ik wa meer tijd heb :)

Kr0meel

Legacy Member
Voor de code crunchers: hier is de code voor die klasse. Vraag mijn niet waarom ik een klasse FREDDY noem! :p

// Freddy.h: interface for the Freddy class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_FREDDY_H__4C63F2AE_1DE2_44F2_8E87_F0D81686207F__INCLUDED_)
#define AFX_FREDDY_H__4C63F2AE_1DE2_44F2_8E87_F0D81686207F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class FREDDY
{
private:
double x_pos;
double y_pos;
int size;
double richting;
double speed;
//alles OK zonder deze regel en bijhorende
//regel in de constuctor (zie verder):

LPDIRECTDRAWSURFACE4 looks;


public:
FREDDY();
virtual ~FREDDY();
void tekenen (HDC hdc);
void shift_position (long Dx, long Dy);
void rotate (double Dr);
void move ();

};

#endif // !defined(AFX_FREDDY_H__4C63F2AE_1DE2_44F2_8E87_F0D81686207F__INCLUDED_)

// Freddy.cpp: implementation of the Freddy class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "math.h"
#include "Freddy.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

FREDDY::FREDDY()
{
x_pos = 200;
y_pos = 200;
size = 20;
richting = 0;
speed = 1;
//De bijhorende regel in de constructor:
looks = NULL;

}

FREDDY::~FREDDY()
{

}


En dan nu de officiële reden dat de compiler niet graag heeft dat ik dit alles schrijf:

error C2146: syntax error : missing ';' before identifier 'looks'
error C2501: 'LPDIRECTDRAWSURFACE4' : missing storage-class or type specifiers
error C2501: 'looks' : missing storage-class or type specifiers
error C2065: 'looks' : undeclared identifier

Voor alle duidelijkheid: als ik in de WinMain dezelfde code typ dan blijkt dat geen problemen op te leveren.


Wat betreft Toribash en guntactyx: daar ben ik helaas niet de auteur van, het zijn gewoon 2 van de vetste spelen die bestaan, en ze zijn beiden "in de keuken" geschreven. ben wel een tijd de "guntactyx champion" geweest :D

Alvast bedankt voor de interesse!

Greetz,

Kr0meel.

Tyfius

Legacy Member
"LPDIRECTDRAWSURFACE4" is een data type, ergens gedefinieerd. Ik zie je niet meteen een header file includeren waar dit gedefinieerd kan zijn in je Freddy.h bestand. Mijn eerste idee is dat hij het dus gewoon niet kent en daarom deze error geeft.

Sidenote: vanwaar de onnoemelijk lange en ingewikkelde #ifndef declaratie? Een van de voornaamste peilers van goed programmeren is readablity, en het is veel duidelijker om je #ifndef dezelfde naam van je klasse (eventueel met afkorting van de namespace ervoor) te gebruiken dan een of andere gigantische string te includen om zeker uniek te willen zijn.

Kr0meel

Legacy Member
Zoals nocturn reeds vermeldde: dat gedrocht in de #ifndef is een autogen van VC++ 6.0. Om eerlijk te zijn: ik snap het doel van deze ifndef niet volledig, dus voorlopig blijft ie zo. (Heb ze in het verleden nooit gebruikt).

Mijn probleem is intussen ook opgelost, ik heb in de Freddy.cpp ook nog eens de headers voor Direct draw geïnclude (zoals Tyfius suggereerde). Ik snap echter niet waarom dit nog nodig was. Deze waren immers reeds geïnclude nog voor de Freddy.h geïnclude werd....

Bij nader inzien moet ik het laatse hoofdstuk in m'n C++ boek over hoe de compiler en de precompiler werken toch maar ens lezen :p.

In ieder geval hartelijk bedankt voor de hulp.

Greetz,

Kr0meel.

Tyfius

Legacy Member
Een klasse kent in principe alleen maar de data types en klasse en alle andere dingen die aan hem worden bekend gemaakt. Default types zoals int, double, char enzo meer zijn language defaults. Alle andere datatypes, zoals je "LPDIRECTDRAWSURFACE4" moet je expliciet kenbaar maken, voor elke klasse die ervan gebruik maakt individueel.
Wat wel mogenlijk is, bvb is een klasse afleiden van Freddy en dan zal die "LPDIRECTDRAWSURFACE4" ook wel kennen, omdat het reeds gekend is in Freddy.

Over #ifndef. Elke keer jij #include "header.h" doet gaat de compiler dit header bestand includeren, en elke keer alles wat in dat bestand staat gaan definiëren. Maar als hij dit reeds kent gaat hij een compiler error geven.
Code:
#ifndef HEADER_H
#define HEADER_H 1

// Klasse code

#endif
Dit wil zoveel zeggen als:
Indien niet bekend HEADER_H, maak HEADER_H kenbaar (by default worden onbekende #define declaraties als 0 voorgesteld, de 1 maakt in dit voorbeeld extra duidelijk dat het bekend moet worden). De #endif sluit het af. Wanneer je deze header nu een 2de maak includeerd dan zal hij zien dat HEADER_H reeds gekend is en de code binnen #ifndef niet uitvoeren. Meestal gebruikt men voor de HEADER_H de naam van de klasse of het bestand, maar omdat het wel eens kan voorkomen dat klassen dezelfde naam hebben zet men er soms de namespace nog eens voor, om zeker een unieke define te hebben. Ik gok dat jouw visual studio deze unieke string genereert om zeker te zijn.

Kr0meel

Legacy Member
Hey, bedankt Tyfius!

je uitleg over de ifndef is zeer verhelderend!


Greetz,

Kr0meel.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan