Page 1 sur 1

Idée pour gestion de cartes

Publié : lun. 06/avr./2015 14:02
par Ar-S
Salut,

En ce jour férié j'en ai profité pour créer mon dessin pour le jeu sur lequel je bosse.
Un BlackJack.
Image

J'ai commencé sur du canvas avec un paquet de cartes. Le soucis est que je dois mettre 5 ou 6 jeux.
J'aimerai donc votre avis sur la gestion de ces cartes. Je pense donc basculer vers un openwindowscreen

J'ai commencé par une structure comme ceci

Code : Tout sélectionner

Structure carte
  SP.i ; num sprite
  Val.b ; Valeur de la carte
  Fam.s ; famille (pic coeur carreau treffle)
  Nom.s ; Sous forme de string mais je pense virer celle ci qui est inutile
EndStructure

J'ai ensuite mis ça dans un tableau
Dim carte.carte(51) ; (52 cartes)
Avant d'aller plus loin, selon vous, dois-je faire un tableau de 6*52 cartes? 6 tableaux de 52 cartes?
Sachant que je mets ensuite tout dans une liste chainée.


Bref je n'ai pas l'habitude de gérer autant d'images/sprites, encore moins quand il y en a X copies de chaque.

Vos conseils m'intéressent. D'avance merci

Re: Idée pour gestion de cartes

Publié : lun. 06/avr./2015 14:30
par falsam
Et pourquoi pas tout dans la liste directement

Code : Tout sélectionner

Structure Carte
  jeu.i     ; de 1 à 5 (ou 6)
  carte.i ; 1 à 52 (Correspond aux sprites)
EndStructure

Global NewList Sabot.Carte()

;Remplissage du sabot (5 jeux dans cet exemple)
For jeu = 1 To 5 
  For carte = 1 To 52
    AddElement(Sabot())
    Sabot()\jeu = jeu
    Sabot()\carte = carte
  Next
Next

CountCards = ListSize(Sabot()) - 1

;Mélanger le jeu
RandomizeList(Sabot())

;Tirage des cartes durant la parties 
ForEach Sabot()
  Debug Str(Sabot()\carte) + " du jeu " + Str(sabot()\jeu)
Next

Re: Idée pour gestion de cartes

Publié : lun. 06/avr./2015 14:58
par Ar-S
Merci Falsam je vais mater ça.

Re: Idée pour gestion de cartes

Publié : lun. 06/avr./2015 15:48
par majikeyric

Code : Tout sélectionner

;Mélanger le jeu
For n = 0 To CountCards
  SelectElement(Sabot(), Random(CountCards, 0))
  *FirstElement = @Sabot()
 
  SelectElement(Sabot(), Random(CountCards, 0))
  *SecondElement = @Sabot()
 
  SwapElements(Sabot(), *FirstElement, *SecondElement)
Next
On peut simplement utiliser : RandomizeList(Sabot()) pour mélanger

Re: Idée pour gestion de cartes

Publié : lun. 06/avr./2015 16:32
par falsam
Mais ouiIIIIiii ça fonctionne bien. Comment ai je pu passer à cotés de cette fonctionnalité !!! Merci majikeyric :)

le code est modifié en conséquence. Ar-S on attend la suite :)

Re: Idée pour gestion de cartes

Publié : lun. 06/avr./2015 17:06
par Ar-S
Merci majikeyric ! j'étais aussi passé coté de cette fonction.
Je partais aussi dans du swapelement avec du random (hors pointeur)

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 9:53
par Ollivier
@Ar-S

Salut, dans la lignée de l'idée de Falsam (qui présente déjà une structure tout à fait fonctionnelle), tu peux tenter de réduire les arguments.

Code : Tout sélectionner

Structure Carte
   Sprite.I
   Desc.I
   Angle.F
EndStructure

Global Dim Carte.Carte(207)
Le champ "Desc.I" (description) contient suffisamment de place pour stocker l'intégralité de la description d'une carte via ses bits.

Ex:
b0 : carte affichée(1) ou non (0)
b1 : couleur (0=noir 1=rouge)
b2 à b3 : numéro de sabot original
(00=1er
01=2nd
10=3ème
11=4ème)
b4 à b7 numéro de carte
(0000 libre pour éventuel Joker
01h à 0Ah = cartes de 1 à 10
0Bh = valet
0Ch = dame
0Dh = roi
0Eh à 0Fh = libre pour nouvelles règles)
b8 à b31 = champ de bits libres pour séquencer le programme.

Là, avec 8 bits de description tu sais d'où vient ta carte, si elle est affichée, et qu'est-ce qu'elle représente.
Dans la structure "CARTE" tu as le numéro de sprite. Donc tu sais sa position (SpriteX(), etc...) et sa taille (SpriteWidth() ).

Il te reste 24 bits (en mode 32 bits) pour définir où se trouve ta carte durant la partie, si sa valeur est en cours de comptabilisation, etc...

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 13:07
par Ar-S
Merci Ollivier pour ta suggestion.
J'avoue que je ne pige pas trop cette histoire de bits. (pour info j'ai pas besoin de connaître la couleur par exemple)

Pour le moment je planche sur 2 questions.
1ère question
Je bosse en OpenWindowScreen() pleine écran. Mon image de la table fait 1920 x 1080 et mes sprites sont dessinés sur cette base.
Si je passe sur mon portable qui est en 1600 de large, j'applique un resizeimage en 1600 (un desktopWidth(0)) x 1080/coef (le coef est de 1.23)
Ma question est la suivante. Doit-on se taper un zoomsprite sur tous les sprites pour les mettre au prorata de la table ?

Seconde question et j'en reviens à mes cartes.
- Mes images png de cartes sont dans un dossier datas
- Elles se nomme 1Cxxx.png 1CAxxx.png 1Txxx.png 1Pxxx.png (coeur carreau trèfle pic). Pour les figure les noms de fichiers commencent par 10Vxxx.png etc...
Voilà comment je procède pour charger les valeurs de mes 52 cartes.

Code : Tout sélectionner

Enumeration Cartes 1
  #S1:#S2:#S3:#S4:#S5:#S6:#S7:#S8:#S9:#S10:#S11:#S12:#S13
  #S14:#S15:#S16:#S17:#S18:#S19:#S20:#S21:#S22:#S23:#S24:#S25:#S26
  #S27:#S28:#S29:#S30:#S31:#S32:#S33:#S34:#S35:#S36:#S37:#S38:#S39
  #S40:#S41:#S42:#S43:#S44:#S45:#S46:#S47:#S48:#S49:#S50:#S51:#S52
EndEnumeration

Structure SP
  L.i
  H.i
  X.i
  Y.i
  Speed.b
  Path.s
  SID.i
  VAL.i
EndStructure

Global Dim SP.SP(52) ; je commencerai à 1 pas à 0

Procedure ChargeImage(Dossier.s)
  Protected MonSprite
  
  Directory$ = GetCurrentDirectory()+Dossier.s
  MonSprite = 1
  If ExamineDirectory(0, Directory$, "*.png")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        NomCarte.s = DirectoryEntryName(0)
        Duo.s = Left (NomCarte,2)
        If Duo = "10"
            VALEUR = 10
          Else
            VALEUR = Val(Left(duo,1))   
          EndIf

          
          SP(MonSprite)\Path = GetCurrentDirectory()+Dossier.s+"\"+DirectoryEntryName(0)
          SP(MonSprite)\SID  = LoadSprite(MonSprite, SP(MonSprite)\Path)
          SP(MonSprite)\VAL  = VALEUR
          SP(MonSprite)\H    = SpriteHeight(MonSprite)
          SP(MonSprite)\L    = SpriteWidth(MonSprite)
;           SP(MonSprite)\X    =
;           SP(MonSprite)\Y    =
;           SP(MonSprite)\Speed =
          MonSprite + 1
      EndIf
    Wend
    FinishDirectory(0)
  EndIf

EndProcedure

ChargeImage("datas")

; TEST
Debug "#S1 : " + #S1
Debug "SP(1)\Path : "+ SP(1)\Path
Debug "Valeur : " + SP(1)\VAL

Les debug montrent que ça fonctionne bien du coup je me paume pour dupliquer ça dans 6 sabots (enfin 6 sabots en tout)

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 14:56
par Ollivier
Ar-S a écrit :je pige rien aux bits
Il y a des avantages et des inconvénients à utiliser les bits.
Le principal avantage c'est l'optimisation ASM plus simple à mettre en place, une fois ton programme créé. C'est des JUMP, des CALL et des Jcc qui n'existent plus, remplacés par des calculs logiques/maths plus rapide.

L'inconvénient, c'est la complexité au départ.
Conclusion: c'est perdre du temps maintenant, et en gagner plus tard.

Maintenant, vu que ça ne te parle pas trop, et que les ordinateurs sont rapides, cette nécessité perd du terrain!

Dans ce cas, une structure exhaustive fera l'affaire (ce qui rejoint la suggestion de Falsam).

Désolé pour la couleur: j'ai juste considéré le rouge et le noir (2 états), ce qui est une erreur. Il faut évidemment considérer 4 couleurs (4 états): pique, etc...

Pour ton WindowedScreen(), tu peux ajuster chaque sprite. Si tu considères 208 cartes, c'est 3 lignes (for:resize:next ou for:transform:next ou for:zoom:next, etc...). C'est vrai que c'est pénible si tu considères plusieurs jeux de carte: pour ajuster, c'est 2n+1 lignes de code ou n est le nombre de paramètres de chaque carte.

Peut-être laisser OpenWindowedScreen() ajuster lui-même automatiquement? L'inconvénient dans ce cas, c'est l'impossibilité d'obtenir un plein écran "propre" via OpenScreen() mais juste un plein écran "déguisé" avec OpenWinScreen().

Là encore, tout est question de gourmandise en ressources. Si ton ordi est rapide, "windowed" ou "fullscreen", c'est pareil.

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 16:09
par Ar-S
Merci pour ta réponse.
Je suis en train de positionner mon menu et un rollhover au dessus pour faire joli (je viens de faire le 1er c'est propre).
Je redimensionnerai les Sprites en boucle vu que je stock les tailles en structure, ça devrait le faire.
Par contre je retrouve ce p...tain de lag de la souris RAT5.. Faudra que j'ajoute l'astuce vu dans de précédents sujets concernant ce prob. C'est vraiment chiant.
Si y'a aucun soucis dans aucun jeu, il doit y avoir tout de même quelque chose qui chie avec PB de ce coté.

Petit aperçu de l'evolution graphique de la chose et du 1er rollhover du menu :)
http://stock.ldvmultimedia.com/bjack.gif

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 16:45
par Micheao
c'est de la bombe ton jeu tu es doué

Re: Idée pour gestion de cartes

Publié : mer. 08/avr./2015 16:51
par Ar-S
Pour le moment c'est pas grand chose mais merci ;)

Re: Idée pour gestion de cartes

Publié : sam. 11/avr./2015 16:04
par Ar-S
---- j'annule mon dernier bug, je suis débile -----
je l'éditerai au prochain soucis.