Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: Dread Mac Farlane - Complet / Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

623 connectés actuellement

29528585 visiteurs
depuis l'ouverture

4649 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Level Up!

Planète Glutko

Hellsoft

Tous nos partenaires

Devenir
partenaire



Messages postés par Berka
Nombre de messages référencés sur Oniromancie (non supprimés): 98

Aller à la page: 1 2 3

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 13/03/2011 à 23:21:59. (493 messages postés)

Le moyen le plus simple est de superposer deux Window. Celle du fond, #<Window_Base d'opacité 255 contiendra le texte à afficher. La seconde, plus petite, #<Window_Selectable d'opacité 0 contiendra le choix.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 02/03/2011 à 03:34:20. (493 messages postés)

Portion de code : Tout sélectionner

1
$game_temp.common_event_id  = id_event



Zou: c'est le principe de la sérialisation

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 07/02/2011 à 14:49:04. (493 messages postés)

Zou: parce que si tu redéfinis ton Window#contents, tous les paramètres Bitmap#font vont sauter au profit de ceux de Cache#BarreLife. Tu risques aussi d'avoir des problèmes de marge dans le windowskin si la taille de Cache#BarreLife est supérieure au Window#contents.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 06/02/2011 à 23:31:33. (493 messages postés)

Dans le premier, tu assignes (tu redéfinis le bitmap contents de Window).
Dans le second, tu dessines le bitmap Cache#BarreLife sur contents de Window.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 25/01/2011 à 22:41:27. (493 messages postés)

Sinon tu as la méthode Integer#even?

Portion de code : Tout sélectionner

1
2
3
4
1.even?
=>false
2.even?
=>true



Edit: Exact Zeus, pas dans Ruby 1.8.6. Mille excuses.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

Berka - posté le 22/01/2011 à 00:01:32. (493 messages postés)

Quel est le rapport avec le Rgss ?

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 10/01/2011 à 19:30:07. (493 messages postés)

L'opérateur << de Fixnum déplace l'objet d'un rang vers la gauche.
Il faut raisonner en binaire (noté 0bxxx en ruby)

1 = 0b1 = 1 << 0
2 = 0b10 = 1 << 1
4 = 0b100 = 1 << 2
8 = 0b1000 = 1 << 3
...
512 = 0b1000000000 = 1 << 9

et inversement avec l'opérateur >> (décale vers la droite)
& est un opérateur "bitwise" AND (et).
Si on prend 6 & 3
6 & 3 = 0b110 & 0b011 (équiv. 0b11, car les 0 à gauche s'annulent) = 2

Le fonctionnement: on énumère chaque bit de gauche à droite:
1 & 0; 1 & 1; 0 & 1
Dès que les deux bits sont égaux à 1 on marque 1, si un des bits est 0 on marque 0:
donc :
1 & 0 = 0;
1 & 1 = 1;
0 & 1 = 0;
ce qui fait:
6 & 3 = 0b110 & 0b011 = 0b010 = 2
Avec sa réciproque | (OR)

Dans Game_Map, ca sert à savoir la praticabilité en fonction de la direction (cf. les fleches de passabilité sur RMXP)

EDIT: doublé :hihi

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Geex] Et si on vous demandait votre avis?

berka - posté le 05/12/2010 à 22:06:28. (493 messages postés)

Le meilleur principe est de faire deux types d'offre.
Une offre pour l'amateur qui teste son truc et ne tire aucun bénéfice: contribution libre/<10,-€
Une offre pour le pro, celui qui a souhaite tirer du blé dans le logiciel : >40,-€

Parce que si vous mettez une contribution trop élevée sur la tête de l'amateur, vous vous coupez un bras. Il faut une base de publicité, d'évaluation pour pouvoir éventuellement saisir une offre pro. Offre pro qui peut donner davantage de possibilités: support technique, déploiement...
Car à partir du moment où la contribution est élevée, il y a obligation de résultat. Faire une offre "starter" peut vous éviter pas mal de désagréments juridiques et fournit un large socle promotionnel du système. Et puis cela évite considérablement le piratage.

L'offre pro peut etre suivie, tracée : si vous vous fixer des critères stricts et précis pour déterminer quelle est l'offre à laquelle doit (obligatoirement?) souscrire un maker, vous saurez précisément quelle clientèle vous avez (donc possibilité d'adaptation du système), quels problèmes sont rencontrés.

La technique de la contribution ponctuelle, fondée sur une "taxe" à la publication du jeu me semble pas mal: cela favorise le sérieux des jeux rendus publics. Du coup, cette stabilité devient celle de votre moteur. Car à partir du moment où un jeu Geex est publié, le contenu du jeu et votre système sont fusionnés. Un jeu naze sera mauvaise pub pour Geex.

La contribution proportionnelle au bénéfice du jeu est pas mal aussi, voir meme plus juste pour le maker. Mais ce système me semble beaucoup trop complexe à mettre en place. Meme si on peut évaluer le nombre de téléchargements, on ne peut pas connaitre la prise réelle de bénéfices du créateur.

Pour conclure: voyez la contribution à la baisse. Moins de soucis par la suite. Quitte à l'augmenter par la suite, avec les prochaines versions.


Bonne soirée,
Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Plateformes/Action/RPG] L'Usine en Folie !

berka - posté le 14/10/2010 à 20:01:12. (493 messages postés)

Ca m'intéresserait pas mal de pouvoir tester ! Y'a encore de la place ?

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 26/09/2010 à 22:00:17. (493 messages postés)

euuh... DTC ?
En tout cas pas ici.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 23/09/2010 à 00:00:28. (493 messages postés)

Bonsoir,

Dans Window_Message
juste avant le refresh de def initialize ajoute
self.opacity = (un chiffre entre 0 et 255)

#Edit

Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 09/09/2010 à 17:56:56. (493 messages postés)

Le premier est inclusif: i=0;1;2;3;4;5 ce qui équivaut en maths à [0,5]
Le second est exclusif: i=0;1;2;3;4 ce qui équivaut en maths à [0,5[

Bonne soirée,

Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 06/09/2010 à 11:49:51. (493 messages postés)

self.contents.text_size("Exemple de choix")
=> Rect en fonction de Bitmap#font

Pour le second, tu as des scripts de particule, soit sur le forum soit sur google. C'est pas trop compliqué à trouver je pense.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 25/08/2010 à 21:33:44. (493 messages postés)

Mack:
Je ne pense pas que ce soit possible, seulement à moins de réécrire la classe Window.

Après quelques recherches, j'ai trouvé le script:
Auteur: Selwyn

tu peux régler les marges:
self.margin = 16
puis empêcher l'affichage des flèches dans:
def contents=(bmp)
et
def update_arrows

Portion de code : Tout sélectionner

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
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
#==============================================================================
# ■ Window - Hidden RGSS Class
#------------------
#  by Selwyn
#==============================================================================
 
#==============================================================================
# ■ Bitmap
#==============================================================================
 
class Bitmap
 #--------------
 # ● erase
 #--------------
 def erase(*args)
   if args.size == 1
     rect = args[0]
   elsif args.size == 4
     rect = Rect.new(*args)
   end
   fill_rect(rect, Color.new(0, 0, 0, 0))
 end
end
 
#==============================================================================
# □ SG
#------------------
#  Selwyn's Graphics module
#==============================================================================
 
module SG
#==============================================================================
# ■ SG::Skin
#==============================================================================
 
class Skin
 #--------------
 # ● instances settings
 #--------------
 attr_reader   :margin
 attr_accessor :bitmap
 #--------------
 # ● initialize
 #--------------
 def initialize
   @bitmap = nil
   @values = {}
   @values['bg'] = Rect.new(0, 0, 128, 128)
   @values['pause0'] = Rect.new(160, 64, 16, 16)
   @values['pause1'] = Rect.new(176, 64, 16, 16)
   @values['pause2'] = Rect.new(160, 80, 16, 16)
   @values['pause3'] = Rect.new(176, 80, 16, 16)
   @values['arrow_up'] = Rect.new(152, 16, 16, 8)
   @values['arrow_down'] = Rect.new(152, 40, 16, 8)
   @values['arrow_left'] = Rect.new(144, 24, 8, 16)
   @values['arrow_right'] = Rect.new(168, 24, 8, 16)
   self.margin = 16
 end
 #--------------
 # ● width
 #--------------
 def margin=(width)
   @margin = width
   set_values
 end
 #--------------
 # ● set_values
 #--------------
 def set_values
   w = @margin
   @values['ul_corner'] = Rect.new(128, 0, w, w)
   @values['ur_corner'] = Rect.new(192-w, 0, w, w)
   @values['dl_corner'] = Rect.new(128, 64-w, w, w)
   @values['dr_corner'] = Rect.new(192-w, 64-w, w, w)
   @values['up'] = Rect.new(128+w, 0, 64-2*w, w)
   @values['down'] = Rect.new(128+w, 64-w, 64-2*w, w)
   @values['left'] = Rect.new(128, w, w, 64-2*w)
   @values['right'] = Rect.new(192-w, w, w, 64-2*w)
 end
 #--------------
 # ● []
 #--------------
 def [](value)
   return @values[value]
 end
end
 
 
#==============================================================================
# ■ SG::Cursor_Rect
#==============================================================================
 
class Cursor_Rect < ::Sprite
 #--------------
 # ● instances settings
 #--------------
 attr_reader   :height, :width, :skin, :margin
 #--------------
 # ● initialize
 #--------------
 def initialize(viewport)
   super(viewport)
   @width = 0
   @height = 0
   @skin = nil
   @margin = 0
   @rect = {}
   @rect['cursor_up'] = Rect.new(129, 64, 30, 1)
   @rect['cursor_down'] = Rect.new(129, 95, 30, 1)
   @rect['cursor_left'] = Rect.new(128, 65, 1, 30)
   @rect['cursor_right'] = Rect.new(159, 65, 1, 30)
   @rect['upleft'] = Rect.new(128, 64, 1, 1)
   @rect['upright'] = Rect.new(159, 64, 1, 1)
   @rect['downleft'] = Rect.new(128, 95, 1, 1)
   @rect['downright'] = Rect.new(159, 95, 1, 1)
   @rect['bg'] = Rect.new(129, 65, 30, 30)
 end
 #--------------
 # ● margin=
 #--------------
 def margin=(margin)
   @margin = margin
   set(x, y, width, height)
 end
 #--------------
 # ● skin=
 #--------------
 def skin=(skin)
   @skin = skin
   draw_rect
 end
 #--------------
 # ● width=
 #--------------
 def width=(width)
   return if @width == width
   @width = width
   if @width == 0 and self.bitmap != nil
     self.bitmap.dispose
     self.bitmap = nil
   end
   draw_rect
 end
 #--------------
 # ● height=
 #--------------
 def height=(height)
   return if @height == height
   @height = height
   if @height == 0 and self.bitmap != nil
     self.bitmap.dispose
     self.bitmap = nil
   end
   draw_rect
 end
 #--------------
 # ● set
 #--------------
 def set(x, y, width, height)
   self.x = x + @margin
   self.y = y + @margin
   if @width != width or @height != height
     @width = width
     @height = height
     if width > 0 and height > 0
       draw_rect
     end
   end
 end
 #--------------
 # ● empty
 #--------------
 def empty
   self.x = 0
   self.y = 0
   self.width = 0
   self.height = 0
 end
 #--------------
 # ● draw_rect
 #--------------
 def draw_rect
   return if @skin == nil
   if @width > 0 and @height > 0
     self.bitmap = Bitmap.new(@width, @height)
     rect = Rect.new(1, 1, @width - 2, @height - 2)
     self.bitmap.stretch_blt(rect, @skin, @rect['bg'])
     self.bitmap.blt(0, 0, @skin, @rect['upleft'])
     self.bitmap.blt(@width-1, 0, @skin, @rect['upright'])
     self.bitmap.blt(0, @height-1, @skin, @rect['downright'])
     self.bitmap.blt(@width-1, @height-1, @skin, @rect['downleft'])
     rect = Rect.new(1, 0, @width - 2, 1)
     self.bitmap.stretch_blt(rect, @skin, @rect['cursor_up'])
     rect = Rect.new(0, 1, 1, @height - 2)
     self.bitmap.stretch_blt(rect, @skin, @rect['cursor_left'])
     rect = Rect.new(1, @height-1, @width - 2, 1)
     self.bitmap.stretch_blt(rect, @skin, @rect['cursor_down'])
     rect = Rect.new(@width - 1, 1, 1, @height - 2)
     self.bitmap.stretch_blt(rect, @skin, @rect['cursor_right'])
   end
 end
end
 
#==============================================================================
# ■ SG::Window
#------------------
#  
#==============================================================================
 
class Window
 #--------------
 # ● set instances variables
 #--------------
 attr_reader(:x, :y, :z, :width, :height, :ox, :oy, :opacity, :back_opacity,
             :stretch, :contents_opacity, :visible, :pause)
 attr_accessor :active
 #--------------
 # ● initialize
 #--------------
 def initialize()
   @skin = Skin.new
   @viewport = Viewport.new(0, 0, 0, 0)
   @cr_vport = Viewport.new(0, 0, 0, 0)
   @width = 0
   @height = 0
   @ox = 0
   @oy = 0
   @opacity = 255
   @back_opacity = 255
   @contents_opacity = 255
   @frame   = Sprite.new()
   @bg      = Sprite.new()
   @window  = Sprite.new(@viewport)
   @pause_s = Sprite.new()
   @arrows = []
   for i in 0...4
     @arrows.push(Sprite.new(@cr_vport))
     @arrows[i].bitmap = Bitmap.new(16, 16)
     @arrows[i].visible = false
   end
   @cursor_rect = Cursor_Rect.new(@cr_vport)
   @cursor_rect.margin = @skin.margin
   @cursor_fade = true
   @pause_s.visible = false
   @pause = false
   @active = true
   @stretch = true
   @visible = true
   self.x = 0
   self.y = 0
   self.z = 100
   self.windowskin = RPG::Cache.windowskin($game_system.windowskin_name)
 end
 #--------------
 # ● contents=
 #--------------
 def contents=(bmp)
   @window.bitmap = bmp
   if bmp != nil
     if bmp.width > @viewport.rect.width
        bmp.height > @viewport.rect.height
       draw_arrows
     end
   end
 end
 #--------------
 # ● contents
 #--------------
 def contents
   return @window.bitmap
 end
 #--------------
 # ● dispose
 #--------------
 def dispose
   @bg.dispose
   @frame.dispose
   @window.dispose
   @cursor_rect.dispose
   @viewport.dispose
   @pause_s.dispose
   @cr_vport.dispose
   for arrow in @arrows
     arrow.dispose
   end
 end
 #--------------
 # ● update
 #--------------
 def update
   @window.update
   @cursor_rect.update
   @viewport.update
   @cr_vport.update
   @pause_s.src_rect = @skin["pause#{(Graphics.frame_count / 8) % 4}"]
   @pause_s.update
   update_visible
   update_arrows
   if @cursor_fade
     @cursor_rect.opacity -= 10
     @cursor_fade = false if @cursor_rect.opacity <= 100
   else
     @cursor_rect.opacity += 10
     @cursor_fade = true if @cursor_rect.opacity >= 255
   end
 end
 #--------------
 # ● update_visible
 #--------------
 def update_visible
   @frame.visible = @visible
   @bg.visible = @visible
   @window.visible = @visible
   @cursor_rect.visible = @visible
   if @pause
     @pause_s.visible = @visible
   else
     @pause_s.visible = false
   end
 end
 #--------------
 # ● pause=
 #--------------
 def pause=(pause)
   @pause = pause
   update_visible
 end
 #--------------
 # ● update_arrows
 #--------------
 def update_arrows
   if @window.bitmap == nil or @visible == false
     for arrow in @arrows
       arrow.visible = false
     end
   else
     @arrows[0].visible = @oy > 0
     @arrows[1].visible = @ox > 0
     @arrows[2].visible = (@window.bitmap.width - @ox) > @viewport.rect.width
     @arrows[3].visible = (@window.bitmap.height - @oy) > @viewport.rect.height
   end
 end
 #--------------
 # ● visible=
 #--------------
 def visible=(visible)
   @visible = visible
   update_visible
   update_arrows
 end
 #--------------
 # ● x=
 #--------------
 def x=(x)
   @x = x
   @bg.x = x + 2
   @frame.x = x
   @viewport.rect.x = x + @skin.margin
   @cr_vport.rect.x = x
   @pause_s.x = x + (@width / 2) - 8
   set_arrows
 end
 #--------------
 # ● y=
 #--------------
 def y=(y)
   @y = y
   @bg.y = y + 2
   @frame.y = y
   @viewport.rect.y = y + @skin.margin
   @cr_vport.rect.y = y
   @pause_s.y = y + @height - @skin.margin
   set_arrows
 end
 #--------------
 # ● z=
 #--------------
 def z=(z)
   @z = z
   @bg.z = z
   @frame.z = z + 1
   @cr_vport.z = z + 2
   @viewport.z = z + 3
   @pause_s.z = z + 4
 end
 #--------------
 # ● ox=
 #--------------
 def ox=(ox)
   return if @ox == ox
   @ox = ox
   @viewport.ox = ox
   update_arrows
 end
 #--------------
 # ● oy=
 #--------------
 def oy=(oy)
   return if @oy == oy
   @oy = oy
   @viewport.oy = oy
   update_arrows
 end
 #--------------
 # ● width=
 #--------------
 def width=(width)
   @width = width
   @viewport.rect.width = width - @skin.margin * 2
   @cr_vport.rect.width = width
   if @width > 0 and @height > 0
     @frame.bitmap = Bitmap.new(@width, @height)
     @bg.bitmap = Bitmap.new(@width - 4, @height - 4)
     draw_window
   end
   self.x = @x
   self.y = @y
 end
 #--------------
 # ● height=
 #--------------
 def height=(height)
   @height = height
   @viewport.rect.height = height - @skin.margin * 2
   @cr_vport.rect.height = height
   if @height > 0 and @width > 0
     @frame.bitmap = Bitmap.new(@width, @height)
     @bg.bitmap = Bitmap.new(@width - 4, @height - 4)
     draw_window
   end
   self.x = @x
   self.y = @y
 end
 #--------------
 # ● opacity=
 #--------------
 def opacity=(opacity)
   value = [[opacity, 255].min, 0].max
   @opacity = value
   @contents_opacity = value
   @back_opacity = value
   @frame.opacity = value
   @bg.opacity = value
   @window.opacity = value
 end
 #--------------
 # ● back_opacity=
 #--------------
 def back_opacity=(opacity)
   value = [[opacity, 255].min, 0].max
   @back_opacity = value
   @bg.opacity = value
 end
 #--------------
 # ● contents_opacity=
 #--------------
 def contents_opacity=(opacity)
   value = [[opacity, 255].min, 0].max
   @contents_opacity = value
   @window.opacity = value
 end
 #--------------
 # ● cursor_rect
 #--------------
 def cursor_rect
   return @cursor_rect
 end
 #--------------
 # ● cursor_rect=
 #--------------
 def cursor_rect=(rect)
   @cursor_rect.x = rect.x
   @cursor_rect.y = rect.y
   if @cursor_rect.width != rect.width or @cursor_rect.height != rect.height
     @cursor_rect.set(@cursor_rect.x, @cursor_rect.y, rect.width, rect.height)
   end
 end
 #--------------
 # ● windowskin
 #--------------
 def windowskin
   return @skin.bitmap
 end
 #--------------
 # ● windowskin=
 #--------------
 def windowskin=(windowskin)
   return if windowskin == nil
   if @skin.bitmap != windowskin
     @pause_s.bitmap = windowskin
     @pause_s.src_rect = @skin['pause0']
     @skin.bitmap = windowskin
     @cursor_rect.skin = windowskin
     draw_window
     draw_arrows
   end
 end
 #--------------
 # ● margin=
 #--------------
 def margin=(margin)
   if @skin.margin != margin
     @skin.margin = margin
     self.x = @x
     self.y = @y
     temp = @height
     self.height = 0
     self.width = @width
     self.height = temp
     @cursor_rect.margin = margin
     set_arrows
   end
 end
 #--------------
 # ● stretch=
 #--------------
 def stretch=(bool)
   if @stretch != bool
     @stretch = bool
     draw_window
   end
 end
 #--------------
 # ● set_arrows
 #--------------
 def set_arrows
   @arrows[0].x = @width / 2 - 8
   @arrows[0].y = 8
   @arrows[1].x = 8
   @arrows[1].y = @height / 2 - 8
   @arrows[2].x = @width - 16
   @arrows[2].y = @height / 2 - 8
   @arrows[3].x = @width / 2 - 8
   @arrows[3].y = @height - 16
 end
 #--------------
 # ● draw_arrows
 #--------------
 def draw_arrows
   return if @skin.bitmap == nil
   @arrows[0].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_up'])
   @arrows[1].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_left'])
   @arrows[2].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_right'])
   @arrows[3].bitmap.blt(0, 0, @skin.bitmap, @skin['arrow_down'])
   update_arrows
 end
 #--------------
 # ● draw_window
 #--------------
 def draw_window
   return if @skin.bitmap == nil
   return if @width == 0 or @height == 0
   m = @skin.margin
   if @frame.bitmap.nil?
     @frame.bitmap = Bitmap.new(@width, @height)
     @bg.bitmap = Bitmap.new(@width - 4, @height - 4)
   end
   @frame.bitmap.clear
   @bg.bitmap.clear
   if @stretch
     dest_rect = Rect.new(0, 0, @width-4, @height-4)
     @bg.bitmap.stretch_blt(dest_rect, @skin.bitmap, @skin['bg'])
   else
     bgw = Integer((@width-4) / 128) + 1
     bgh = Integer((@height-4) / 128) + 1
     for x in 0..bgw
       for y in 0..bgh
         @bg.bitmap.blt(x * 128, y * 128, @skin.bitmap, @skin['bg'])
       end
     end
   end
   bx = Integer((@width - m*2) / @skin['up'].width) + 1
   by = Integer((@height - m*2) / @skin['left'].height) + 1
   for x in 0..bx
     w = @skin['up'].width
     @frame.bitmap.blt(x * w + m, 0, @skin.bitmap, @skin['up'])
     @frame.bitmap.blt(x * w + m, @height - m, @skin.bitmap, @skin['down'])
   end
   for y in 0..by
     h = @skin['left'].height
     @frame.bitmap.blt(0, y * h + m, @skin.bitmap, @skin['left'])
     @frame.bitmap.blt(@width - m, y * h + m, @skin.bitmap, @skin['right'])
   end
   @frame.bitmap.erase(@width - m, 0, m, m)
   @frame.bitmap.erase(0, @height - m, m, m)
   @frame.bitmap.erase(@width - m, @height - m, m, m)
   @frame.bitmap.blt(0, 0, @skin.bitmap, @skin['ul_corner'])
   @frame.bitmap.blt(@width - m, 0, @skin.bitmap, @skin['ur_corner'])
   @frame.bitmap.blt(0, @height - m, @skin.bitmap, @skin['dl_corner'])
   @frame.bitmap.blt(@width - m, @height - m, @skin.bitmap, @skin['dr_corner'])
 end
end
end



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 22/08/2010 à 22:37:24. (493 messages postés)

Exactement. Là, tu as une marge de 16px (32/2px) de chaque coté de ta fenetre.
Le plus simple est de passer par un sprite, sinon tu vas etre embêté par des fleches de défilement (si contents.w&h > window.w&h). Tu mets le bmp que tu veux afficher dans un sprite avec une superposition plus haute et le tour est joué.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [Scripts] Petites questions connes sur les SCRIPTS!!

berka - posté le 22/08/2010 à 20:09:09. (493 messages postés)

Bonsoir,

Le probleme c'est que Bitmap ne dispose pas d'attribut Tone.
Seuls Plane, Sprite et Viewport en ont. il faudrait donc faire :
Sprite.tone.set(r,g,b,a)

Ce qui se passe aussi en l'occurrence, c'est que ton $game_map.events[id]
n'est pas du tout un sprite, mais un objet Game_Event, qui hérite de Game_Character. Donc c'est de la "donnée", pas du graphisme. Pas étonnant, car les scripts sont identifiables par leur nom:
Données: Game_xxx / Scene_xxx
Graphiques: Sprite_xxx / Spriteset / Window_xxx

Donc pour oser modifier ton charset, il faut que tu te tournes vers Sprite_Character
Ou bien que tu passes indirectement par la propriété character_hue de Game_Character, donc par $game_map.events[id].character_hue.
Mais c'est très fortement limité...

Mais si tu veux modifier tous les sprites d'évents, le plus simple est de te tourner vers Spriteset_Map, mettre le tableau @character_sprites en attribut rw. Il suffira d'une simple boucle pour égir sur chacun des sprites d'event qu'il contient.

Bonne soirée,
Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Support Mysql

berka - posté le 07/07/2010 à 00:53:58. (493 messages postés)

Je ne sais pas, un sorte de flemme.
C'est vrai que c'est extrêmement gourmand.

On peut utiliser les Apis comme cela, d'ailleurs je suis tombé récemment et par hasard sur de droles de choses dans la ram... des trucs vraiment bizarres et pas du tout protégées.

Là je suis en train de me créer un petit orpg via apis. Ca rame un peu, mais c'est optimisable... c'est vraiment très cool à coder en tout cas.

J'hésite à me compiler une dll avec un binding ruby. Ce sera indubitablement plus rapide, mais beaucoup moins fun niveau code ruby. Exit tous les accès Ram...

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [RMVX] 128

berka - posté le 08/06/2010 à 20:43:00. (493 messages postés)

Désolé trop tentant...:hihi
Je n'en demandais pas tant. Plutot prenant comme jeu, et très mauvais pour le clavier. J'ai hésité à publier mon score... La honte, je suis deux de tens': 70

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - [RMVX] 128

berka - posté le 08/06/2010 à 19:40:31. (493 messages postés)

Pas de crédits ? Etonnant ;)
Bon d'accord tu as remodelé le script, mais y'a toujours l'auteur de la lib cwebpage.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Support Mysql

berka - posté le 29/05/2010 à 03:22:37. (493 messages postés)

Pour le fetch, je me suis inspiré de la doc PHP, mais je vas revérifier demain. J'ai peut etre mal lu.
Pour close, j'ai vu cela, j'ai réglé le tout dans une nouvelle version.
Il ne fonctionne pas pour XP, parce que XP ne reconnait pas les inclusions de modules.
Pour les mysql_select_db, je vais la rajouter.
Pour to_ruby, cela permet de converter les chaines renvoyées par get_rows en objets ruby. Plus pratique.
List_tables chez moi fonctionne.
Quand à la classe Mysql, pourquoi pas.

Merci du rapport

EDIT:

Nouvelle version:
C'est en angliche, mais c'est plus pratique vu que je le poste à plusieurs endroits différents.

Portion de code : Tout sélectionner

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
#======================================================================
#                                                                    Net::Mysql
#       29-05-2010                             www.rpgmakervx-fr.com                                    Rgss1&2  v.1
#                                                                     par berka                   
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles ! 
#  Ne pas utiliser de base de donnée contenant des informations personnelles. 
#  Votre hébergeur Mysql doit accepter les connexions mysql externes. 
#  Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données. 
#-------------------------------------------------------------------------------------------------------------------------- 
# Ce script permet d'interragir avec une base de données mysql directement via le jeu. 
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu. 
#-------------------------------------------------------------------------------------------------------------------------- 
# ● md5() support
# ● Mysql functions:
#   - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle 
#   - @mysql.close : return : bool
#   - @mysql.list_tables([filter]) : return : ["table1", "table2"]
#   - @mysql.select_db(base_name) : return : true if the db exists or false
#   - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
#   - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
#   - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
#   - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
#   - @mysql.num_rows([handle result]) : return : integer
# ● Html functions:
#   - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
#   - "<berka>".htmlspecialchars : return : "&lr;berka>"
#   - "<berka>".urlencode : return : "%3Cberka%3E"
#   - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# ●  "SELECT * FROM table"
# ●  "INSERT INTO table (fields) VALUES (values)"
# ●  "INSERT INTO table SET field = value WHERE field = value"
# ●  "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================
 
module Berka
  module Mysql
    Host   = "127.0.0.1"                          # mysql server(local : 127.0.0.1)
    User   = ""                                           # mysql user
    Pass  = ""                                           # mysql password
    Base  = "rgss"                                   # base name
    Port    = 3306                                     # server port (default: 3306)
    
    Err_Con = "Mysql:\nUnable to connect to the database"
    Err_Req = "Mysql:\nUnable to send the query"
  end
  
  module Html
    Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  end
end
 
class Numeric
  RMM=Win32API.new("kernel32", "RtlMoveMemory", "ppl", "")
  def copymem(len)
    # move memory to convert c structs to ruby objects
    RMM.call(buf="\0"*len,self,len);buf
  end
end
 
class String
  
  def to_ruby
    # detect if the string is a md5 hash
    return self if self=~/^[a-f0-9]{32}$/
    # converts syntax of a string to ruby controls
    eval(self)rescue self
  end
  
  def htmlspecialchars
    # converts special chars to html compatibles chars (ASCII)
    {"&"=>"&",'"'=>""","'"=>"'","<"=>"&lr;",">"=>">"}.each_pair{|k,v|self.gsub!(k,v)}
    self
  end
    
  def urlencode
    # converts special char of url 
    o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o<<c};o
  end
    
  def urldecode
    # converts encoded special char of url to normal chars
    self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  end
end
  
module Net
  class Mysql
    MI=Win32API.new("libmysql.dll","mysql_init","l","l")
    MC=Win32API.new("libmysql.dll","mysql_close","l","l")
    MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
    MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
    MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
    MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
    MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
    MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
    MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
    MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
    MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
    MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
    MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
    MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
    
    attr_reader :handle
    
    def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
      # @handle : handle of mysql initialization
      @handle=MI.call(0)
      # establishes the mysql connection
      (print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
      # returns: handle
      @handle
    end
    
    def close
      # closes the current connection
      MC.call(@handle)
    end
    
    def select_db(base)
      # selects a current database
      MSDB.call(base)==true
    end
    
    def list_tables(m="")
      # lists tables request -> fetch the result -> to ruby string
      l=MFR.call(MLT.call(@my,m)).copymem(1024)
      # splits the string to array -> list of tables
      l.scan(/\t(\w+)\0/).flatten
    end
    
    def query(req,ret=false)
      # sends the query (msg error)
      (return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
      # previous results are released
      MFRE.call(@result)if @result
      # gets the results from the query -> c struct handle
      @result=MSR.call(@handle)
      ret ? get_rows(@result) : @result
    end
    
    # Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
    # returns the fieldname or nil if the field is not found. 
    ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
    
    def get_fields(res=nil) 
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # gets the number of fields, offset: 8bytes-2 (cf. loop)
      nf,ch,of=MFC.call(@handle),[],6
      # each field: if the fieldname is not found: increase the offset of bytes.
      nf.times{|i|a=ReadField.call(r,i,of+=2)until a
        # add to the fields array
        ch<<a
        # reinitialize the offset for the next iteration
        of=6}
      # returns an array of fields
      ch
    end
    
    def get_rows(res=nil)
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # nr: number of rows, nf: number of fields
      nr,nf,en=MNR.call(r),MNF.call(r),[]
      # each row:
      nr.times{|i|
       # gets each row: c struct -> to ruby string -> to array (handles)
       c=MFR.call(r).copymem(4).unpack("i")[0]
       # gets each field length: c struct -> to ruby string -> to array (handles)
       tf=MFL.call(r).copymem(4*nf).unpack("i*")
       # size of field: offset of each field
       sf=tf.inject(0){|n,i|n+i} 
       # handle of row -> to string (offset) -> to array 
       en<<c.copymem(sf+nf).split("\0")
       }
       # returns each row as an array
      en
    end
    
    def num_rows(res=nil)
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # returns: number of rows
      MNR.call(r)
    end
    
    def fetch_assoc(to_ruby=false)
      # gets rows and fields
      h,f,r={},get_fields,get_rows
      # each field: read the rows and store them to an hash : h[:field]=[rows]
      # rows are converted to ruby objects if to_ruby == true
      f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
      h
    end
  end
end



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Support Mysql

berka - posté le 23/05/2010 à 21:30:47. (493 messages postés)

Non monos, les fonctions de requetes (SELECT, UPDATE, INSERT) sont parfaitement gérées.
Ce que je voulais c'était des fonctions de l'API mysql.

Edit: ok Nuki: je vois ca
Re-edit: Je viens de voir que le forum convertit automatiquement les caractères html. Dans le script, à la def htmlspecialchars, il faut que vous enleviez les * avant d'utiliser le script.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Support Mysql

berka - posté le 23/05/2010 à 18:07:41. (493 messages postés)

oui, merci de préciser cela.
Il est évident que la protection de votre jeu est complètement naze. Il est possible d'extraire tous les scripts de votre jeu en une seule commande, très facilement.
Après, il faut être logique: ne pas utiliser de base de données personnelle. Votre base, voire votre serveur ne doit contenir que des données de jeu. Rien d'autre. Faites attention à ce que vous mettez dans votre base.
Théoriquement, les serveurs ftp et mysql sont indépendants, mais la plupart des hébergeurs web utilisent les memes identifiants de connexion.

Nouvelle idée de script... Un algorithme de cryptage plus sécurisé pour RM...

Edit: Vous avez des idées de fonctions mysql non présentes dans le script ? J'ai épluché la doc mais aucune autre fonction ne m'a semblé utile.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Support Mysql

berka - posté le 23/05/2010 à 17:26:40. (493 messages postés)

Il manque une partie du script: le voici en entier:

Portion de code : Tout sélectionner

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
#======================================================================
#                                                                    Net::Mysql
#      22-05-2010                            www.rpgmakervx-fr.com                                    Rgss2  v0.1
#                                                                    par berka                  
#--------------------------------------------------------------------------------------------------------------
# Ce script est libre d'utilisation. Ne pas poster sans accord de l'auteur. Crédits requis.
#--------------------------------------------------------------------------------------------------------------
#  Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
#  Ne pas utiliser de base de donnée contenant des informations personnelles.
#  
#  Votre hébergeur Mysql doit accepter les connexions mysql externes.
#  Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
# # ATTENTION ! Il faut enlever les * avant l'utilisation dans la def htmlspecialchars. 
#Le forum convertit automatiquement les caractères. 
#--------------------------------------------------------------------------------------------------------------
# ● fonctions Mysql :
#  - Net::Mysql.connect : return : mysql connection handle 
#  - Net::Mysql.close : return : bool
#  - Net::Mysql.query("query") : return : query result handle
#  - Net::Mysql.get_fields([handle result]) : return : ["field1", "field2"]
#  - Net::Mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
#  - Net::Mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
#  - Net::Mysql.list_tables([filtre]) : return : ["table1", "table2"]
#
# ● fonctions Html:
#  - "string".to_ruby : return : true, false, nil, Integer, Float, self
#  - "<berka>".htmlspecialchars : return : "&lr;berka>"
#  - "<berka>".urlencode : return : "%3Cberka%3E"
#  - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------
# Exemples de requetes SQL
# ●  "SELECT * FROM `table`"
# ●  "INSERT INTO `table` (champs) VALUES (valeurs)"
# ●  "INSERT INTO `table` SET champ = valeur WHERE champ = valeur"
# ●  "UPDATE `table` SET champ = valeur WHERE champ = valeur"
#--------------------------------------------------------------------------------------------------------------
# Exemple d'utilisation:
# Net::Mysql.connect
# Net::Mysql.query("SELECT * FROM `membres`)
# res = Net::Mysql.fetch_assoc
# => {"id"=>["1","2"], "nom"=>["berka","rgss"], "age"=>["19",""]}
#======================================================================
 
module Berka
  module Mysql
    Host    ="127.0.0.1"                            # serveur mysql (local : 127.0.01)
    User  ="root"                                      # utilisateur mysql
    Pass  =""                                            # mot de passe mysql
    Base  ="test"                                      # nom de la base
    Port    =3306                                      # port du serveur (par défaut: 3306)
    
    Err_Con = "Mysql:\nImpossible de se connecter à la base"
    Err_Req = "Mysql:\nLa requete n'a pu être envoyée."
  end
  module Html
    Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  end
end
 
class Numeric
  def copymem(len)
    Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
  end
end
 
class String
  include Berka::Html
  
  def to_ruby
    eval(self) rescue self
  end
  
# ATTENTION ! Il faut enlever les * avant l'utilisation. Le forum convertit automatiquement les caractères. 
  def htmlspecialchars
    {"&"=>"&*#38;",'"'=>"&*#34;","'"=>"&*#39;","<"=>"&*#60;",">"=>"&*#62;"}.each_pair{|k,v|self.gsub!(k,v)}
    self
  end
    
  def urlencode
    o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Spec_Char.include?(c);o<<c};o
  end
    
  def urldecode
    self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  end
end
  
module Net
  module Mysql
    MI=Win32API.new("libmysql.dll","mysql_init","l","l")
    MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
    MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
    MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
    MC=Win32API.new("libmysql.dll","mysql_close","","l")
    MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
    MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
    MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
    MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
    MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
    MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
    MFF=Win32API.new("libmysql.dll","mysql_fetch_field","p","l")
    MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
    MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
    
    module_function
    include Berka::Mysql
    
    def connect 
      @my=MI.call(0)
      (print(Err_Con)) if MRC.call(@my,Host,User,Pass,Base,Port,nil,0)==0
      @my
    end
    
    def close
      MC.call(@my)
    end
    
    def list_tables(m="")
      l=MFR.call(MLT.call(@my,m)).copymem(1024)
      l.scan(/\t(\w+)\0/).flatten
    end
    
    def query(req) 
      (return print(Err_Req))if !MQ.call(@my,req)
      MFRE.call(@result)if @result
      @result=MSR.call(@my)
    end
    
    def get_fields(res=nil) 
      r=res.nil? ? @result : res
      nf,ch=MFC.call(@my),[]
      nf.times{|i|ch<<MFFD.call(r,i).copymem(256).unpack("iissi")[0].copymem(8).delete!("\0")}
      ch
    end
    
    def get_rows(res=nil)
      r=res.nil? ? @result : res
      nr,nf,en=MNR.call(r),MNF.call(r),[]
      return nil if nf==0||nr==0
      nr.times{|i|
      c=MFR.call(r).copymem(4).unpack("i")[0]
      tf=MFL.call(r).copymem(4*nf).unpack("i*")
      sf=tf.inject(0){|n,i|n+i} 
      en<<c.copymem(sf+nf).split("\0")
      }
      en
    end
    
    def fetch_assoc
      h,f,r={},get_fields,get_rows
      f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi]=t}
      h
    end
  end
end
 



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - Lectures

berka - posté le 09/04/2010 à 00:29:18. (493 messages postés)

Tu lis deux fois le meme livre ? Risibles Amours :)
Sinon, Kafka: +1

Les derniers livres que j'ai lu, ces deux derniers mois :

Le Procès: F. Kafka
Hygiène de l'Assassion: A. Nothomb
Cosmétique de l'ennemi: A. Nothomb
La Clinique du Doc. H: M. Higgins Clark
La Guerre sans Haine : E. Rommel

Prochain livre:
Les Mains du miracle : J. Kessel

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Déplacement à la souris v2.0

berka - posté le 27/02/2010 à 22:31:27. (493 messages postés)

Je sais pas. C'est pas moi qui classe.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Tutoriels - Les conditions en Ruby

berka - posté le 31/01/2010 à 16:39:34. (493 messages postés)

Le "then" est très rarement utilisé en ruby. Il vaut meme mieux ne pas l'utilise car il est source de pas mal d'erreur pour des expressions sur plusieurs lignes.
Mais il est assez utile dans les comparaisons multiples:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
case note
        when 0 then puts "Tout est à refaire !"
        when 1 .. 6 then puts "Pas terrible !"
        when 7,8,9 then puts "Ce n'est pas encore la moyenne, mais perséverez !"
        when 10 then puts "Pile la moyenne ! Ouf !"
        when 11,12,13 then #...
        else then puts "Note incorrecte !"
end     


Ca fait des lignes en moins.

Il faut noter que l'on peut supprimer true, false voire nil dans certains cas:

Portion de code : Tout sélectionner

1
p "vrai" if a == true


est la meme chose que

Portion de code : Tout sélectionner

1
p "vrai" if a


Portion de code : Tout sélectionner

1
p "faux" if a == false


est la meme chose que

Portion de code : Tout sélectionner

1
p "faux" if !a


Portion de code : Tout sélectionner

1
p "rien" if a == nil


est la meme chose que

Portion de code : Tout sélectionner

1
p "rien" if !a


Après, si on est exigeant, la différence entre and et &&, entre or et ||.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Forum - Geex - Projet

berka - posté le 21/01/2010 à 13:37:33. (493 messages postés)

Vous n'arrivez pas faire un binding ruby en C# ?
Je crois qu'il existe un interpréteur Ruby.net (ironruby), donc compatible avec le c#. Ca risque de vous faciliter grandement l'implémentation.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var systeme = IronRuby.Ruby.CreateEngine();
 
systeme.Execute(@"
# définition d'un objet
class Ma_Class
  def initialize()
    puts 'test'
  end
end
");
 
// Binding objets ruby
 
object testClasse = systeme.Runtime.Globals.GetVariable("Ma_Classe");
object test_ruby = systeme.ObjectOperations.CreateInstance(testClasse);
systeme.ObjectOperations.InvokeMember(test_ruby, "initialize");



Bonne continuation,
Berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Pack Formulaire V1.00 : Niveau avancé en scripting

berka - posté le 12/01/2010 à 11:24:18. (493 messages postés)

Nan, c'est pas une propriété de Mouse, mais une méthode du module Comparable de ruby (Mouse.x n'est rien d'autre qu'un objet Numeric. Or Numeric inclut Comparable)

Au niveau des valeur de retour des méthodes il faut savoir que:

Portion de code : Tout sélectionner

1
2
3
4
def test
a = 1
return a
end


est la meme chose que

Portion de code : Tout sélectionner

1
2
3
def test
a = 1
end



et que:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
def test
if a == 1
return true
else 
return false
end
end


est la meme chose que

Portion de code : Tout sélectionner

1
2
3
def test
a == 1
end


Plus simple, nan ?
Généralement on peut enlever le return à la fin des méthodes. la dernière valeur est retournée automatiquement.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Pack Formulaire V1.00 : Niveau avancé en scripting

berka - posté le 12/01/2010 à 10:25:33. (493 messages postés)

bonjour,

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
  def survole?
  
   oki = false
      if ((Mouse.x < (self.x + self.bitmap.width)) and (Mouse.x > self.x) ) then
            if((Mouse.y < (self.y + self.bitmap.height)) and (Mouse.y > self.y)  ) then
             oki = true
           end
         end
        return oki 
  end



préfère la fonction between?, c'est plus propre. Cela réduit ta méthode à :

Portion de code : Tout sélectionner

1
2
3
  def survole?
    Mouse.x.between?(self.x, self.x + self.bitmap.width) && (Mouse.y.between?(self.y, self.y + self.bitmap.height)
  end



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Déplacement à la souris v2.0

berka - posté le 02/01/2010 à 14:15:36. (493 messages postés)

C'est sur VX, je l'ai mis dans le script, mais j'aurais du le remettre dans le message. Désolé.

Pour mon site, c'est normal je suis en train de faire une maxi màj dessus. A suivre dans deux-trois semaines.

Merci d'avoir testé,
berka

XP: normal que ca plante: la méthode include n'existe pas.
VX: t'as changé les paramètres du début du script ?

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Cinématique après quelque temps sur l'écran titre

berka - posté le 02/01/2010 à 12:40:03. (493 messages postés)

Voila une petite optimisation. Ca fait mal aux yeux ces conditions d'appui de touche. Si tu n'en es pas l'auteur, naturellement, tu lui as demandé son accord avant de publier son script.

Portion de code : Tout sélectionner

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
#**************************************************************
# Apres X frame sans que le joueur reagissent sur le title
# Une Map se lance
# Sur cette map si vous mettez un event en proccesus paralléle 
# avec la fonction inserez un script puis vous ecrivez ceci :
# bouge_title
# Alors lorsque le joueur appuira sur les touches directionnel
# Il sera automatiquement rediriger vers l'ecran titre
# Fonctionnele normalement avec la totalité des custom title systeme
# Sauf celui pour passez le title
# N'oublier pas de mettre des transition pour plus de realisme ;)
#***************************************************************
#Par --Drow--
#***************************************************************
# Personnification ici modifiez par vos valeur
TEMPS = 1450 # apres combien de temps la map se lance
MAP_ID = 14 # ID de la map qui se lance apres attente
MAP_X = 10 # Position X du joueur lors de la teleportation
MAP_Y = 10 # Position Y du joueur lors de la teleportation
begin
end
class Scene_Title
  alias modiff_main main
  alias modiff_update update
  def main
    @ttemp = 0
    modiff_main
  end
  def update
  modiff_update
    @ttemp += 1
  if @ttemp >= TEMPS
    Audio.bgm_stop
    Graphics.frame_count = 0
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables    = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party        = Game_Party.new
    $game_troop        = Game_Troop.new
    $game_map          = Game_Map.new
    $game_player        = Game_Player.new
    $game_party.setup_starting_members
    $game_map.setup(MAP_ID)
    $game_player.moveto(MAP_X, MAP_Y)
    $game_player.refresh
    $game_map.autoplay
    $game_map.update
    $scene = Scene_Map.new
  end
end
end
 
module Input
  def self.all_keys?
    self.constants.each{|i|return true if Input.trigger?(eval(i))}
    false
  end
end
 
def bouge_title
  $scene = Scene_Title.new if Input.all_keys?
end



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Déplacement à la souris v2.0

berka - posté le 02/01/2010 à 12:12:46. (493 messages postés)

Tiens les scripts sont coupés. Il en manque une grosse partie.

clavier:

Portion de code : Tout sélectionner

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
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                  Gestion du Clavier
# par TLN et Lordrik, revu par Berka                                                                    rgss2 (VX)
#--------------------------------------------------------------------------------------------------------------------------------------
# A placer au début de la liste de scripts, complètement. Ne pas utiliser deux scripts de clavier !
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
module Win32API::APIS
  GAKS=Win32API.new("user32","GetAsyncKeyState",'i','i') 
  GKS=Win32API.new("user32","GetKeyState",'i','i') 
  KBDE=Win32API.new('user32','keybd_event','iii','')
end
include Win32API::APIS
module Input
  class<<self
    Inconnu="Cette touche est inconnue"
    TAB_KEY={'clic gauche'=>1,'clic droit'=>2,'clic milieu'=>4,
            'sm'=>4,'del'=>8,'tab'=>9,'enter'=>13,'shift'=>16,'ctrl'=>17,'alt'=>18,
            'pause'=>19,'caps lock'=>20,'esc'=>27,'space'=>32,'pg up'=>33,'pg down'=>34,
            'end'=>35,'home'=>36,'left'=>37,'up'=>38,'right'=>39,'down'=>40,'impr'=>44,
            'insert'=>45,'suppr'=>46,'à'=>48,'&'=>49,'é'=>50,'"'=>51,"'"=>52,'('=>53,
            '-'=>54,'è'=>55,'_'=>56,'ç'=>57,'a'=>65,'b'=>66,'c'=>67,'d'=>68,'e'=>69,
            'f'=>70,'g'=>71,'h'=>72,'i'=>73,'j'=>74,'k'=>75,'l'=>76,'m'=>77,'n'=>78,
            'o'=>79,'p'=>80,'q'=>81,'r'=>82,'s'=>83,'t'=>84,'u'=>85,'v'=>86,'w'=>87,
            'x'=>88,'y'=>89,'z'=>90,'lwin'=>91,'rwin'=>92,'fn'=>93,'altgr'=>95,'0'=>96,
            '1'=>97,'2'=>98,'3'=>99,'4'=>100,'5'=>101,'6'=>102,'7'=>103,'8'=>104,
            '9'=>105,'n*'=>106,'+'=>107,'num'=>108,'n-'=>109,'.'=>110,'/'=>111,
            'F1'=>112,'F2'=>113,'F3'=>114,'F4'=>115,'F5'=>116,'F6'=>117,'F7'=>118,
            'F8'=>119,'F9'=>120,'F10'=>121,'F11'=>122,'F12'=>123,'vernum'=>144,
            'verdefil'=>145,'lmaj'=>160,'rmaj'=>161,'lctrl'=>162,'rctrl'=>163,
            'lalt'=>164,'ralt'=>165,'$'=>186,'='=>187,','=>188,';'=>190,':'=>191,
            'ù'=>192,')'=>219,'*'=>220,'^'=>221,'²'=>222,'!'=>223,'<'=>226} 
    RS=TAB_KEY.clone
    RS.keys.each{|k|RS[k]=[false,false,10]}
    Dirs=['left','up','right','down']
    alias :in_upd :update 
    alias :in_trig? :trigger? # Berka: Compatibilité avec touches initiales
    alias :in_pres? :press?
    alias :in_rep? :repeat?
    def press?(n);n.is_a?(Integer)? in_pres?(n): RS[n][0];end 
    def trigger?(n);n.is_a?(Integer)? in_trig?(n): RS[n][1]==1;end 
    def dbtrigger?(n);RS[n][1]==2;end 
    def repeat?(n);n.is_a?(Integer) ? in_rep?(n) : (RS[k][2]%=4;RS[n][2]==0&&RS[n][0]);end 
    def hold?(n);((RS[n][2]%20)==0)&&RS[n][0];end 
    def release?(n);RS[k][1]==-1;end 
    def active?(n);GKS.call(TAB_KEY[k])&1==1;end 
    def update(*tab)
      in_upd()
      if !tab.empty?
        tab.each{|n|m=RS[n][0];pr=GAKS.call(TAB_KEY[n])!=0 
          tr=m==pr ? 0 : (pr ?(RS[n][2].between?(1,9)? 2 : 1) : -1) 
          count=tr>0 ? 0 : [R[n][2]+1,20].min 
          RS[n]=[pr,tr,count]}
      else 
        TAB_KEY.keys.each{|n| 
          m=RS[n][0];pr=GAKS.call(TAB_KEY[n])!=0 
          tr=m==pr ? 0 : (pr ?(RS[n][2].between?(1,9)? 2 : 1) : -1) 
          count=tr>0 ? 0 : [RS[n][2]+1,20].min 
          RS[n]=[pr,tr,count]}
      end 
    end 
  end
end



Souris

Portion de code : Tout sélectionner

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
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                  Gestion de la Souris
# par Cybersam et Nearfantastica, revu par Berka                                                                    rgss2 (VX)
#--------------------------------------------------------------------------------------------------------------------------------------
# A placer au début de la liste de scripts, juste après le script de Clavier
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
module Win32API::APIS
  GPPS=Win32API.new('kernel32','GetPrivateProfileString','pppplp','l')
  GCPr=Win32API.new('kernel32','GetCurrentProcess','','i')
  FW=Win32API.new('user32','FindWindow','pp','i')
  SPC=Win32API.new('kernel32','SetPriorityClass','pi','i')
  STC=Win32API.new('user32','ScreenToClient','lp','i')
  GTR=Win32API.new('user32','GetClientRect','lp','i')
  GCP=Win32API.new('user32','GetCursorPos','p','i')
  SC=Win32API.new('user32','ShowCursor','l','l')
  module_function
  def getini(s)
    GPPS.call("Game",s,"",v="\0"*0xff,0xff,".//Game.ini")
    v.delete!("\0")
  end
  Handle=FW.call("RGSS Player",getini("Title"))
  SPC.call(GCPr.call,128)
end
include Win32API::APIS
class Souris
  attr_accessor :x,:y,:curseur
  def initialize
    @t||={};@curseur=Sprite.new;@curseur.z=9999
    show;update
  end
  def update
    @x,@y=client(*pos_glob)
    width,height=t_client
    @x=0 if @x<0;@y=0 if @y<0
    @x=width if x>width;@y=height if @y>height
    [@x,@y]
  end
  def show(b=false);@curseur.visible=!b;SC.call(b ? 1 : 0);end
  def in?(x,y,w,h);return false if @x.nil?||@y.nil?;@x.between?(x,x+w)&&@y.between?(y,y+h);end
  def pos_glob;p=[0,0].pack('ll');(GCP.call(p)!=0)? p.unpack('ll'): nil;end
  def client(x,y);return nil unless x&&y;p=[x,y].pack('ll');(STC.call(Handle,p)!=0)? p.unpack('ll'): nil;end
  def t_client;GTR.call(Handle,r=([0]*4).pack('l4'));r.unpack('l4')[2..3];end
  def grid;[(@x+$game_map.display_x/8)/32,(@y+$game_map.display_y/8)/32];end
  def drag(t,obj,&block) # Berka
    return if @t[t].alive? rescue nil
    @t[t]=Thread.new{ox,oy=@x,@y
      while Input.press?(t)
        ((nx=@x)-ox>0)?(x1=ox;x2=nx-x1):(x1=nx;x2=ox-x1)
        ((ny=@y)-oy>0)?(y1=oy;y2=ny-y1):(y1=ny;y2=oy-y1)
        obj.x,obj.y,obj.width,obj.height=x1,y1,x2,y2
        Graphics.update
        yield
      end
      obj.visible=false}
  end
  def drag_orig(t,x,y) # Berka
    @b_x||=@x-x;@b_y||=@y-y
    (@x-@b_x>0)?(x2=@x-@b_x):(x2=-(@b_x-@x))
    (@y-@b_y>0)?(y2=@y-@b_y):(y2=-(@b_y-@y))
    [x2,y2]
  end
  def shcurseur(*c) # Berka
    @curseur.bitmap=Cache.system(c.first)
    @curseur.ox,@curseur.oy=*c[1..2]
  rescue
    @curseur.bitmap=Bitmap.new(24,24)
    @curseur.bitmap.blt(0,0,Cache.system("Iconset"),Rect.new(24,0,24,24))
    @curseur.ox,@curseur.oy=8,8
  end
end
$souris||=Souris.new
module Graphics # Berka
  class<<self
    alias :cur_update :update unless $@
    def update
      ($souris.curseur.x,$souris.curseur.y=*$souris.update)if $souris
      cur_update
    end
  end
end



Pathfinding

Portion de code : Tout sélectionner

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
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                                    Pathfinding
# par Modern Algebra                                                                                            rgss2 (VX)
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
class Game_System
  attr_accessor :pathfinding_diagonal,:pathfinding_iterations
  alias modalg_pathfinding_options_init_j5yt initialize
  def initialize
    modalg_pathfinding_options_init_j5yt
    @pathfinding_diagonal,@pathfinding_iterations=false,0
  end
end
class Game_Character
  def find_path(trgt_x,trgt_y,diagonal=$game_system.pathfinding_diagonal,
                    max_iterations=$game_system.pathfinding_iterations)
    path=$game_map.find_path(self.x,self.y,trgt_x,trgt_y,diagonal,
                    max_iterations,self)
    @move_route.list.delete_at(@move_route_index)
    path.each { |i| @move_route.list.insert(@move_route_index,i) }
    @move_route_index-=1
  end
  def force_path(trgt_x,trgt_y,diagonal=$game_system.pathfinding_diagonal,
                    max_iterations=$game_system.pathfinding_iterations)
    path=$game_map.find_path(self.x,self.y,trgt_x,trgt_y,diagonal,
                          max_iterations,self)
    path.reverse!
    path.push(RPG::MoveCommand.new(0))
    move_route=RPG::MoveRoute.new
    move_route.list,move_route.repeat=path,false
    force_move_route(move_route)
  end
end
class Game_Map
  def removefrom_binaryheap
    @open_nodes[1],v=@open_nodes[@listsize],1
    @listsize-=1
    loop do
      w=2*(u=v)
      if w+1<=@listsize 
        v=w if @total_cost[@open_nodes[u]]>=@total_cost[@open_nodes[w]]
        v=w+1 if @total_cost[@open_nodes[v]]>=@total_cost[@open_nodes[w+1]]
      elsif w<=@listsize 
        v=w if @total_cost[@open_nodes[u]]>=@total_cost[@open_nodes[w]]
      end
      if u==v;break;else
        temp=@open_nodes[u]
        @open_nodes[u]=@open_nodes[v]
        @open_nodes[v]=temp
      end
    end
  end
  def find_path(src_x,src_y,trgt_x,trgt_y,diagonal,max_iterations,char)
    path=[]
    return path if !char.passable?(trgt_x,trgt_y)
    max_elements=width*height+2
    openx=Table.new(max_elements)
    openy=Table.new(max_elements)
    @open_nodes=Table.new(max_elements)
    @total_cost=Table.new(max_elements)
    heuristic=Table.new(max_elements)
    step_cost=Table.new(width,height)
    parent_x=Table.new(width,height)
    parent_y=Table.new(width,height)
    actual_list=Table.new(width,height)
    new_openid,@open_nodes[1]=1,1
    openx[1],openy[1]=src_x,src_y
    dist=[(trgt_x-src_x).abs,(trgt_y-src_y).abs]
    heuristic[1]=diagonal ? (dist.max*14)+(dist.min*10):(dist[0]+dist[1])*10
    @total_cost[1]=heuristic[1]
    actual_list[src_x,src_y]=1
    @listsize,count=1,0
    loop do
      break if actual_list[trgt_x,trgt_y]!=0 
      count+=1
      Graphics.update if count%500==0
      return path if count==max_iterations
      return path if @listsize==0
      node=@open_nodes[1]
      parent_xval,parent_yval=openx[node],openy[node]
      actual_list[parent_xval,parent_yval]=2
      removefrom_binaryheap
      for i in 0...8
        break if i>3&&!diagonal
        x,y=case i
        when 0 then [parent_xval,parent_yval-1] # UP
        when 1 then [parent_xval,parent_yval+1] # DOWN 
        when 2 then [parent_xval-1,parent_yval] # LEFT 
        when 3 then [parent_xval+1,parent_yval] # RIGHT
        when 4 then [parent_xval-1,parent_yval-1] # UP LEFT
        when 5 then [parent_xval+1,parent_yval-1] # UP RIGHT
        when 6 then [parent_xval-1,parent_yval+1] # DOWN LEFT
        when 7 then [parent_xval+1,parent_yval+1] # DOWN RIGHT
        end
        next if actual_list[x,y] == 2
        next unless char.passable?(x,y) 
        if i > 3
          next unless case i
          when 4 then char.passable?(x+1,y)||char.passable?(x,y+1)
          when 5 then char.passable?(x-1,y)||char.passable?(x,y+1)
          when 6 then char.passable?(x+1,y)||char.passable?(x,y-1)
          when 7 then char.passable?(x-1,y)||char.passable?(x,y-1)
          end
        end
        plus_step_cost=((x-parent_xval).abs+(y-parent_yval).abs)>1 ? 14 : 10
        temp_step_cost=step_cost[parent_xval,parent_yval]+plus_step_cost
        if actual_list[x,y]==1
          if temp_step_cost<step_cost[x,y]
            parent_x[x,y]=parent_xval
            parent_y[x,y]=parent_yval
            step_cost[x,y]=temp_step_cost
            index=1
            while index<@listsize;index+=1
              break if openx[@open_nodes[index]]==x &&openy[@open_nodes[index]]==y
            end
            @total_cost[@open_nodes[index]]=temp_step_cost+heuristic[@open_nodes[index]]
          else
            next
          end
        else
          new_openid+=1;@listsize+=1 
          @open_nodes[@listsize]=new_openid
          step_cost[x,y]=temp_step_cost
          d=[(trgt_x-x).abs,(trgt_y-y).abs]
          heuristic[new_openid]=diagonal ? (d.max*14)+(d.min*10) : (d[0]+d[1])*10
          @total_cost[new_openid]=temp_step_cost+heuristic[new_openid]
          parent_x[x,y],parent_y[x,y]=parent_xval,parent_yval
          openx[new_openid],openy[new_openid]=x,y
          index,actual_list[x,y]=@listsize,1
        end
        while index!=1
          temp_node=@open_nodes[index]
          if @total_cost[temp_node]<=@total_cost[@open_nodes[index / 2]] 
            @open_nodes[index]=@open_nodes[index / 2]
            index/=2;@open_nodes[index]=temp_node
          else;break
          end
        end
      end
    end
    path_x,path_y=trgt_x,trgt_y
    while path_x!=src_x||path_y!=src_y
      prnt_x,prnt_y=parent_x[path_x,path_y],parent_y[path_x,path_y]
      if path_x<prnt_x;code=path_y<prnt_y ? 7 : path_y>prnt_y ? 5 : 2
      elsif path_x>prnt_x ;code=path_y<prnt_y ? 8 : path_y>prnt_y ? 6 : 3 
      else ;code=path_y<prnt_y ? 4 : 1
      end
      path.push(RPG::MoveCommand.new(code))
      path_x,path_y=prnt_x,prnt_y
    end
    return path
  end
end



Déplacement

Portion de code : Tout sélectionner

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
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                                                  Déplacement à la souris II Reloaded
# par Berka                                                31/12/2009                                              rgss2 (VX)
#--------------------------------------------------------------------------------------------------------------------------------------
# Ne pas publier sans autorisation expresse. http://www.rpgmakervx-fr.com
#--------------------------------------------------------------------------------------------------------------------------------------
# Selection de personnages à la souris avec rectangle de sélection
# Déplacement par clic droit
# Scroll de la carte lorsque la souris est placée sur le bord de la fenetre
# Déplacement du héro si rien n'est sélectionné
#--------------------------------------------------------------------------------------------------------------------------------------
# Nécessite les scripts, normalement fournis avec ce script
# - Clavier : crédits à TLN et Lordrik (script amélioré, support des touches de jeu par berka)
# - Souris : crédits à Cybersam et Nearfantastica (ajout de la fonction drag&drop par berka)
# - Pathfinding : crédits à Modern Algebra (tiré de l'algo A* expliqué par M.Lester)
#--------------------------------------------------------------------------------------------------------------------------------------
# Tous les Réglages se font dans le présent script.            
# Bien mettre le commentaire "mobile" dans chaque événement déplacable. Sinon ca ne marche pas !
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
module Berka
  module Selection
    T_Select          = "clic gauche"                        # Touche de Sélection
    T_Bouge          = "clic droit"                            # Touche de déplacement (cf. script Clavier)
    N_Curseur      = "normal.png"                      # Image du Curseur, placée dans ./System (Icone par défaut)
    Comment        = "mobile"                              # Commentaire à ajouter aux events déplacables
    C_Selbord        = Color.new(0,255,0,180)  # Couleur du bord du rectangle de selection
    C_Selfond        = Color.new(0,255,0,80)      # Couleur du fonds du rectangle de sélection
    TonSelect        = Tone.new(0,255,0,20)      # Couleur des events selectionnés
    MargeScroll      = 16                                          # Bordure de l'écran réactif au scroll
    VitesseScroll  = 7                                            # Vitesse du scroll de la carte 
  end
end
include Berka::Selection
$souris.shcurseur(N_Curseur,8,8)
$deplevents||={}
class Scene_Map<Scene_Base
  alias :select_start :start
  alias :select_update :update
  alias :select_terminate :terminate    
  def start
    @select,@events=Sprite_Select.new,[]
    select_start
  end
  def update
    select_update
    return if !$souris
    if Input.trigger?(T_Bouge)
      x,y=$souris.grid[0],$souris.grid[1]
      return $game_player.force_path(x,y)if @events.empty?
      Thread.new{@events.each{|e|e.force_path(x,y) if e.is_a?(Game_Event)}}
      sleep(0.01)
    end
    if Input.press?(T_Select) 
      clear
      @select.visible=true
      $souris.drag(T_Select,@select){@events=$deplevents.select{|e,c|@select.chk?(*c)}.flatten
      @events.each{|e|e.selection=true if e.is_a?(Game_Event)}
      @select.update}
      return
    end
    chk_scroll
  end
  def clear
    @events.each{|e|e.selection=false if e.is_a?(Game_Event)}
    @events.clear
  end
  def terminate
    @select.dispose
    select_terminate
  end
  def chk_scroll
    m=MargeScroll;x,y=$souris.update
    i=2 if x.between?(0,544-m)&&y.between?(416-m,416)
    i=4 if x.between?(0,m)&&y.between?(0,416-m)
    i=6 if x.between?(544-m,544)&&y.between?(m,416)
    i=8 if x.between?(m,544)&&y.between?(0,m)
    $game_map.start_scroll(i,1,VitesseScroll)if i
  end
end
class Sprite_Select<Sprite_Base
  attr_writer :width,:height,:rect
  def initialize
    super
    self.bitmap=Bitmap.new(544,416)
    @width,@height=0,0
  end
  def update
    super
    self.bitmap.clear
    self.bitmap.fill_rect(0,0,@width,@height,C_Selbord) 
    self.bitmap.fill_rect(1,1,@width-2,@height-2,C_Selfond) 
  end
  def chk?(x,y)
    x-=$game_map.display_x/8;y-=$game_map.display_y/8
    x.between?(self.x,self.x+@width)&&y.between?(self.y,self.y+@height)
  end
end
class Game_Character
  alias :select_cinit :initialize
  attr_accessor :tone
  def initialize
    @tone=Tone.new(0,0,0,0)
    select_cinit
  end
end
class Game_Event<Game_Character
  alias :select_init :initialize
  alias :select_upd :update
  attr_accessor :selection
  def initialize(*args)
    select_init(*args)
    @selection=false
    for i in 0...@list.size;@bouge=true if @list[i].parameters[0]==Comment;end
  end
  def update
    $deplevents[self]=[self.screen_x,self.screen_y]if @bouge
    @tone=(@selection ? TonSelect : Tone.new(0,0,0,0))
    select_upd
  end
end
class Sprite_Character<Sprite_Base
  alias :select_upd :update
  def update
    self.tone=@character.tone
    select_upd
  end
end



Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - RM Web Browser

berka - posté le 05/08/2009 à 16:36:33. (493 messages postés)

Tu l'as surement déjà vu. Pas de scénario, des maps vides, aucun héro, graphismes peu novateurs, mais une bonne dose de scripts et d'APIs :p

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - RM Web Browser

berka - posté le 04/08/2009 à 22:19:42. (493 messages postés)

:D

J'ai créé une interface de socialisation par internet pour les nolife, les vrais !

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - RM Web Browser

berka - posté le 04/08/2009 à 21:35:55. (493 messages postés)

Je me sers maintenant de ce script pour mon projet, au niveau de la gestion des erreurs. Plus besoin de lancer un navigateur externe tout se fait dans le jeu.

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - RM Web Browser

berka - posté le 04/08/2009 à 19:26:14. (493 messages postés)

Il n'y a rien de meilleur que de programmer des scripts inutiles. Et encore ce n'est pas le plus inutile que j'ai fait !x)

Mais je l'ai quand meme intégré à mon projet.
Ca fait plus pro :)

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Brouillard de Guerre

berka - posté le 28/05/2009 à 11:07:34. (493 messages postés)

C'est vrai que ce systeme est lourd, mais la taille de la map n'influe que lors de son chargement. Les déplacements sont aussi gourmands en calcul quel que soit les dimensions de la map ! Tout dépend de ce que tu utilises comme scripts/events communs et parallèles.
C'est vrai que mon screen n'est pas très beau, mais avec les autres tilesets, le résultat est meilleur.

Scrapi: trebbor s'etonnait de voir certaines méthodes écrites en anglais. C'est plus facile de nommer les méthodes en anglais parce que les mots sont plus précis et courts.

-----------------------
Pour ceux qui ont des problemes: souris bloquée, plantage total... c'est que le script sollicite un peu trop votre CPU, votre ordi en gros.

Je vous propose de regarder cette ligne:

Portion de code : Tout sélectionner

1
2
Win32API.new('kernel32','SetPriorityClass','pi','i').call(
Win32API.new('kernel32','GetCurrentProcess','','i').call,256)



et de changer le 256 en 128.
puis supprimez la si rien ne change.

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Brouillard de Guerre

berka - posté le 25/05/2009 à 14:27:05. (493 messages postés)

Ho, si ! Ca a été le plus long...

Il faut que je pense à finir le script de generation d'events.

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Brouillard de Guerre

berka - posté le 25/05/2009 à 09:47:36. (493 messages postés)

autres tilesets de brouillard:
image
image
image

Tous faits par Jess !

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Posté dans Scripts - Générateur d'events aléatoires

berka - posté le 21/05/2009 à 13:18:43. (493 messages postés)

Exact, Zeus !
J'ai zappé ça... et vu que je ne me sers quasiment jamais des events...

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques

Aller à la page: 1 2 3

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers