Inventaire du type jeux cliquer et pointer ?

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Inventaire du type jeux cliquer et pointer ?

Message par threedslider »

Est ce quelqu'un sait comment faire du coding PB en exemple de faire l'inventaire du type jeux Cliquer et Pointer ?

Disons comment créer les tableaux 3 lignes et 6 colonnes, ensuite gérer les items dans les cases lors de placement (mettre à jour, échanger les items dans les cases et détruire le ou les items l'une des cases) ?

Des exemples avec les codes seront les bienvenues ^^
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Inventaire du type jeux cliquer et pointer ?

Message par blendman »

salut

j'ai fait des inventaires pour mes jeux, et c'est souvent le même principe.
Ce n'est pas compliqué ;).

Tu peux utiliser une list() ou un tableau (array).

En général, j'utilise un tableau, car c'est facile de récupérer son id et de le gérer, on peut aussi le trier facilement, etc...

Un petit exemple vite fait (tu peux juste sélectionner l'objet, mais une fois que tu as son identifiant (id), tu fais ce que tu veux avec :

Code : Tout sélectionner

; exemple jeu : inventaire basic

Structure sObj
  name$
  id.w ; l'identifiant de ton objet, avec cette id, tu vas chercher dans un fichier texte ses caractéristiques
  image.i ; l'image qu'on va utiliser pour cette 
  nb.w    ; le nombre d'objet de cet type qu'on a
  Type.a  ; le type d'objet (exemple 0 = ressource, 1= arme, 2 = armure, etc...
  
  ; tu peux ajouter des caractéristiques pour ton objet si tu veux.
EndStructure
; on créé le tableau pour afficher les objets :
Global Dim MesObjets.sObj(0), NbObj = -1
; je mets nbObj à -&, car un tableau a toujours un element (le 0), or, au départ, nous on n'a aucun objet.


Procedure UpdateInventory()
  Shared ObjID
  ; on update l'inventaire
  b=2
  s = 64 +b*2 ;(taille de l'icone de l'objet+ l'espace)
              ; 3 lignes x 6 colonnes = 18
  If StartDrawing(CanvasOutput(0))
    Box(0,0,6*s,3*s,RGB(100,100,100))
    
    For i=0 To 17
      ; on calcule la position de l'image
      x = Mod(i,6)*s +b
      y = (i/6)*s+b
      Box(x,y,s-b,s-b,RGB(150,150,150))
    Next
    ; on va dessiner les images
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    For i=0 To ArraySize(MesObjets())
      ; on calcule la position de l'image
      x = Mod(i,6)*s+b
      y = (i/6)*s+b
      DrawAlphaImage(ImageID(MesObjets(i)\image), x, y)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(x+5,y+s-20,Str(MesObjets(i)\nb))
      
      If objID=i
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(x+b/2,y+b/2,s-b*2,s-b*2,RGBA(100,0,0,200))
      EndIf
      
    Next
    
    StopDrawing()
  EndIf
EndProcedure
Procedure EventInventory()
  Shared ObjID
  ; b = espace entre 2 case
  b=2
  s = 64+b*2 ; taille total d'une case
  id  = objId
  
  If EventType() = #PB_EventType_LeftButtonDown 
    If StartDrawing(CanvasOutput(0))
      x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
      y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
      ; on va vérifier si on a cliqué sur un objet
      If x<=6*s And y<=3*s
        ; on vérifie l'id de l'objet
        Id = x/s+ (y/s)*6
      EndIf
      StopDrawing()
      ; s'il a changé, on va update
      If objid<>Id
        ObjID = id
        UpdateInventory()
      EndIf
    EndIf
  ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
    If StartDrawing(CanvasOutput(0))
      x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
      y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
      ; tu peux bouger l'objet ou faire ce que tu veux
      StopDrawing()
    EndIf
    
  EndIf
EndProcedure
Procedure AddObjectToInventaire(id, nb)
  ; on verifie si on a l'objet dans l'inventaire
  For i=0 To ArraySize(MesObjets())
    ok = 0
    If id = MesObjets(i)\id
      ; on l'a déjà 
      ok = 1
      MesObjets(i)\nb + nb
      Break
    EndIf
  Next
  ; si on ne l'a pas, on ajoute l'objet et son nombre
  If ok = 0
    ; on ajoute l'obvjet
    NbObj+1
    i = NbObj
    ReDim MesObjets(i)
    With MesObjets(i)
      \id = id
      \nb = nb
      ; je créé l'image pour l'inventaire, mais on devrait utiliser l'icone de l'objet (un png par exemple)
      s=64
      \image = CreateImage(#PB_Any, s,s, 32, #PB_Image_Transparent)
      If StartDrawing(ImageOutput(\image))
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        Circle(s/2,s/2,S/2-2, RGBA(100+Random(155),100+Random(155),100+Random(155),255))
        StopDrawing()
      EndIf
    EndWith
  EndIf
EndProcedure

w=1024
h=768
If OpenWindow(0, 0, 0, w, h, "Inventory", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CanvasGadget(0, 10, 10, w, h)
  For i = 0 To 15
    AddObjectToInventaire(i, 1+Random(4))
  Next
  UpdateInventory()
  
  Repeat
    Event = WaitWindowEvent(1)
    
    If Event = #PB_Event_Gadget
      Select EventGadget() 
        Case 0
          EventInventory()
          
      EndSelect
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf

par contre, peut etre que ce mesasge aurait été mieux dans "jeu" ou dans "débutant" (c'est pour les questions) ;)

A+
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Inventaire du type jeux cliquer et pointer ?

Message par threedslider »

Trop cool ! Merci Blendman ^^

Je vais voir ce que je peux faire 8O
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Inventaire du type jeux cliquer et pointer ?

Message par blendman »

Salut

Par contre, là, j'ai utilisé un canvasgadget() pour l'exemple, mais dans un jeu, tu devras sans doute utiliser les sprites, donc, ce sera un peu différent pour la gestion des clics souris, mais le principe reste identique : récupérer l'identifiant de l'objet , puis faire ce que tu veux avec.

Après, tu peux aussi utiliser le canvasgadget() pour créer un petit jeu 2D ;).
Mais ce sera peut-être moins performant que les sprites.

ça dépend si dans ton jeu, tu as beaucoup d'images qui se superpositionnent, s'il y a du scrolling, la taille des images, etc...

car le canvasgadget() présente aussi pas mal d'avantage, notamment les events souris et clavier facilités, et avec la lib vectordrawing, tu peux avoir un jeu zoomable à l'infini sans aucune perte :). Et créer tes images directement dans purebasic (notamment avec mon logiciel cartoon qui permet d'exporter en purebasic :)).

Sur le forum anglais il y a même des exemple d'animation intéressants avec le canvasgadget() et la lib vectordrawing.


Pour les tableaux, j'ai ces macros-ci qui peuvent être utile (peut-être qu'il y a moyen de les améliorer) :

Code : Tout sélectionner

;{ macros array
Macro DeleteArrayElement(ar, el)
    
    For a=el To ArraySize(ar())-1
        ar(a) = ar(a+1)
    Next
    
    a = 0
    If ArraySize(ar())-1>=0
        a = ArraySize(ar())-1    
    EndIf
    ReDim ar(a)
    
EndMacro

Macro InsertArrayElement(ar, el)
  
  a = ArraySize(ar())+1    
  ReDim ar(a)
  
  For a=ArraySize(ar())-1 To el Step -1
    ar(a+1) = ar(a)
  Next
    
EndMacro
;}

Avec ça, tu peux supprimer facilement un objet de ton inventaire ;).
Mais il faudra peut-être les adapter un peu pour ton jeu.
Répondre