- RPG-manMembre
- Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009
Tracer des cercles et des disques
Mar 31 Mar 2009 - 20:13
Ceci est un script contenant 2 algorithmes : un pour les disques, l'autre pour les cercles. Je préviens desuite c'est un script pour les rubystes!
Pour les connaisseurs je l'ai créé sur la base de celui de Andres.
Il marche impec! Seul problème, un peu lent pour les disques (100ms pour un rayon de 100px). Sinon, les cercles ça va vite...
Bon, ben voilà, je vous donne le code :
Et voilà une modif pour dessiner un disque dont l'opacité diminue au fur et à mesure qu'on s'approche du bord:
Comme d'hab, si vous avez des critiques, optimisations à proposer
Pour les connaisseurs je l'ai créé sur la base de celui de Andres.
Il marche impec! Seul problème, un peu lent pour les disques (100ms pour un rayon de 100px). Sinon, les cercles ça va vite...
Bon, ben voilà, je vous donne le code :
- Code:
#================================================================
# * Draw_disc et Draw_cercle
#---------------------------------------------
# Par RPG-man sur la base de l'algorythme de Andres
# Crée un cercle sur un bitmap
# Spécifier
# - rayon : le rayon du cercle
# - x_centre : l'abscisse du centre du cercle (sur le bitmap)
# - y_centre : l'ordonnée du centre du cercle (sur le bitmap)
# Exemple d'utilisation
#-------------------------------
# sprite = Sprite.new
# sprite.bitmap = Bitmap.new(100, 100)
# sprite.bitmap.draw_disc(50)
#-------------------------------
#================================================================
#================================================================
# Classe Bitmap
#-------------------------------------
#================================================================
class Bitmap
#================================================================
# * draw_disc
#================================================================
def draw_disc(rayon=20, x_centre=nil, y_centre=nil)
#-------------------------------------------
# Si le centre est indéterminé, c'est le centre du bitmap
#-------------------------------------------
if x_centre == nil
x_centre = self.width/2
end
if y_centre == nil
y_centre = self.height/2
end
#-------------------------------------------
# Couleur : c'est du blanc mais on peut changer
#(suffit de rajouter un argument)
#-------------------------------------------
color = Color.new(255, 255, 255, 255)
x = 0
y = rayon
m = 5-4*rayon
for i in 0..rayon
# Hop, on remet les variables à 0 !
x = 0
y = i
m = 5-4*i
#------------------------------------------------
while x <= y
for i in 0..1
self.set_pixel(x+x_centre, y+y_centre+i, color)
self.set_pixel(y+x_centre, x+y_centre+i, color)
self.set_pixel(-x + x_centre, y + y_centre+i, color)
self.set_pixel(-y+x_centre, x+y_centre+i, color)
self.set_pixel(x+x_centre, -y+y_centre+i, color)
self.set_pixel(y+x_centre, -x+y_centre+i, color)
self.set_pixel(-x+x_centre, -y + y_centre+i, color)
self.set_pixel(-y+x_centre, -x+y_centre+i, color)
end
if m > 0
y = y-1
m = m-8*y
end
x = x+1
m = m + 8*x + 4
end
end
end
#================================================================
# * draw_circle
# Bon, je vais pas me répéter!
#================================================================
def draw_circle(rayon=20, x_centre=nil, y_centre=nil)
if x_centre == nil
x_centre = self.width/2
end
if y_centre == nil
y_centre = self.height/2
end
color = Color.new(255, 255, 255, 255)
x = 0
y = rayon
m = 5-4*rayon
while x <= y
self.set_pixel(x+x_centre, y+y_centre, color)
self.set_pixel(y+x_centre, x+y_centre, color)
self.set_pixel(-x + x_centre, y + y_centre, color)
self.set_pixel(-y+x_centre, x+y_centre, color)
self.set_pixel(x+x_centre, -y+y_centre, color)
self.set_pixel(y+x_centre, -x+y_centre, color)
self.set_pixel(-x+x_centre, -y + y_centre, color)
self.set_pixel(-y+x_centre, -x+y_centre, color)
if m > 0
y = y-1
m = m-8*y
end
x = x+1
m = m + 8*x + 4
end
end
end
Et voilà une modif pour dessiner un disque dont l'opacité diminue au fur et à mesure qu'on s'approche du bord:
- Code:
class Bitmap
#============================
# * Dessine un disque flou (25)
#============================
def draw_flou(rayon=25, x_centre=nil, y_centre=nil, color=Color.new(255, 255, 255, 255))
if x_centre == nil
x_centre = self.width/2
end
if y_centre == nil
y_centre = self.height/2
end
bitmap = Bitmap.new(self.width, self.height)
@color = color.clone
#rayon = 25
@int = 255.0/rayon.to_f
x = 0
y = rayon
m = 5-4*rayon
for i in 0..rayon
@color.alpha -= @int
x = 0
y = i
m = 5-4*i
while x <= y
#----------------------
#@color.alpha -= 1 if a%@int <= 1
#if @color.alpha <= 0
#@color.alpha = @color2.alpha
#end
#a+=1
#----------------------
for i in 0..1
bitmap.set_pixel(x+x_centre, y+y_centre+i, @color)
bitmap.set_pixel(y+x_centre, x+y_centre+i, @color)
bitmap.set_pixel(-x + x_centre, y + y_centre+i, @color)
bitmap.set_pixel(-y+x_centre, x+y_centre+i, @color)
bitmap.set_pixel(x+x_centre, -y+y_centre+i, @color)
bitmap.set_pixel(y+x_centre, -x+y_centre+i, @color)
bitmap.set_pixel(-x+x_centre, -y + y_centre+i, @color)
bitmap.set_pixel(-y+x_centre, -x+y_centre+i, @color)
end
if m > 0
y = y-1
m = m-8*y
end
x = x+1
m = m + 8*x + 4
end
end
self.blt(0, 0, bitmap, bitmap.rect, 50) #Choisir l'opacité
end
end
Comme d'hab, si vous avez des critiques, optimisations à proposer
- NaasmarMembre
- Nombre de messages : 185
Age : 28
Distinction : aucune
Date d'inscription : 15/03/2008
Re: Tracer des cercles et des disques
Mer 1 Avr 2009 - 21:44
J'ai pas compris à quoi sa servait =\
- RPG-manMembre
- Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009
Re: Tracer des cercles et des disques
Jeu 2 Avr 2009 - 9:52
Tu sais ce qu'est un cercle? Tu sais ce qu'est un disque? Et bien ce script sert à en créer sans besoin de ressources, et avec ça, on peut même créer un "point flou" d'un rayon donné en l'arrangeant un peu :
- Code:
class Bitmap
#============================
# * Dessine un disque flou (25)
#============================
def draw_flou(rayon=25, x_centre=nil, y_centre=nil, color=Color.new(255, 255, 255, 255))
if x_centre == nil
x_centre = self.width/2
end
if y_centre == nil
y_centre = self.height/2
end
bitmap = Bitmap.new(self.width, self.height)
@color = color.clone
#rayon = 25
@int = 255.0/rayon.to_f
x = 0
y = rayon
m = 5-4*rayon
for i in 0..rayon
@color.alpha -= @int
x = 0
y = i
m = 5-4*i
while x <= y
#----------------------
#@color.alpha -= 1 if a%@int <= 1
#if @color.alpha <= 0
#@color.alpha = @color2.alpha
#end
#a+=1
#----------------------
for i in 0..1
bitmap.set_pixel(x+x_centre, y+y_centre+i, @color)
bitmap.set_pixel(y+x_centre, x+y_centre+i, @color)
bitmap.set_pixel(-x + x_centre, y + y_centre+i, @color)
bitmap.set_pixel(-y+x_centre, x+y_centre+i, @color)
bitmap.set_pixel(x+x_centre, -y+y_centre+i, @color)
bitmap.set_pixel(y+x_centre, -x+y_centre+i, @color)
bitmap.set_pixel(-x+x_centre, -y + y_centre+i, @color)
bitmap.set_pixel(-y+x_centre, -x+y_centre+i, @color)
end
if m > 0
y = y-1
m = m-8*y
end
x = x+1
m = m + 8*x + 4
end
end
self.blt(0, 0, bitmap, bitmap.rect, 50) #Choisir l'opacité
end
end
- Spoiler:
- RPG-manMembre
- Nombre de messages : 55
Age : 30
Distinction : aucune
Date d'inscription : 16/03/2009
Re: Tracer des cercles et des disques
Jeu 2 Avr 2009 - 14:53
Ben, y'a pas de quoi ^^
C'est vrai que pour les N00Bs ça paraît tout à fait anodin de créer un cercle mais ce n'est pas si facile que ça en fait quand on a pas la solution sous les yeux ^^
C'est vrai que pour les N00Bs ça paraît tout à fait anodin de créer un cercle mais ce n'est pas si facile que ça en fait quand on a pas la solution sous les yeux ^^
- driccMembre
- Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009
Re: Tracer des cercles et des disques
Mar 8 Sep 2009 - 11:06
C'est pour les scripteurs ...
certainement pas à mettre tel quel dans un jeu .
ça pourrait servir pour une lumiere par exemple . Ou un cercle plus ou moins grand en fonction des points de vie . seule l'imagination est la limite !
certainement pas à mettre tel quel dans un jeu .
ça pourrait servir pour une lumiere par exemple . Ou un cercle plus ou moins grand en fonction des points de vie . seule l'imagination est la limite !
- zoneneutreMembre
- Nombre de messages : 129
Age : 36
Distinction : aucune
Date d'inscription : 17/03/2008
Re: Tracer des cercles et des disques
Mar 8 Sep 2009 - 15:50
Ou par exemple un jeu avec des énigmes style tracer un cercle autour d'un personnage dans une pénombre..Bref un jeu d'enquête ^^
- SkilloStaffeux retraité
- Nombre de messages : 526
Age : 35
Localisation : Rennes
Distinction : J'aime ce gars
(by Coco')
Scripteur apprenti, futur Berka !
(par Tretian)
Membre anonyme de la communauté, caché derrière son PC
(???)
super prof de script
[Dudu']
Résident permanent de la Chat Box
[Autoproclamé]
Adepte du XDDD [Yak' ]
Fanatique hystérique de Raymond le français [Un connu]
Date d'inscription : 19/01/2008
Re: Tracer des cercles et des disques
Mar 8 Sep 2009 - 18:10
dricc t'as fait un sacré nécro quand même et pour dire pas grand chose. Fait attention!!
berka: T'es modo ?
Edit: Non je ne fait que le signaler.
berka: T'es modo ?
Edit: Non je ne fait que le signaler.
- driccMembre
- Nombre de messages : 2760
Localisation : Lille
Distinction : Altruiste - Incarnation de la Patience [Mist']
Date d'inscription : 10/08/2009
Re: Tracer des cercles et des disques
Mar 8 Sep 2009 - 18:20
... ben .. je comprends pas ... y'avait une réponse d'aujourd'hui meme ...
Je me suis fait piéger là , je crois . y'a quelqu'un qui a posté et qui supprimé son post aprés .
berka: A tous: Bon, c'est pas grave, pas besoin de poster plusieurs fois pour cet incident ! Inutile aussi de modérer, il y a des modos exprès pour ca ! Merci de ne pas recommencer.
Je me suis fait piéger là , je crois . y'a quelqu'un qui a posté et qui supprimé son post aprés .
berka: A tous: Bon, c'est pas grave, pas besoin de poster plusieurs fois pour cet incident ! Inutile aussi de modérer, il y a des modos exprès pour ca ! Merci de ne pas recommencer.
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum