Partagez
Aller en bas
RPG-man
RPG-man
Membre

Nombre de messages : 55
Age : 25
Distinction : aucune
Date d'inscription : 16/03/2009

Dégradés, cadres, jauges... Empty Dégradés, cadres, jauges...

le 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 :
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 :
Dégradés, cadres, jauges... Degrad--cb716e
Un grosse "Jauge"!
Dégradés, cadres, jauges... Extra-false-cb720b
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum