- RPG-manMembre
- Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009
Dégradés, cadres, jauges...
Jeu 26 Mar 2009 - 18:56
Ces scripts est résevé à des gens sachant manier le Ruby, car c'est de la création de bitmap qui ne se fait pas en events!
Voici un ensemble de 3 scripts permettant:
-De créer des dégradés
-De créer des cadres
-De créer des jauges (il a besoin des 2 autres pour fonctionner)
/////////////// UTILITES AUTRES \\\\\\\\\\\\\\\\
Alors, rien qu'avec ça on peut faire des tonnes de choses, exemple:
Avec l'encadrement, on peut faire des transitions en effacant petit à petit un bitmap :
/////////////// SCRIPTS ET EXPLICATIONS \\\\\\\\\\\\\\\\
Alors, déjà, quand on travaille avec de grands bitmaps ou de grandes opérations, créer le bitmap prend du temps, donc, il est préférable de les précalculer!
Ensuite, par quelques modifs simples on peut rajouter/optimiser ça (par exemple au lieu de créer le bitmap on peut faire ajouter le dégradé au bitmap (avec blt et en changeant quelques trucs)).
Quelques précisions sur les temps :
Créer un bitmap dégradé de type (0, 1, 2 ou 3) de 800*600 px prend 16 ms.
Les types 5 et 6 sont BEAUCOUP plus longs.
Voilà ^^
Si y'a des erreurs ou des optimisations à proposer, faîtes-le moi savoir ^^
Screens :
Voici un ensemble de 3 scripts permettant:
-De créer des dégradés
-De créer des cadres
-De créer des jauges (il a besoin des 2 autres pour fonctionner)
/////////////// UTILITES AUTRES \\\\\\\\\\\\\\\\
Alors, rien qu'avec ça on peut faire des tonnes de choses, exemple:
Avec l'encadrement, on peut faire des transitions en effacant petit à petit un bitmap :
- Code:
(...)
w = 200
h = 200
color = Color.new(0, 0, 0, 0)
for i in 0...w
bitmap.encadre(w, h, color, 1, true, true)
Graphics.update
end
(...)
/////////////// SCRIPTS ET EXPLICATIONS \\\\\\\\\\\\\\\\
Alors, déjà, quand on travaille avec de grands bitmaps ou de grandes opérations, créer le bitmap prend du temps, donc, il est préférable de les précalculer!
Ensuite, par quelques modifs simples on peut rajouter/optimiser ça (par exemple au lieu de créer le bitmap on peut faire ajouter le dégradé au bitmap (avec blt et en changeant quelques trucs)).
Quelques précisions sur les temps :
Créer un bitmap dégradé de type (0, 1, 2 ou 3) de 800*600 px prend 16 ms.
Les types 5 et 6 sont BEAUCOUP plus longs.
- Code:
#====================================================
# Draw Degrade
# Josué Alvarez (RPG-man)
#-------------------------------------------------------------
#Crée un bitmap contenant un dégradé
#====================================================
=begin
/!\ Mode d'emploi /!\
Voici un exemple d'utilisation :
c1 = Color.new(255, 0, 0, 255) # Première couleur
c2 = Color.new(200, 150, 0, 255) # Deuxième couleur
w = 200 # Largeur du bitmap
h = 200 # hauteur du bitmap
bitmap = Bitmap.new(w, h) # Création du bitmap vide
bitmap.draw_degrade(w, h, c1, c2, 2) # Création du dégradé sur le bitmap
sprite = Sprite.new # Création du sprite
sprite.bitmap = bitmap " Attribution du bitmap au sprite
///////////////////////////
Les arguments
\\\\\\\\\\\\\\\\\\\\\\\\\\\
1 : Largeur du bitmap
2 : Hauteur du bitmap
3 : Première couleur
4 : Deuxième couleur
5 : Type de dégradé
( 0 : droite vers gauche, 1: gauche vers droite, 2 haut vers bas, 3 bas vers haut )
=end
class Bitmap
def draw_degrade(w, h, col1, col2, type=0)
@col1 = col1
@col2 = col2
@couleur = col1
case type
#===================================
#Bas vers haut
#===================================
when 2
@red = (col2.red - col1.red)/ h
@blue = (col2.blue - col1.blue) / h
@green = (col2.green - col1.green) / h
@opacity = (col2.alpha - col1.alpha) /h
for i in 0...h
self.fill_rect(0, i, w, 1, @couleur)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#===================================
#Haut vers bas
#===================================
when 3
@red = (col2.red - col1.red)/ h
@blue = (col2.blue - col1.blue) / h
@green = (col2.green - col1.green) / h
@opacity = (col2.alpha - col1.alpha) / h
for i in 0...h
self.fill_rect(0, h-i, w, 1, @couleur)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#===================================
# Gauche vers droite
#===================================
when 0
@red = (col2.red - col1.red) / w
@blue = (col2.blue - col1.blue) / w
@green = (col2.green - col1.green) / w
@opacity = (col2.alpha - col1.alpha) / w
for i in 0...w
self.fill_rect(i, 0, 1, h, @couleur)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#===================================
#Droite vers gauche
#===================================
when 1
@red = (col2.red - col1.red) / w
@blue = (col2.blue - col1.blue) / w
@green = (col2.green - col1.green) / w
@opacity = (col2.alpha - col1.alpha) / w
for i in 0...w
self.fill_rect(w-i, 0, 1, h, @couleur)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#===================================
#Radial
#===================================
when 5
if w < h
m = w
else
m = h
end
@red = (col2.red - col1.red) / m
@blue = (col2.blue - col1.blue) / m
@green = (col2.green - col1.green) / m
@opacity = (col2.alpha - col1.alpha) /m
for i in 0...m/2 + 1
self.encadre(w, h, @couleur, i, true, true)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#===================================
# Radial inverse
#===================================
when 6
if w < h
m = w
else
m = h
end
@red = (col2.red - col1.red) / m
@blue = (col2.blue - col1.blue) / m
@green = (col2.green - col1.green) / m
@opacity = (col2.alpha - col1.alpha) /m
for i in 0...m/2 + 1
self.encadre(w, h, @couleur, i, true, false)
@couleur.red += @red
@couleur.blue += @blue
@couleur.green += @green
@couleur.alpha += @opacity
end
#=======================================================
#=======================================================
end
return self
end
#=======================================================
#=======================================================
#/////////////////////////////
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
end
- Code:
#=======================================================
# Cadres
# Josué Alvarez (RPG-man)
#---------------------------------------------------------------
# Encadre un bitmap
#=======================================================
=begin
/!\ Mode d'emploi /!\
//////////////////////////////////
Arguments
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
1 : largeur du bitmap
2 : hauteur du bitmap
3 : Couleur de l'encadrement
4 : épaisseur du trait (des options après)
5 : Trait fin :
o si true : trace un cadre de 1 pixel qui a pour distance du bord du bitmap l'argument 4
o si false : encadre le bitmap avec un trait d'une largeur de l'argument 4
6 : commencement du cadre au bord:
o si true : commencera toujours le cadre au bord
o si false et 'Trait fin' true, commence l'encadrement à #{argument4} pixels du bord.
=end
class Bitmap
def encadre(w, h, color, ep=1, fin=false, debut=true)
if debut == true
deb = ep-1
else
deb = 0
end
#======================
#======================
for i in deb...w-deb
if fin == false
for j in 0...ep
self.set_pixel(i, j, color)
self.set_pixel(i, h-(j+1), color)
end
else
self.set_pixel(i, ep, color)
self.set_pixel(i, h-ep, color)
end
end
#======================
#======================
#======================
#======================
for i in deb...h-deb
if fin == false
for j in 0...ep
self.set_pixel(j, i, color)
self.set_pixel(w-(j+1), i, color)
end
else
self.set_pixel(ep, i, color)
self.set_pixel(w-ep, i, color)
end
end
#======================
#======================
end
end
- Code:
#====================================================
# Draw Jauge
# Josué Alvarez (RPG-man)
#-------------------------------------------------------------
# Crée une jauge
# Pour changer la longueur :
# sprite.src_rect.set(0, 0, log, haut)
#====================================================
class Bitmap
def draw_jauge(type, c1, c2, c3, opacity=50, extra=false, opacity_extra=50)
self.draw_degrade(self.width, self.height, c1, c2, type)
self.encadre(self.width, self.height, c3, 1)
b = Bitmap.new(self.width, self.height/2)
b.fill_rect(b.rect, Color.new(255, 255, 255, 255))
if extra == true
black = Color.new(0, 0, 0, 255)
transp = Color.new(0, 0, 0, 50)
c = Bitmap.new(self.width, self.height/2)
c.draw_degrade(c.width, c.height, black, transp, 3)
d = Bitmap.new(self.width, self.height/2)
d.draw_degrade(d.width, d.height, transp, black, 3)
self.blt(0, 0, c, c.rect, opacity_extra)
self.blt(0, self.height/2, d, d.rect, opacity_extra)
c.dispose
d.dispose
end
self.blt(0, 0, b, b.rect, opacity)
b.dispose
end
end
Voilà ^^
Si y'a des erreurs ou des optimisations à proposer, faîtes-le moi savoir ^^
Screens :
- Spoiler:
- Dégradé pendant le jeu, calcul en temps réel :
Un grosse "Jauge"!
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum