Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
305 connectés actuellement
30945934 visiteurs depuis l'ouverture
1972 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
loly74 -
posté le 08/08/2017 à 18:54:29 (861 messages postés)
| Ex Couteau Suisse Agréé | Domaine concerné: réalisation Logiciel utilisé: RM XP Salut à tous !
J'ai un souci avec mon système d'inventaire en event. Ayant remplacé le menu de base par le mien en event et image, j'ai voulu continuer sur ma lancée et créer le reste avec des fonctions d'événements communs.
A l'heure actuelle, voilà à quoi ressemble mon inventaire :
L'inventaire est composé de 30 slots. un slot se définit par 3 variables :
- le numéro du slot (allant de 1 à 30)
- le contenant du slot (0 c'est vide, et ça va aller jusqu'à autant d'objet qu'il le faut dans le jeu)
- la quantité d'objet contenu dans ce slot ( allant de 1 à 10 )
Ces valeurs sont ensuite montrées au joueur sous forme d'image placée par des coordonnées X et Y variant selon
le n° du slot, il y a donc 2 images montrées par slot (l'objet contenu dans le slot et sa quantité).
Donc l'inventaire va afficher 60 images en même temps. Problème : On peut afficher jusqu'à 50 images max sur RM XP, ce qui explique que sur mon système actuel, on peut avoir 30 objets dans son sac, mais seulement 10 sont montrés à la fois, pour voir le reste, on se sert d'un système d'onglet en haut des slots visibles en allant aux extrêmes de gauche à droite pour switcher.
Voilà pour l'affichage, mais y a ensuite un système en event commun qui est appelé par le moindre event qui va modifier votre inventaire en y ajoutant ou retirant des objets.
Cet événement commun va demander 3 conditions à un slot, et va passer au suivant si le système d'ajout d'objet ne peut pas être mis en oeuvre :
Condition : l'ID de l'objet reçu est-il = à l'ID du slot ?
si non : passe au slot suivant
si oui :
Condition : La quantité contenue dans le slot est-elle inférieure à la variable "slot max" (qui actuellement = 10 )
[ boucle :
Quantité slot +1
Quantité objet reçu -1
Condition : quantité objet = 0?
si non : retour au début du processus
si oui : fin du processus ]
Bref, vous voyez le principe, l'event commun va poser ces questions en boucle jusqu'à 30 fois si il le faut, mon pauvre PNJ blond qu'on peut voir en arrière ne bouge plus, et pas parce que j'ai programmé un quelcque event commun qui le stoppe ou quoi ... MAIS PARCE QUE CA RAME, PUTAIN !
Donc voilà, j'ai pas mal de problème avec ce système en event : trop lourd à prendre en charge par rm, trop dur à programmer pour moi (car pour l'instant je me suis limitée à 14 objets différents, mais ça va inévitablement augmenter, des objets vont changer d'ID, etc... sachant que chaque ID a ses fonctions et ses effets, ça va vite devenir difficile à gérer au cas par cas dans ma soupe de lettre qui me sert d'event commun d'inventaire)
et en plus ça me bouzille 60 variables dans ma BDD ...
Tout ça pour dire : est-ce que vous avez une idée pour optimiser ça en event ? Ou de quel genre de script je pourrais utiliser ? j'ai déjà cherché des scripts d'inventaire comme celui que je souhaite mais j'ai rien trouvé sur les communautés, fischtre.
J'ai totalement conscience que c'est un pari fou (voire impossible) de faire ça en event, mais j'ai pas trop le choix pour le moment... En plus je dois présenter une démo du jeu pour une convention dans un mois, alors c'est corsé...
Merci à vous !
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 08/08/2017 à 19:05:37 (2313 messages postés)
- | | Nan, mais faire des systèmes inventaire en Event, c'est une cata.
Le mieux c'est clairement de le faire en script, voir semi script.
Le temps de ré-installer XP, et je bidouille un truc.
EDIT :
Du coup je t'ai bidouiller ça :
https://www.mediafire.com/file/j7cz0kz5kk79h1z/Project10.rar
La constante SIZE, c'est la taille d'une icone, SWITCH, c'est un interrupteur qui sert à detecter si tu fermes ou ouvre le menu ( CF l'évent de droite pour comprendre, quand t'actives l'interrupteur, le menu s'ouvre / se ferme. ), SWITCH_OPEN c'est pour savoir si le menu est ouvert ou fermé.
Les variables @x / @y correspondent aux coordonnées X/Y de la fenêtre.
En appuyant sur C sur un item, ça appellera l'évent commun lié à cet item.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
loly74 -
posté le 08/08/2017 à 23:01:27 (861 messages postés)
| Ex Couteau Suisse Agréé | Wow, merci beaucoup, Mack ! Je teste ça tout de suite !
Edit : bon, je rencontre quelques problèmes. En indépendant sur mon projet, le script fonctionne et j'ai eu aucun souci à le réadapter pour qu'il colle aux exigences du jeu.
En revanche, c'est quand je veux l'intégrer à mon menu déjà existant qu'il y a un souci...
En fait, j'ai de la peine à comprendre les différences entre SWITCH et SWITCH_OPEN
Ce que je n'ai pas dit plus tôt, c'est qu'à l'appui d'une touche, un event commun "menu" s'ouvre à condition que l'interrupteur "menu accessible" soit activé (pour éviter d'ouvrir le menu dans les cinématiques), il contient 4 catégories (Inventaire, Carte, Relations et Quitter) et on switche de catégorie avec L et R.
Tout mon menu est affiché avec l'image n°7, et quand ce menu se ferme, l'image n°7 change d'apparence pour être mon interface générale (qui est toujours visible quand mon menu est ouvert, d'ailleurs) tout est regroupé en une image pour des questions d'ergonomie.
Du coup, dans ton exemple on active l'interrupteur à l'appui d'une touche, mais dans mon cas comment je peux ntégrer ton script à l'ensemble de mon event commun qui fait mon menu ?
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 09/08/2017 à 00:48:28 (2313 messages postés)
- | | Bah, quand le joueur appuie sur les touches L et R, si il est dans le menu d'item, tu actives l'interrupteur SWITCH, ça fermera le menu d'item, et toi tu appelles ton autre menu.
Et si il est censé être dans les Items après un L / R, tu fermes ton menu et tu actives SWITCH pour ouvrir le menu.
En gros, SWITCH c'est comme un bouton poussoir, quand t'appuie dessus, si la lumière été allumé, elle s'éteint, et si elle été éteinte elle s'allume.
Tandis que SWITCH_OPEN sert juste à savoir si le menu d'Item est ouvert.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
loly74 -
posté le 09/08/2017 à 02:31:20 (861 messages postés)
| Ex Couteau Suisse Agréé | Donc si je comprends bien. En activant SWITCH, ça active SWITCH_OPEN
et si j'active à nouveau SWITCH sachant qu'il l'est déjà, ça me désactive SWITCH_OPEN ?
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 09/08/2017 à 10:34:04 (2313 messages postés)
- | | C'est ça.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
loly74 -
posté le 09/08/2017 à 13:44:39 (861 messages postés)
| Ex Couteau Suisse Agréé |
ça marche au poil ! J'ai même pu régler quelques petites choses dans le script pour que le curseur, la fenêtre et les objets s'affichent au pixel près où je voulais.
Toutefois, le chiffre est un peu trop grand et sort du cadre en cas de grosse quantité d'objet...
Merci beaucoup, Mack !
Mais j'ai encore une petite question : si je souhaite un jour réutiliser ton script pour un autre inventaire d'un autre jeu par exemple... qu'est-ce que je vais devoir modifier ? (sachant qu'il pourrait dans ce jeu afficher les 30 objets d'un coup, ou avoir 4 onglets, pouvoir posser 99 objets max au lieu de 10 sur un même slot... ) ?
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 09/08/2017 à 14:30:41 (2313 messages postés)
- | |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
| #==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
SIZE = 64
PAGE_MAX = 3
ROW = 2
COL = 5
X = 0
Y = 0
FONT_SIZE = 18
SWITCH = 1
SWITCH_OPEN = 2
class Scene_Map
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias main_old main
def main
$game_switches[SWITCH_OPEN] = false
@spriteBack = Sprite.new
@spriteBack.bitmap = RPG::Cache.picture("back1")
@spriteSelector = Sprite.new
@spriteSelector.bitmap = RPG::Cache.picture("selector")
@index = 0
@x = X
@y = Y
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
@spriteBack.x = @x
@spriteBack.y = @y
@window_item = WindowItemCustom.new((COL*SIZE)+48,(ROW*SIZE)+48)
@window_item.x = @x
@window_item.y = @y
@spriteBack.z = @window_item.z - 1
@spriteSelector.z = @spriteBack.z + 1
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
main_old
@spriteBack.bitmap.dispose
@spriteBack.dispose
@spriteSelector.bitmap.dispose
@spriteSelector.dispose
@window_item.dispose
end
alias update_old update
def update
if ($game_switches[SWITCH_OPEN])
if Input.repeat?(Input::LEFT)
if (@index % COL == 0)
p = @window_item.getPage - 1
if (p < 1)
p = PAGE_MAX
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index + (COL-1)) % (ROW * COL)
else
@index = (@index - 1) % (ROW * COL)
end
end
if Input.repeat?(Input::RIGHT)
if (@index % COL == COL - 1)
p = @window_item.getPage + 1
if (p > PAGE_MAX)
p = 1
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index - (COL-1)) % (ROW * COL)
else
@index = (@index + 1) % (ROW * COL)
end
end
if Input.repeat?(Input::UP)
@index = (@index - COL) % (ROW * COL)
end
if Input.repeat?(Input::DOWN)
@index = (@index + COL) % (ROW * COL)
end
if Input.trigger?(Input::C)
# If command event ID is valid
@item = @window_item.getItem(@index)
if @item.common_event_id > 0
$game_switches[SWITCH] = true
# Command event call reservation
$game_temp.common_event_id = @item.common_event_id
# If consumable
if @item.consumable
# Decrease used items by 1
$game_party.lose_item(@item.id, 1)
end
@window_item.refresh
end
end
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
if $game_switches[SWITCH]
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = false
Graphics.freeze
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
Graphics.transition
end
else
if $game_switches[SWITCH]
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = true
Graphics.freeze
@spriteBack.visible = true
@window_item.visible = true
@spriteSelector.visible = true
Graphics.transition
end
end
update_old
end
end
#==============================================================================
# ** WindowItemCustom
#------------------------------------------------------------------------------
#==============================================================================
class WindowItemCustom < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# w : Width
# h : Height
# c : Column
# r : Row
#--------------------------------------------------------------------------
def initialize(w,h)
super(0,0,w,h)
self.contents = Bitmap.new(w - 32, h - 32)
self.back_opacity = 0
self.opacity = 0
self.visible = true
@page = 1
refresh
end
def getItem(i)
return @data[i + (ROW * COL) * (@page - 1)]
end
def setPage(i)
@page = i
refresh
end
def getPage
return @page
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
@data = []
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
# If item count is not 0, make a bit map and draw all items
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, ROW * SIZE + 4)
self.contents.font.size = FONT_SIZE
index = (ROW * COL) * (@page - 1)
for i in 0...(ROW * COL)
if (index+i < @data.size)
draw_item(index, i)
end
end
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(j,index)
item = @data[j+index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
if item.is_a?(RPG::Item) and
$game_party.item_can_use?(item.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4 + index % COL * (SIZE)
y = index / COL * SIZE
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, SIZE, SIZE), opacity)
self.contents.draw_text(x + 2, y + SIZE - 24, 24, 32, number.to_s, 0)
end
end |
La nouvelle version du script.
J'pense que tu dois pouvoir tout paramétrer comme tu veux avec les Consts en début de script.
ROW, c'est le nombre de ligne ( Donc 2 dans le cas de ton screen ), COL le nombre de colonne ( 5 pour ton screen donc ), PAGE_MAX, le nombre de page à afficher.
Donc si tu veux 1 page de 30 items, tu mets que COL * ROW = 30 ( COL = 5 et ROW = 4 par exemple ), avec PAGE_MAX = 1.
Et de base, le max d'objet est de 99, donc ça gênera pas ^^.
Après, le gros problème de ton système, c'est que si t'as plus d'item que de nombre de slot disponible, les objets n’apparaîtront pas.
( Le joueur les aura bien, mais ils ne pourra pas y accéder. )
Donc si penses y ^^.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
loly74 -
posté le 09/08/2017 à 17:52:33 (861 messages postés)
| Ex Couteau Suisse Agréé | Citation: Après, le gros problème de ton système, c'est que si t'as plus d'item que de nombre de slot disponible, les objets n’apparaîtront pas.
( Le joueur les aura bien, mais ils ne pourra pas y accéder. ) |
Et y a pas moyen de tester une condition pour dire que l'inventaire est plein ?
e instaurant une variable "nombre de slot disponible dans l'inventaire" par exemple ?
Pour la nouvelle version, je teste tout de suite !
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 09/08/2017 à 23:05:48 (2313 messages postés)
- | | De base non.
Après, je peux facilement te faire un petit truc qui te calcul le nombre d'item différent dans l'inventaire.
EDIT :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
| #==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
SIZE = 64
PAGE_MAX = 3
ROW = 2
COL = 5
X = 0
Y = 0
FONT_SIZE = 18
SWITCH = 1
SWITCH_OPEN = 2
class Scene_Map
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias main_old main
def main
$game_switches[SWITCH_OPEN] = false
@spriteBack = Sprite.new
@spriteBack.bitmap = RPG::Cache.picture("back1")
@spriteSelector = Sprite.new
@spriteSelector.bitmap = RPG::Cache.picture("selector")
@index = 0
@x = X
@y = Y
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
@spriteBack.x = @x
@spriteBack.y = @y
@window_item = WindowItemCustom.new((COL*SIZE)+48,(ROW*SIZE)+48)
@window_item.x = @x
@window_item.y = @y
@spriteBack.z = @window_item.z - 1
@spriteSelector.z = @spriteBack.z + 1
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
main_old
@spriteBack.bitmap.dispose
@spriteBack.dispose
@spriteSelector.bitmap.dispose
@spriteSelector.dispose
@window_item.dispose
end
alias update_old update
def update
if ($game_switches[SWITCH_OPEN])
if Input.repeat?(Input::LEFT)
if (@index % COL == 0)
p = @window_item.getPage - 1
if (p < 1)
p = PAGE_MAX
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index + (COL-1)) % (ROW * COL)
else
@index = (@index - 1) % (ROW * COL)
end
end
if Input.repeat?(Input::RIGHT)
if (@index % COL == COL - 1)
p = @window_item.getPage + 1
if (p > PAGE_MAX)
p = 1
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index - (COL-1)) % (ROW * COL)
else
@index = (@index + 1) % (ROW * COL)
end
end
if Input.repeat?(Input::UP)
@index = (@index - COL) % (ROW * COL)
end
if Input.repeat?(Input::DOWN)
@index = (@index + COL) % (ROW * COL)
end
if Input.trigger?(Input::C)
# If command event ID is valid
@item = @window_item.getItem(@index)
if @item.common_event_id > 0
$game_switches[SWITCH] = true
# Command event call reservation
$game_temp.common_event_id = @item.common_event_id
# If consumable
if @item.consumable
# Decrease used items by 1
$game_party.lose_item(@item.id, 1)
end
@window_item.refresh
end
end
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
if $game_switches[SWITCH]
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = false
Graphics.freeze
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
Graphics.transition
end
else
if $game_switches[SWITCH]
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = true
Graphics.freeze
@spriteBack.visible = true
@window_item.visible = true
@spriteSelector.visible = true
Graphics.transition
end
end
update_old
end
end
#==============================================================================
# ** WindowItemCustom
#------------------------------------------------------------------------------
#==============================================================================
class WindowItemCustom < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# w : Width
# h : Height
# c : Column
# r : Row
#--------------------------------------------------------------------------
def initialize(w,h)
super(0,0,w,h)
self.contents = Bitmap.new(w - 32, h - 32)
self.back_opacity = 0
self.opacity = 0
self.visible = true
@page = 1
refresh
end
def getItem(i)
return @data[i + (ROW * COL) * (@page - 1)]
end
def setPage(i)
@page = i
refresh
end
def getPage
return @page
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
@data = []
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
# If item count is not 0, make a bit map and draw all items
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, ROW * SIZE + 4)
self.contents.font.size = FONT_SIZE
index = (ROW * COL) * (@page - 1)
for i in 0...(ROW * COL)
if (index+i < @data.size)
draw_item(index, i)
end
end
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(j,index)
item = @data[j+index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
if item.is_a?(RPG::Item) and
$game_party.item_can_use?(item.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4 + index % COL * (SIZE)
y = index / COL * SIZE
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, SIZE, SIZE), opacity)
self.contents.draw_text(x + 2, y + SIZE - 24, 24, 32, number.to_s, 0)
end
end
class Game_Party
def calc_nb_Inventory
j = 0
for i in 1...$data_items.size
if ($game_party.item_number(i) > 0)
j += 1
end
end
return j
end
end |
T'as juste à appeler $game_party.calc_nb_Inventory pour avoir le nombre d'item différent que le joueur à.
( Et seulement les items d'ailleurs, ce système n'affiche pas les armes. Si t'en as besoin je te le rajoute )
Ex :
1
| $game_variables[X] = $game_party.calc_nb_Inventory |
Va donner à la variable X le nombre d'item différent quand tu appelles ce morceau de script.
Le mieux c'est de directement faire tes conditions avec $game_party.calc_nb_Inventory.
Condition, 4 page, Script :
1
| $game_party.calc_nb_Inventory <= X |
Avec X le nombre max d'item différent.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | En fait, il faut voir l'inventaire comme celui d'Animal Crossing :
certains objets peuvent être mangés, équipés ou utilisés dans d'autres interfaces, mais ils sont tous mélangés dans l'inventaire.
EDIT : est-ce que j'ai une possibilité pour que les icones passent par-dessus les images ?
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 10/08/2017 à 23:54:39 (2313 messages postés)
- | | Nouvelle version :
https://www.mediafire.com/file/l0yi6dcl19bxw88/Project10.rar
( J'remet une démo car j'ai changé le système pour bloquer le héros. Et j'vais surement le rechanger plus tard, faut juste que je trouve comment. )
Donc, là, les pictures passent entre le fond du menu, et les icons des objets.
Dans ce menu, on a aussi les armes / armures.
Ensuite en appuyant sur C, les objets s’utilisent, même les effets de heal, et si c'est un équipement, il s'équipe.
Après, si je peux me permettre :
Mettre les armes / armures dans ce même menu, je suis pas sur que ça soit pertinent.
Ça va bouffer des slots pour le joueur, perso, j'aurais fait deux menus différents, quitte à faire le menu des équipements soit pas accessible partout.
J'ai aussi fait un petit truc pour pouvoir donner / montrer des items à un PNJ.
En gros, en mettant le switch n°SWITCH_TYPE sur true, puis en activant le switch n°SWITCH, le menu s'ouvre, mais quand on cliqueras sur C, ça enverra l'item sélectionné dans la variable VARIABLE_ITEM.
La fonction $game_party.itemType permet de savoir si l'item sélectionné est un objet, une arme, ou une armure.
( 1 c'est un objet, 2 une arme, et 3 une armure. )
Et la fonction $game_party.itemId renvoie son ID.
T'as un petit exemple dans la démo.
Par contre, je viens de voir un bug, si tu ouvres le menu en face d'un PNJ, et que tu utilises un objets, ça active le PNJ comme si le menu était fermé.
Donc ça sera reglé en même temps que le déplacement du joueur.
EDIT de minuit pile :
Donc le lien à été changé, j'ai corrigé le déplacement, et l'activation des évents dans le menu.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | Merci Mack, je teste ça !
Et sinon, comment j'peux modifier l'emplacement de la fenêtre pour éviter ce type de souci :
Je voudrais décaler la fenêtre et rapprocher les chiffres de l'objet car le curseur les cache.
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 11/08/2017 à 20:02:06 (2313 messages postés)
- | | Pour la position, tu modifies les constantes X Y.
Pour le nombre d'item, cherches la ligne :
1
| self.contents.draw_text(x + 2, y + SIZE - 24, 24, 32, number.to_s, 0) |
( Vers 288 )
Et modifie le x + 2.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | Merci bien !
Je viens d'avoir une illumination : Si je crée mes objets "graines de légumes" dans les armes, elles deviennent alors équipables et je peux m'en servir dans un système de plantation.
Seulement, il y a un petit bug: j'en reçois 12. j'équipe les sacs de graines mais je vois dans l'inventaire que ça passe à 11 graines (j'imagine que la 12e est équipée, bon ok.) quand je m'approche de la terre, une condition demande si l'objet "sac de graine" est équipé, si oui, alors ça me retire 1 sac de graine, y a une petite motte de terre, c'est mignon.
Mais quand je retourne dans l'inventaire, il me reste toujours une graine à la fin, et je n'arrive pas à m'en débarrasser tant qu'elle est équipée.
Sinon, est-ce que tu pourrais me faire un petit plus pour que l'icone de l'objet équipé s'affiche en bas à droite de l'écran ? (au pire, je modifierai les coordonnées)
Et une dernière chose... une idée pour pouvoir équiper 2 objets ? l'un s'utilise avec C et l'autre avec B je crois...
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 12/08/2017 à 01:37:29 (2313 messages postés)
- | | Yep, j'pense voir pourquoi ça fait ça.
Après, utiliser les armes pour ce genre de truc, je pense pas que ça soit une bonne idée.
J'y penserais à tête reposé demain.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | Mack a dit:
Après, utiliser les armes pour ce genre de truc, je pense pas que ça soit une bonne idée.
|
Très franchement, je pense pas non plus ^^' mais c'est tout ce que j'ai trouvé pour le moment.
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 13/08/2017 à 13:27:12 (2313 messages postés)
- | | Le problème avec les armes, c'est qu'une fois équipé, elles sont stocké complètement à part, et donc elles ne sont plus compté dans l'inventaire, ni quand on essaye de les retirer.
J'ai bidouiller un truc, mais j'me suis dis après coup que ça pouvait poser des problèmes, genre, on peut équiper deux objets ( sur C et B ), et en même temps une arme.
Du coup, j'vais voir pour retourné avec les armes, et simplement permettre de retirer une arme équipé, et de les compter comme si elles étaient dans l'inventaire.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | Ca me semble être un bon compromis !
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 16/08/2017 à 09:05:50 (2313 messages postés)
- | |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
| #==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
SIZE = 64
PAGE_MAX = 3
ROW = 2
COL = 5
X = 0
Y = 0
FONT_SIZE = 18
SWITCH = 1
SWITCH_OPEN = 2
SWITCH_TYPE = 3
VARIABLE_ITEM = 1
VARIABLE_EQUIP_C = 2
VARIABLE_EQUIP_B = 3
class Scene_Map
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias main_old main
def main
$game_switches[SWITCH_OPEN] = false
@spriteBack = Sprite.new
@spriteBack.bitmap = RPG::Cache.picture("back1")
@spriteSelector = Sprite.new
@spriteSelector.bitmap = RPG::Cache.picture("selector")
@index = 0
@x = X
@y = Y
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
@spriteBack.x = @x
@spriteBack.y = @y
@window_item = WindowItemCustom.new((COL*SIZE)+48,(ROW*SIZE)+48)
@window_item.x = @x
@window_item.y = @y
@window_item.z = 201
@spriteBack.z = 1
@spriteSelector.z = @window_item.z + 1
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
main_old
@spriteBack.bitmap.dispose
@spriteBack.dispose
@spriteSelector.bitmap.dispose
@spriteSelector.dispose
@window_item.dispose
end
alias update_old update
def update
if ($game_switches[SWITCH_OPEN])
if Input.repeat?(Input::LEFT)
if (@index % COL == 0)
p = @window_item.getPage - 1
if (p < 1)
p = PAGE_MAX
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index + (COL-1)) % (ROW * COL)
else
@index = (@index - 1) % (ROW * COL)
end
end
if Input.repeat?(Input::RIGHT)
if (@index % COL == COL - 1)
p = @window_item.getPage + 1
if (p > PAGE_MAX)
p = 1
end
@window_item.setPage(p)
@spriteBack.bitmap = RPG::Cache.picture("back"+p.to_s)
@index = (@index - (COL-1)) % (ROW * COL)
else
@index = (@index + 1) % (ROW * COL)
end
end
if Input.repeat?(Input::UP)
@index = (@index - COL) % (ROW * COL)
end
if Input.repeat?(Input::DOWN)
@index = (@index + COL) % (ROW * COL)
end
if Input.trigger?(Input::C)
# If command event ID is valid
@item = @window_item.getItem(@index)
if ($game_switches[SWITCH_TYPE] == true)
$game_variables[VARIABLE_ITEM] = @item
$game_switches[SWITCH] = true
return
end
if @item.is_a?(RPG::Item)
if @item.scope != 0
for i in $game_party.actors
used |= i.item_effect(@item)
end
if @item.common_event_id > 0
$game_switches[SWITCH] = true
# Command event call reservation
$game_temp.common_event_id = @item.common_event_id
# If consumable
if @item.consumable
# Decrease used items by 1
$game_party.lose_item(@item.id, 1)
end
end
else
$game_variables[VARIABLE_EQUIP_C] = @item
end
@window_item.refresh
else
equip_index = 0
if (@item.is_a?(RPG::Armor))
equip_index = 1 + @item.kind
end
$game_party.actors[0].equip(equip_index, @item.id)
$game_system.se_play($data_system.equip_se)
@window_item.refresh
end
end
if Input.trigger?(Input::B)
# If command event ID is valid
@item = @window_item.getItem(@index)
if ($game_switches[SWITCH_TYPE] == true)
$game_variables[VARIABLE_ITEM] = @item
$game_switches[SWITCH] = true
return
end
if @item.is_a?(RPG::Item)
if @item.scope == 0
$game_variables[VARIABLE_EQUIP_B] = @item
end
end
@window_item.refresh
end
x = 20 + @index % COL * (SIZE)
y = 20 + @index / COL * (SIZE)
@spriteSelector.x = @x + x
@spriteSelector.y = @y + y
if $game_switches[SWITCH]
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = false
Graphics.freeze
@spriteBack.visible = false
@window_item.visible = false
@spriteSelector.visible = false
Graphics.transition
end
else
if $game_switches[SWITCH]
@window_item.refresh
$game_switches[SWITCH] = false
$game_switches[SWITCH_OPEN] = true
Graphics.freeze
@spriteBack.visible = true
@window_item.visible = true
@spriteSelector.visible = true
Graphics.transition
end
end
update_old
end
end
#==============================================================================
# ** WindowItemCustom
#------------------------------------------------------------------------------
#==============================================================================
class WindowItemCustom < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# w : Width
# h : Height
# c : Column
# r : Row
#--------------------------------------------------------------------------
def initialize(w,h)
super(0,0,w,h)
self.contents = Bitmap.new(w - 32, h - 32)
self.back_opacity = 0
self.opacity = 0
self.visible = true
@page = 1
refresh
end
def getItem(i)
return @data[i + (ROW * COL) * (@page - 1)]
end
def setPage(i)
@page = i
refresh
end
def getPage
return @page
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.color = normal_color
@data = []
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
# Also add weapons and items if outside of battle
unless $game_temp.in_battle
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i])
end
end
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
end
# If item count is not 0, make a bit map and draw all items
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, ROW * SIZE + 4)
self.contents.font.size = FONT_SIZE
index = (ROW * COL) * (@page - 1)
for i in 0...(ROW * COL)
if (index+i < @data.size)
draw_item(index, i)
end
end
end
end
#--------------------------------------------------------------------------
# * Draw Item
# index : item number
#--------------------------------------------------------------------------
def draw_item(j,index)
item = @data[j+index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
x = 4 + index % COL * (SIZE)
y = index / COL * SIZE
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, SIZE, SIZE), opacity)
self.contents.draw_text(x + 2, y + SIZE - 24, 24, 32, number.to_s, 0)
end
end
class Game_Player
alias update_old update
def update
if ($game_switches[SWITCH_OPEN])
return
end
update_old
end
end
class Game_Party
def calc_nb_Inventory
j = 0
for i in 1...$data_items.size
if ($game_party.item_number(i) > 0)
j += 1
end
end
# Also add weapons and items if outside of battle
unless $game_temp.in_battle
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
j += 1
end
end
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
j += 1
end
end
end
return j
end
def itemType()
it = $game_variables[VARIABLE_ITEM]
if (it == 0)
return 0
end
if it.is_a?(RPG::Weapon)
return 2
end
if it.is_a?(RPG::Armor)
return 3
end
return 1
end
def itemId()
it = $game_variables[VARIABLE_ITEM]
if (it == 0)
return 0
end
return it.id
end
def equipCType()
it = $game_variables[VARIABLE_EQUIP_C]
if (it == 0)
return 0
end
if $game_party.item_number(it.id) <= 0
$game_variables[VARIABLE_EQUIP_C] = 0
return 0
end
if it.is_a?(RPG::Weapon)
return 2
end
if it.is_a?(RPG::Armor)
return 3
end
return 1
end
def equipCId()
it = $game_variables[VARIABLE_EQUIP_C]
if (it == 0)
return 0
end
if $game_party.item_number(it.id) <= 0
$game_variables[VARIABLE_EQUIP_C] = 0
return 0
end
return it.id
end
def equipBType()
it = $game_variables[VARIABLE_EQUIP_B]
if (it == 0)
return 0
end
if $game_party.item_number(it.id) <= 0
$game_variables[VARIABLE_EQUIP_B] = 0
return 0
end
if it.is_a?(RPG::Weapon)
return 2
end
if it.is_a?(RPG::Armor)
return 3
end
return 1
end
def equipBId()
it = $game_variables[VARIABLE_EQUIP_B]
if (it == 0)
return 0
end
if $game_party.item_number(it.id) <= 0
$game_variables[VARIABLE_EQUIP_B] = 0
return 0
end
return it.id
end
end |
Donc ça marche pareil que pour montrer des items, mais avec les commandes equipCType / equipBType et equipCId / equipBId.
Pour équiper des items, il faut que tu mettes leur cible sur aucune.
Désolé, avec le taf, j'ai pas eu trop le temps :/
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | que veux-tu dire par "mettre la cible sur "aucune" " ?
sinon, pour équiper sur C, il faut appuyer sur C et appuyer sur b pour assigner l'item sur le B, c'est bien ça ?
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." |
Mack -
posté le 19/08/2017 à 18:43:55 (2313 messages postés)
- | | Le champ dans la bdd où tu choisis si tu cinle un allié, tout les alliés, un ennemi, tout les ennemis ... Tu prends le premier, celui qui dit que t'as aucune cible.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
| Ex Couteau Suisse Agréé | Ah ok ! merci pour cette précision !
Comme je faisais tout en event avant, je ne suis pas une habituée de la BDD.
|
Travaille actuellement sur Roadelicious | Mes Musiques! | Anciens projets : Sylvan Melody, Terkass |Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne." | Index du forum > Entraide > [RESOLU] [RM XP] Système d'inventaire custom
|
|
|