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 ^^
Inventaire du type jeux cliquer et pointer ?
- threedslider
- Messages : 455
- Inscription : dim. 01/juil./2018 22:38
Re: Inventaire du type jeux cliquer et pointer ?
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 :
par contre, peut etre que ce mesasge aurait été mieux dans "jeu" ou dans "débutant" (c'est pour les questions) 
A+
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

A+
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
- threedslider
- Messages : 455
- Inscription : dim. 01/juil./2018 22:38
Re: Inventaire du type jeux cliquer et pointer ?
Trop cool ! Merci Blendman ^^
Je vais voir ce que je peux faire
Je vais voir ce que je peux faire

Re: Inventaire du type jeux cliquer et pointer ?
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) :
Avec ça, tu peux supprimer facilement un objet de ton inventaire
.
Mais il faudra peut-être les adapter un peu pour ton jeu.
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


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.
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english