j´aiun probleme avec le constructeur d´une classe
j´ai ceci :
une class Map , avec des donnees membres publiques dont ´ char *name´ qui contient le nom de la carte , et ( entre autres ) un constructeur ´Map( char *n )
pour , copier le nom de la carte , des sa creation
j´ai donc naïvemement ecrit ceci :
Map::Map(char *n)
{
strcpy(name,n);
}
et je continue , dans les autres fonctions membres , en utilisant name
le probleme , c´est que ca plante a l´execution , alors que , si je ne mets pas le contructeur , et que je mets par exemple
void AfficheMap( char *name )
et que j´appelle comme ca
pointeur->AfficheMap("depart.j3j");
ca marche parfaitement . .. mon erreur vient donc surement de mon constructeur , mais d´où ? ![]()
si quelquun sait , merci beaucoup ![]()
http://rafb.net/paste/results/1kVc6N46.html
voila mon code
il est inutile de preciser que j´ai effectivement un fichier nomme " depart.j3j" dans mon repertoire de projet , dailleurs sa marche parfaitement si j´enleve le constructeur e fait quelques modifications . ..
Mais quest ce qui nous fait **** avec son constructeur , celui la , si ca marche autrement ? hehe , je VEUX un constructeur , merci a ceux qui m´aideront ![]()
Je suis aau numero 15 et a partir du numero 9, je n´arrive plus a faire les questions , sinon, j´arrive a peu pres a comprendre le languege utilisé.
sonic66 : je comprends pas ta question :
TOUT est ecrit en commentaire
void waitkey == le nom de la fonction
while(1) == une boucle infinie
while(SDL_PollEvent(&)) == recupere un evenement
-> c´est comme ca et puis c´est tout , sa marche sa marche , pas besoin d´y toucher , pas besoin de decompiler la SDL hein
if ( event.type == SDL_KEYDOWN) / / on appuie sur une touche ?
ca me parait clair , tu dois avoir plus haut une variable style
SDL_Event event; non ? ben , cette variable recupere les eventuels appuis sur une touches : pareil , c comme ca et pas autrement
if ( event.key.keysym.sym == SDLK_RETURN) return; / / c´est " RETURN" ?
est ce qu´on appuie sur la touche entree ( == return en english ) ? si oui , bah hop , on donne cette information a la variable event ,
et comme pollevent regarde si qqchose c passe dans event ( & donc ) , bah elle peut decider autre chose : quitter ?
si c le event.key.keysym.sym qui te fait peur , bah dis toi que c comme ca et pas autrement , apreil , tu verras que c juste des structures de données qui portent ce nom la , mais pour l´instant tu t´en fiches
pas ete clair moi ? roooh
Sinon, JYY pour la page internet SDL pour telecharger en dev c++ il me mette quand je clique sur le lien :
D´abord, téléchargez SDL pour DEV C++ :
SDL pour DEV C++ / /celui la
La page est :
La page ne peut pas être affichée
La page que vous recherchez est actuellement indisponible. Le site Web rencontre peut-être des difficultés techniques ou il vous faut peut-être modifier les paramètres de votre navigateur.
--------------------------------------------------
------------------------------
Essayez de la manière suivante :
Cliquez sur le bouton Actualiser ou réessayez ultérieurement.
Si vous avez tapé l´adresse de cette page dans la barre d´adresses, vérifiez que l´adresse est correcte.
Pour vérifier vos paramètres de connexion, cliquez sur le menu Outils, puis sur Options Internet. Dans l´onglet Connexions, cliquez sur Paramètres LAN. Les paramètres doivent correspondre à ceux fournis par votre administrateur local ( LAN) ou par votre fournisseur de services Internet.
Si votre administrateur réseau a autorisé cette opération, Microsoft Windows peut examiner votre réseau et détecter automatiquement les paramètres de connexion réseau.
Si vous souhaitez que Windows essaie de les trouver,
cliquez sur Détecter les paramètres réseau
Certains sites nécessitent une sécurité de connexion 128 bits. Cliquez sur le menu ? , puis sur À propos de Internet Explorer pour déterminer quelle puissance de chiffrement vous avez installée.
Si vous essayez d´atteindre un site sécurisé, vérifiez que vos paramètres de sécurité peuvent le prendre en charge. Cliquez sur le menu Outils puis sur Options Internet. Dans l´onglet Avancées, passez à la section Sécurité, puis vérifiez les paramètres de SSL 2.0, SSL 3.0, TLS 1.0 et PCT 1.0.
Cliquez sur le bouton Précédente pour essayer un autre lien.
As tu un lien qui fonctionne oçu c´est mon ordi qui est pourri et qui arrive pas a lire ta page?
salut !
pour ton constructeur
strcpy necessite que ta mémoire soit allouée avant :
Map::Map(char* n)
{
name = new char[strlen(n)+1];
strcpy(name,n);
}
n´oublie pas le destructeur pour etre propre :
Map::~Map()
{
delete [] name;
}
Merci beaucoup , ca marche
par contre , j´ai perdu mon livre de c++ (
) et je me rappelle plus comment delete un entier ( int ^poids en fait )
j´ai fait delete poids , mais il me dit que c´est un " pointeur expected" . ..
ou peut etre qu´il n´y a pas besoin de le delete . ..
en tout cas , ca marche ![]()
a ok!
sdl-pollevent sert a recuperer un evenement et il les recuperent a ladresse d´event!
et au fait un evenement cest quoi ?
un evenement est til toujour lappuie dune touche?
et la
if ( event.type == SDL_KEYDOWN) / / on appuie sur une touche ? pourquoi event.TYPE ?
{
if ( event.key.keysym.sym == SDLK_RETURN) return; / / c´est " RETURN" ? pourquoi event.KEY.KEYSYM.SYM???
un evenement , ca peut etre le redimensionnement d´une fenetre , comme l´appui sur le bouton de la souris , etc
event.KEY.KEYSYM.SYM
event , c´est ta variable
tu peux mettre
SDL_Event truc
puis
truc.KEY.KEYSYM.SYM
key.keysym.sym , je connais pas du tout , mais au vu du nombre de points , je dirais que ce sont des structures . ..il serait interessant d´essayer ca dailleurs :
SDL_Event *pevent;
pevent = new SDL_Event event
pevent->KEY->KEYSYM->SYM
mais je pense pas que ca amrche . ....
encore une fois , fais toi une raison , dis toi que tant que ca marche , c bon nan ? en plus , c´est une fonction faite par JYY , et tu n´as plus qu´a la copier coller pour la faire fonctionner , pas besoin de se preoccuper du code . .. ![]()
oui en fait , pour linstand je ne doit pas chercher a comprrendre tout!
Encore une fois un probleme ( c relou , parceque je fais toute la logique sur papier , c´est sense fonctionner au poil , et pof le vieux bug venu d´on ne sait pas ou qui vient tout faire rater . .. ) :
Bon , voici une breve description du format . j3j ( au cas ou vous voudriez creer un exporteur de map , ou un decodeur etc - libre de droits ^^ )
en fait , c´est une serie de chiffres il faut les lire en binaire
0121542136
trois par trois , c´est l´absisse du tile ( 0 ) son ordonnee ( 1) et le numero du tileset ( 2 ici ) puis on passe au tile suivant etc ![]()
super complexe ^^
donc , il me fallait une fonction pour decoder ce machin :
la voici :
void Map::AfficheMap()
{
int i;
for ( i=0 ; i<poids ; i+3 )
{
cout<<"affichage du tile de coordonnee"<<carte[i] < <" " <<carte[i+1]<< " du tileset numero"<< carte[i+2];
cin.get();
}
}
en verite , mon fichier . j3j contient ceci :
01010145445454554
lors de l´execution , tout semble se passer normalement la premiere fois
j´obtiens ceci
affichage du tile de coordonnee 0 1 du tileset numero 0
mais , apres l´appuie sur entree , c´est la meme phrase qui revient encore et toujours ( au lieu de 101 puis 454 puis 456 puis 545 etc )
vous voyez d´où ca peut venir ?
ah ben , j´ai rien dit en fait
je pensais qu´au meme titre que
i++
fonctionnait
i+3 marchait aussi
mais . .. non ![]()
j´ai mis i+=3 et ca rullz ![]()
meme plus de question pour ce soir ![]()
jejej > Impec ![]()
tu es en train d´aquérir une certaine autonomie ( ce qui ne m´empechera pas de répondre a tes question)
mais tu as dépassé le stade de le programmation " aveugle" : on tape ce qu´on nous dit, et si ça ne marche pas, on panique
tu commences a bien prendre les choses en main, et tu arrives maintenant à raisonner de mieux en mieux ! Mes félicitations
Tu es sur la bonne voie ![]()
Arrete se faire feliciter par le modéro ça fait saigner du nez et chier dans son froc tant le bonheur est grand ![]()
Enfin bravo quand même jejej ![]()
SDL_Surface* LoadBMP(char* fichier) / / 2eme forme
{
SDL_Surface* f = SDL_LoadBMP(fichier); // charge l´image dans f en RAM
SDL_Surface* surface=SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0); / / cree une image en VRAM
SDL_Rect R=Rect(0,0,f->w,f->h);
SDL_BlitSurface(f,NULL,firstscreen,&); // copie l´image f de la RAM vers firstscreen en VRAM
SDL_FreeSurface(f); / / supprime la surface f : inutile maintenant --> libere la mémoire
return surface;
}
Je comprend pas ces lignes
SDL_Surface* LoadBMP(char* fichier)
>char* fichier, ca represente quoi ?
SDL_Rect R=Rect(0,0,f->w,f->h)
>(0,0,f->w,f->h) pas compris...
char *fichier represente l´URL/le destination de ton image et ( 0,0,f->w,f->h) -> ( l´abssise x,l´abssise y,largeur,hauteur)
bienvenu au royaume des pointeurs
char* est un pointeur sur un tableau de char :
en gros, ça désigne ici une chaine entiere, dans ce cas, le nom de ton fichier.
f->w est équivalent à ( *f).w
parce que f est un pointeur sur une surface
donc pour accéder a la surface, il faut faire *f
ensuite, pour accéder au champ w qui est la largeur ( width) de l´image, c´est . w
donc tu as :
( *f).w
et un raccourci en C, c´est de mettre :
f->w
Donc si j´ai bien compris :
SDL_Surface* LoadBMP(char* fichier)
/ /charge un BMP du nom de fichier
{
SDL_Surface* f = SDL_LoadBMP(fichier);
/ /declare une surface f contenant le BMP " fichier"
SDL_Surface* surface=SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0);
/ /charge cette image dans la VRAM
/ /(les codes, j´ai pas bien compris mais je comprendrais surement plus tard)
SDL_Rect R=Rect(0,0,f->w,f->h);
/ /declaration d´un rectangle x=0, y=0, *f=w, *f=h
/ /et je suppose qu´il s´agit de *f.w et *f.h
/ /avec *f.w les valeurs de l´image
SDL_BlitSurface(f,NULL,firstscreen,&);
/ /On stocke en Vram l´image de f en entier, on la colle sur firstscreen et R?
SDL_FreeSurface(f);
/ /On libere la surface f de la ram
return surface;
/ /j´ai pas compris de quelle surface il s´agit...
J´ai aussi quelques questions :
1)Quand est ce que ce code est executé ? Je vois pas ou on l´appelle.
2)SDL_BlitSurface : quels sont les parametres rentré ? Je sais pas si j´ai bien compris :
le premier parametre est la surface a coller
Le second est NULL ( ou pas)
Le troisieme est le support
Le quatrieme est la position
C´est ca?
1) l´enesemble de ce code est dans ma fonction LoadBMP
ce code est donc appelé quand on appelle la fonction LoadBMP : a savoir plusieurs fois dans le main : une fois pour charger " firstscreen" : mon image de fond, et ensuite une fois pour charger " balle" ( tuto 2.1.3)
SDL_Surface* surface=SDL_CreateRGBSurface(SDL_HWSURFACE, 1024, 768, 32, 0, 0, 0, 0);
/ /charge cette image dans la VRAM
/ /(les codes, j´ai pas bien compris mais je comprendrais surement plus tard)
--> SDL_HWSURFACE veut dire que tu demandes a ce que la surface se crée en VRAM. 1024*768 : résolution de la surface, 32 : nombre de bits par pixels, et les 4 zeros qui suivent sont la colorKey ( dont je ne me sers pas pour le moment) tu verras l´utilité de la colorkey sur le tuto de la balle
importante propriété
pour SDLrect, tu supposes bien ![]()
attention cependant quand tu écris *f.w, ça revient a *(f.w) et non pas ( *f).w
donc met bien les parentheses, ou alors met f->w
car
( *a).b < => a->b
SDL_BlitSurface(f,NULL,firstscreen,&);
/ / On stocke en Vram l´image de f en entier, on la colle sur firstscreen et R?
--> Je répondrais a ça apres ta question a la fin.
SDL_FreeSurface(f);
/ / On libere la surface f de la ram
--> pareil, a la fin
SDL_BlitSurface : quels sont les parametres rentré ? Je sais pas si j´ai bien compris :
le premier parametre est la surface a coller
Le second est NULL ( ou pas)
Le troisieme est le support
Le quatrieme est la position
Alors, d´une façon générale, tu as :
SDL_BlitSurface(is,rs,id,rd);
is : Image source : quelle image tu veux coller ?
rs : Rectangle source : dans cette image, si tu ne veux en coller qu´une partie : par exemple, tu veux coller qu´un bout de la balle...
tu mets NULL pour dire " je colle TOUTE l´image"
id : image destination : ou tu mets ton image
rd : seuls les points x,y de la structure sont pris en compte : w et h sont ignorés :
tu définis sur la surface id ou tu vas mettre le coin supérieur gauche de ta surface is
Donc pour revenir sur les questions d´avant :
SDL_Surface* f = SDL_LoadBMP(fichier);
/ / charge le BMP provisoirement dans f
ensuite, avec le if, on crée une image vierge, de pile la bonne taille, en RAM ou en VRAM comme tu as pu le voir. L´interet est qu´en créant une image vierge, tu lui impose une profondeur de 32, ce qui n´est pas le cas avec le SDL_LoadBMP qui pourra mettre 16,24 . ...
Ensuite,
SDL_BlitSurface(f,NULL,firstscreen,&);
--> on colle TOUTE l´image f sur le 0,0 de firstscreeen, autrement dit, on colle brutalement.
le f->w,f->h passé dans R ne sert en fait a rien, mais bon, c´était pour mettre qq chose : essaie de mettre 0,0, tu verras, ça marche tout aussi bien.
SDL_FreeSurface(f);
--> Supprime l´image temporaire : puisqu´on l´a copiée dans firstscreen, on n´en a plus besoin, donc on libere la mémoire...
![]()