Bonjour, dans le cadre d'un projet de jeu d'echec sous linux, que nous effectuons avec un pote, nous réalisons... un jeu d'echec, jouable en ligne, avec IA, et interface pas trop moche.
Avant toute chose, je tiens à préciser que j'utilise g++/gcc, via code::blocks, sous linux.
Etant chargé de l'IA et du réseau, j'ai donc réalisé un programme avec un affichage pourri sur la console, mais qui marchait impec (quelques bugs lors de la connexion des deux sockets, mais n'arrivant qu'une fois sur 3 à peu près).
Mon binome a lui, créé l'interface en SDL.
Bien.
Donc, nous avons adapté nos codes pour les fusionner. Tout ce qui est jeu en local fonctionne impec (encore que l'ia a des tendances suicidaires... mais la question n'est pas là).
Le réseau, par contre ne marche pas... En fait, la connexion entre mes deux programmes (je teste sur 127.0.0.1) a l'air de bien marcher, comme sur mon programme de base. Par contre, ensuite, lors de l'initialisation du plateau de jeu (je ne m'y connais pas trop trop en SDL, et mon binome est actuellement injoignable), ça plante...
Voici un tout ptit extrait de code d'où ça plante, commenté of course:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 if(typjeu==3 || typjeu==4)cout<<"connexions effectuées"<<endl; //typjeu: type de jeu: 1: local, 2: IA, 3: client, 4: serveur //le message s'affiche, donc a priori, pas de problème? //test, ce message est bien affiché cout<<"declaration"<<endl; //Déclaration des variables SDL_Event event;//permet de gérer les évenmeent de la SDL bool touche=false,deplace=false; //variable pour gérer si l'on clique sur une piece du plateau, je crois jeu.aff(screen,j1,j2); //ici, ça plante! Cette fonction permet normalement d'afficher le plateau cout<<"declarations ok"<<endl; SDL_Flip(screen);
Pour ce qui est de jeu.aff, ça plante exactement ici (sans cette ligne, le programme fonctionnerait (il continue), mais on n'a plus d'interraction avec le jeu, ni d'affichage):
cases est un SDL_surface, qui est surement le plateau de jeu. Bref, en tout cas, sans cette fonction, le programme plante plus tard (aucune interraction possible, pas d'affichages), J'ai essayé un sleep juste apres (ça plantait direct), et j'ai juste un freeze de mon menu, pas d'affichage du plateau de jeu, que dalle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Dessiner le fond d'ecran SDL_BlitSurface(bg,NULL,screen,NULL); cout<<"1"<<endl; SDL_SetAlpha(cases, SDL_SRCALPHA, 128); //LIGNE QUI FAIT PLANTER :/ cout<<"2"<<endl; SDL_BlitSurface(cases,NULL,screen,NULL); cout<<"3"<<endl;
Ensuite, autre question, tant que j'y suis, mes sockets ont parfois des moments où elles n'arrivent pas à se connecter entre elles... Genre j'essaye 3 fois de suite, 3 fois j'ai un host introuvable. Pis apres, 3 ou 4 fois, ça remarche. C'est pas primordial, mais j'imagine que c'est assez courant, donc si quelqu'un a la soluce... .
EDIT: apres quelques recherches, j'ai cru comprendre que la ligne qui fait planter serait juste pour faire un effet de fondu (ici entre le plateau de jeu et l'image de fond d'écran). Seulement voila, en la commentant (le BlitSurface du background itou), ça ne m'affiche toujours rien... C'est grave docteur?
Merci d'avance! Ciao
ps: bien sur, je sais que sdl_net existe, mais ayant déjà tout codé, ça m'embeterait un ptit peu de devoir tout refaire. Bien entendu c'est pas tres long, mais bon... Un informaticien non flemmard n'est pas un informaticien, non? Pis histoire de trouver une vraie excuse, j'aimerais quand meme bien savoir pourquoi ça plante... Probleme de concurrence entre les affichages et recv(), recv etant bloquante?
Partager