CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C-SDL]Inventaire...

Epoch
Epoch
Niveau 10
23 février 2010 à 23:57:28

Bonsoir à tous!

Certains ici ont déjà dû voir mon autre topic, sur les collisions, dont le problème a été résolu.

Bon, ce soir, le souci, c'est que je programme l'inventaire. J'ai pour ainsi dire fini 75% de la programmation de l'inventaire, les 25% restant étant pour l'aspect graphique. Et on y vient!

Bon, je ne veux pas réaliser un truc super hype (à vrai dire, j'ai pas le temps pour ça là :x (oral dans un mois, donc bon)), juste quelque chose de ce style :

http://s2.noelshack.com/upload/244601537400_inventaire.png

(Bon, graphiquement, je retoucherais, évidemment, mais niveau programmation, je veux gérer un truc de ce style quoi).

L'inventaire va se servir, à la base, de cette structure :

typedef struct {

objet *TabObjets;
int taille;
int nombreObjets;

}inventaire;

typedef struct {
SDL_Rect position;
SDL_Surface* image;
int numserie;
char* NomObjet;
char* NomImage;
char* MessagePriseObjet;
char* MessageUseObjet;
bool Presence;

}objet;

(Je me doute que y'a mieux en ce qui concerne les structures, m'enfin, ma foi, c'est pas le sujet.)

Bref, par exemple, au niveau de l'affichage, y'a aucun souci, je peux me débrouiller de ce côté là. Mais :

Je bloque totalement à un moment (j'ai rien programmé hein, je ne fais qu'y réfléchir là), à savoir :

Comment établir un lien entre l'image(dans le tableau) sur laquelle on va cliquer, et l'indice du tableau dans lequel se trouve l'objet?

C'est là l'unique problème...

J'avais pensé à quelque chose de totalement pas pratique : Faire une structure if du style :

Si on clique dans la zone de l'objet 1 (avec les coordonnées + la taille de la case), alors on prend l'indice 0
Si on clique dans la zone de l'objet 2, alors on prend l'indice 1
etc...etc...

Mais vous imaginez ça avec un inventaire à 500 cases?

Donc voilà, si quelqu'un avait une idée là-dessus (pas me faire le code hein? Juste une suggestion, une piste...), ce serait top.

Passez une bonne soirée, et merci d'avance :)

dnob700
dnob700
Niveau 10
24 février 2010 à 00:24:00

remplacer tes 500 if par un seul :

si on clique dans la zone de l'objet n alors on prend l'indice n-1 ?...

Bien sûr il faut déterminer n. Mais ce n'est pas plus dur à partir des coordonnée que de déterminer si c'est la zone de l'objet 1 par exemple.

Epoch
Epoch
Niveau 10
24 février 2010 à 03:05:26

J'ai pensé à un truc dans le même style dnob, mais je pense que ça reviendrait au même. Car le clic sur un bouton ne me donnera que l'information de la zone et non pas la position réelle du bouton (sinon j'aurais fait en sorte de faire une correspondance entre SDL_Rect...), et on en revient aux 500 if (puisqu'il faudra dire que la zone 1 correspond à telle zone de l'image, etc...)

godrik
godrik
Niveau 30
24 février 2010 à 03:09:12

tes objets sont tous rectangulaire, donc ce n'est pas bien difficile comme probleme....

Si ta zone d'affichage est de taille W que chaque rectangle est de taille w et qu'un clique est a la position x, alors x/w te dit dans quelle colonne tu es. Idem sur y pour savoir dans quelle ligne tu es. A partir de la, retrouve l'indice de l'objet devrait etre facil.

Epoch
Epoch
Niveau 10
24 février 2010 à 03:13:05

"Si ta zone d'affichage est de taille W que chaque rectangle est de taille w et qu'un clique est a la position x, alors x/w te dit dans quelle colonne tu es"

Hm, il me faudrait des détails...

zone d'affichage=>écran?
Parce que tu semble nommer les deux variables W et w, c'est la même?

Epoch
Epoch
Niveau 10
24 février 2010 à 03:16:54

"Idem sur y pour savoir dans quelle ligne tu es."

Avec la hauteur à la place de la largeur, bien sûr?

godrik
godrik
Niveau 30
24 février 2010 à 04:26:16

W est inutile ici. Ce que j'appelle la zone d'affichage c'est la ou il y a l'inventaire. Ce n'est probablement pas en plein ecran.

Epoch
Epoch
Niveau 10
24 février 2010 à 14:18:29

En effet, c'est fenêtré.

Mais pour x/w, tu me dis que ça va me donner la colonne et pour y/w (ou y/h, d'ailleurs, je te renvoie à ma question ^^), mais il faut savoir que même si y'a un tableau 2D pour l'inventaire, le tableau derrière est un tableau simple (donc pas de notion de ligne ou de colonne...), donc comment "convertir" en indice le résultat obtenu par la division x/w?

godrik
godrik
Niveau 30
24 février 2010 à 17:12:22

bah ca depend de comment tu les affiches mais a mon avis cela ressemble a :

1 2 3 4 5
6 7 8 9 10

Donc je te laisse deviner comment tu vas faire la conversion.

Epoch
Epoch
Niveau 10
24 février 2010 à 21:52:16

Oui, ça ressemble exactement à ça...

De toutes façons, pour faire la conversion, faudra que je vois le resultat obtenu par rapport à la zone cliqué (sauf si tu acceptes de me mettre sur la piste X) )

Epoch
Epoch
Niveau 10
25 février 2010 à 00:04:25

Bon, je viens de faire une simulation, et tu avais raison godrik, ça marche.

Cependant, je viens de comprendre le principe pour le cas où on a une seule ligne de 20 blocs. Hors moi, je voudrais un tableau 5*4 dans l'inventaire.

Donc là, ça ressemblerait à, comme tu dis :

1 2 3 4 5
6 7 8 9 10

Pour avoir 6, par exemple, je dois tenir compte du y? Et si oui, de quelle manière?

Epoch
Epoch
Niveau 10
25 février 2010 à 00:45:09

Bon, tant pis pour le triple post, mais je pense avoir trouvé quelque chose.

Soit x et y les coordonnées de la souris.
Soit d la dimension du carré (oui, je vais faire des carrés, la formule sera moins chiante.)

La formule serait :

x+y+(5*d)*y modulo d
____________________

d

Pour vérifier qu'on obtient bien 6 :

Considérons un espace d'affichage tel que l'écran SDL.

Disons que d = 10
Disons que x = 9 et que y = 18 (ça correspond au carré du dessous)

ça donnerait ceci :

19+18+(5*10)*18 modulo 10
____________________

10

J'obtient 77. Quotient 7. Décrémentation de l'indice, ça donne 6

J'aimerais prendre un autre exemple (je suis pas sûr du tout au moment où j'écris, je le rappelle)

Je descends d'un cran. Donc :

x = 9
y = 20

9+28+(5*10)*28 modulo 10
____________________

10

Donc

9+28+50*2
____________________

10

Donc 137/10

Quotient 13... par décrémentation on obtient 12.

Hors, ici, je devrais avoir 11, vu que c'est des lignes de 5 cases.
Notons que pour y = 20, on a bel et bien 11, ce qui présente un gros problème.

Nouvelle question : Pourquoi mon raisonnement par en live dès qu'il y a une 3ème ligne?

Epoch
Epoch
Niveau 10
25 février 2010 à 00:46:25

Oula, j'ai sorti une belle connerie (mais ça change rien).

Remplacez modulo par /... (je calculais avec / mais j'ai mis modulo, qu'est-ce qui m'a pris -_-)

Epoch
Epoch
Niveau 10
25 février 2010 à 00:50:06

(et désolé pour le cintuple post. pour :

Je descends d'un cran. Donc :

x = 9
y = 20

y = 28 en fait...

)

Désolé pour le désagrément :s

Epoch
Epoch
Niveau 10
25 février 2010 à 13:20:30

Bon, ça va faire le 6ème post, ceci dit, j'ai réussi à finaliser la formule.

x+y+(5*d)*y/d
____________________ - y/d

d

Je lève une exception, qui est la première ligne : ça ne sera pas - 0 mais bien - 1 (donc pour la première ligne, on a -1, pour la deuxième, on aura toujours -1, mais après, y'aura -2, -3, -4 pour y/d...)

Je ne travaille qu'avec des entiers, dans ce cas précis.

Voilà donc une solution mathématique pour faire l'inventaire avec une matrice carrée constituée de carrés, pour ceux à qui ça pourrait servir :)

Epoch
Epoch
Niveau 10
25 février 2010 à 13:21:18

x+y+(c*d)*y/d
____________________ - y/d

d

c étant le nombre de colonnes...

tbop2
tbop2
Niveau 10
27 février 2010 à 18:14:28

Moi j'ai juste une question idiote : Pourquoi s'embêter à faire ça en C ? Et pas avec la bibliothèque SFML C++ ?

Epoch
Epoch
Niveau 10
27 février 2010 à 18:35:37

Tbop2=>Peut-être que c'est pour un projet tuteuré à mon IUT? ;)

tbop2
tbop2
Niveau 10
27 février 2010 à 20:19:19

Aaaaah c'est pour ça :)

Epoch
Epoch
Niveau 10
27 février 2010 à 20:23:33

Ben oui, sinon, j'aurais fait ça en C++ avec SFML (la SDL c'est chi... mais à un point...)

Je posterais une démo quand j'aurais résolu un souci (je sais d'où ça vient, je sais comment le réparer mais j'ai la flemme là XD)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment