Jeu 2D dessin pixel par pixel? tableau matrice? [1920][1200] trop lent? meilleur

Résolu
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 - 4 juin 2010 à 20:12
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 - 18 juin 2010 à 01:11
Voici mon problème:
Je sais dessiner dans une fenêtre en api win32 des points, lignes, rectangles ou autres.
Mon idée serait d avoir un monde de 1920 par 1200 px (ou taille variable en fonction de l'écran)
le décor serait mouvant, donc chaque pixel bougerait en fonction de différents parametres.
il pourrait être détériore comme dans worms àrmageddon, il serait composé de différents éléments qui bougent indépendament les uns des autres, mais les joueurs qui s' y affronteraient en temps réel, en meme temps pouraient sauter d'un élément du décor à l autre, se protéger derriere un tas de pixels...
donc ils se tirent dessus et chaque joueur controle un personnage avec un bout du clavier(wasd/espace/zghj...haut bas gauche droit/ctrl/numpad)
voir un troisieme joueur qui jouerait avec la manette de xbox 360 ou autre, mais alors la je sais pas dutout comment on fait pour recevoir les vk_ de la manette... :<(
Bref je débute ce prog et j aimerais des exemples de jeux 2d a la worms et savoir si c est possible de créer une matrice de pixels qui se raffraichit a chaque fois que le décor bouge et que les armes explosent ou se déplacent, qu un joueur bouge...
Quelle méthode serait la plus simple et rapide, sachant que je ne veux ni utiliser opengl ou direct x ou toute autre librairie dont je ne connais rien.
J aimerais n utiliser que du c++ en api win 32.
créer un bitmap en mémoire, avec pour chaque pixel 0/1 ou 256 couleurs et jouer sur ces pixels en fonction de leur propriété.
[1920][1200][0/1][transparence][couleur]...???
Du coup ca me permettrait de tester à chaque déplacement des missiles ou lazer... envoyés, avec getpixel si un pixel du décor s ' y trouve, si il y a un joueur, ou un autre missile...
Et pareil pour le déplacement des joueurs, je saurais s'il doit continuer à tomber, ou s'il a du décor sous lui, s'il est sur de l'eau ou du dur...
Voilà c'est à peu pres tout.
J'avais fait un truc du genre en tres bazic sur ti82+ ou chacun leur tour deux joueurs s'envoyaient un pixel en parabole avec du vent et la gravité dans un décor aléatoire j aimerais refaire ca en mieux sur pc...
Merci pour toute aide j espère que vous aurez compris mon problème, je ne sais pas par ou commencer. je ne sais pas quelles fonctions appeler, j ai une bonne idée des algo, mais aucune du code.
le pire c est pour la retranscription du monde en pixels sur l ecran, j ai peur de faire un truc trop lent, bien que j aie un i7^^
Merciiiiiiiiiiii

10 réponses

Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
9 juin 2010 à 20:13
http://www.cppfrance.com/codes/BASE-UTILISATION-GDI-API-WINDOWS_46504.aspx

connais pas trop l'api, mais vu msdn, tu devrais avoir moyen d'obtenir le buffer directement.

Juste après
if ( ... CreateDIBSection (...)...){...} , le pointeur 'tmp' doit pointer sur ton buffer de [width]x[height]x[3 couleurs]

Sors ce pointeur de la fonction, mets le en global en attendant. Et change le en unsigned char * , d'ailleurs.
Dans le case:WM_PAINT, essaye de faire tmp[0] = 255. Si le pixel en haut à droite devient rouge, t'as gagné.

_______________________
Omnia vincit labor improbus
http://calvin-studio.fr
3
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
4 juin 2010 à 20:51
En gros ca ressemblerait à ca:
0
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
7 juin 2010 à 13:28
Bonjour les mentors.
bon ba voila. J'ai fait une ptite fonction de deux lignes qui me remplit pixel par pixel tout mon écran.
Eh ba ca prend vachement de temps.
Alors je me dis que j'ai encore beaucoup à apprendre.
Aussi j'aimerais savoir quoi.
Comment se fait t il qu'un ordi puisse afficher un fps a 60 frames par seconde et que mon jeu 2d ne parvienne pas a
dessiner tout l'écran en 1 minute.
Je comprends donc que je dois d'abord calculer toute mon image, puis l'afficher.
Mais comment on faiiiiiiiiiiiiiiittttt??????
Exemples?
SVP.
Aide?
Tutoriel?
AMIS?
hep!
Ca vous dit pas d jouer a mon jeu?
Avouez qu ca a l air pas mal non?
Si vous avez aimé worms, vous allez kiffer Balls
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
7 juin 2010 à 22:02
Avec SetPixel ? C'est l'une des fonctions les plus lentes de l'API win32.
Cherche sur ce site un truc genre "win32 double buffering"
grosso modo tu remplis un tableau qui est en fait ton image, et tu transfères tout d'un coup à l'affichage.
MP si problème

_______________________
Omnia vincit labor improbus
http://calvin-studio.fr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
9 juin 2010 à 22:35
Merci bocouuuuu
0
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
13 juin 2010 à 16:56
j'ai resolu le probleme de conversion invalide de void to HBRUSH avec dev c++ en supprimant certaines lignes, mais pourquoi ca marche pas?
C'est quoi ce probleme de conversion invalide?
il fo que je fasse quoi pour que ca marche?
hOldBrush = SelectObject (hMDC, hBrush);
In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
invalid conversion from `void*' to `HBRUSH__*'
0
Arnaud1602 Messages postés 3 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 13 juin 2010
13 juin 2010 à 18:50
Encore une fois, ce ne sont que des suppositions (je ne connais ni l'API ni ton code), mais je pense que :
- tu ne devrais pas toucher à hBrush
- c'est 'tmp' qu'il faudrait passer de void * à unsigned char *
0
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
16 juin 2010 à 11:38
ok mais comment je l ecris mon buffer decor?
couleur[][][];
decor[1920][1200][couleur];
ou
decor[1920][1200][r,v,b];
ou
decor[1920][1200][ffffff];

cela pourait il etre bien de creer une structure ou je ne sais trop quoi d autre? inutile?
et puis je ajouter à mon tableau décor des propriétés en plus?
genre:
decor[1920][1200][couleur][matiere][pression][temperature][vecteur];
et est il possible de faire hwnd=decor ou un truc du genre hwnd=createcompatibledc(decor)
et est il possible de n envoyer que les 3 premieres dimensions d un tableau dans un autre?
qu est ce qui est le plus rabide? a=b ou *b

merci encore et bonne prog.
en espérant toujours trouver quelqu un pour m aider dans ce projet. Etudiant ou autre.
Je galère.
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
16 juin 2010 à 17:40
ok mais comment je l ecris mon buffer decor?

->
decor[3*(x+largeur*y)+0] = r
decor[3*(x+largeur*y)+1] = g
decor[3*(x+largeur*y)+2] = b

cela pourait il etre bien de creer une structure ou je ne sais trop quoi d autre? inutile?
-> tant que t'auras pas trouvé comment dessiner un pixel, ça te servira à rien.

et puis je ajouter à mon tableau décor des propriétés en plus?

-> pas ce tableau-ci. Crée-en un autre pour chaque propriété, genre Matiere mat[1900][1200];

et est il possible de n envoyer que les 3 premieres dimensions d un tableau dans un autre?

->non, d'où ma réponse précédente

et est il possible de faire hwnd=decor ou un truc du genre hwnd=createcompatibledc(decor)

-> pas la moindre idée, lis la doc.

qu est ce qui est le plus rabide? a=b ou *b

-> ???



_______________________
Omnia vincit labor improbus
http://calvin-studio.fr
0
gregroar Messages postés 42 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 19 novembre 2010 1
18 juin 2010 à 01:11
Merci Arnaud t'es mon meilleur collaborateur, je pensais pas qu un tableau a une dimension était suffisant^^.
il suffit de lire dedans avec une fonction de x.
C'est quoi ca en maths déjà? les inéquations, les équations?
m'en fut j ai tout oublié.
Ca marche c'est le principal!! enfin presque``_
Merci encore.
0
Rejoignez-nous