Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Modificación de la clase Float

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Modificación de la clase Float

Mensaje por yoenmii el 2013-05-11, 08:34

Este script es una pequeña modificación de la clase Float (número real de coma flotante) que he hecho. Le he añadido algunas cosas como poder ser interpretada como tiempo al pasarla a string, la posibilidad de truncar en 'x' cifra y una pequeña modificación a 'round'.
Código:

class Float
  attr_accessor :isTime
 
  alias_method :f_to_s, :to_s
  alias_method :truncate0, :truncate
 
  def t_to_s()
    h = (self / 3600).truncate0()
    m = ((self / 60).truncate0()) % 60
    s = (self.truncate0()) % 60
    ms = (self - self.truncate0()) * 100000
    ms = ms.round(0)/100.00
    return "#{h}h #{m}min #{s}s #{ms}ms"
  end
  def to_s()
    return t_to_s() if isTime else f_to_s()
  end
  def truncate(decPlaces = 0)
    if decPlaces == 0
      return truncate0()
    elsif decPlaces < 0
      return (((self * ((10**decPlaces))).truncate0())/(10**(decPlaces))).truncate0()
    else
      return ((self * (10**decPlaces)).truncate0())/((10**(decPlaces))/1.0)
    end
  end
  def round(decPlaces, fivePlus1 = true)
    n = self.truncate(decPlaces)
    d = self - n
    d = d * (10**(decPlaces+1))
    d = d.truncate0()
    if d > 5.0 then
      n += 10**(-decPlaces)
    elsif d == 5.0 and fivePlus1
      n += 10**(-decPlaces)
    end
    if decPlaces <= 0 then
      n = n.truncate()
    end
    return n
  end
end

Ejemplo de utilización:
Código:

f = 1526.3748
#Empezamos por la interpretación como tiempo:
print("#{f.f_to_s()}") #Antiguo método to_s: 1526.3748
print("#{f.t_to_s()}") #Método para interpretar en horas: 0h 25min 26s 37,48ms
f.isTime = true
print("#{f}") #0h 25min 26s 37,48ms
f.isTime = false
print("#{f}") #1526.3748
#Modificación del método 'truncate':
n = f.truncate0() #Antiguo método 'truncate'
print("#{n}") #1526
n = f.truncate() #Nuevo método 'truncate',sin parámetro hace lo mismo que el anterior.
print("#{n}") #1526
n = f.truncate(1) #Trunca (corta) a la primera cifra decimal.
print("#{n}") #1526.3
n = f.truncate(0) #Trunca (corta) a la primera cifra entera (desde el punto).
print("#{n}") #1520
#Modificación del método 'round':
n = f.round(1) #Redondea a la primera cifra decimal como el antiguo.
print("#{n}") #1526.4
f = 1500.00
n = f.round(-3) #Redondea a la cuarta cifra entera (desde el punto), por defecto el 5 a la alta.
print("#{n}") #2000
n = f.round(-3, false) #Lo mismo que la anterior pero el 5  a la baja.
print("#{n}") #1000

Si encontráis algún bug/error no dudéis en postearlo.
Testeado en RPG Maker XP, aunque debería ser compatible con cualquiera ;).

Yoenmii
avatar
yoenmii
Novato
Novato

0/3

Créditos 91

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: Modificación de la clase Float

Mensaje por Wecoc el 2013-09-12, 04:53

Estoy haciendo muchos necro, a este paso acabaran baneándome D: xDD

No pude evitar hacerle un arreglillo a tu script para ampliarlo aún más. Debería funcionar con cualquier maker, pero no sé. No pido créditos.

Atención, los índices van siempre así:


Código:
class Float
 
  attr_accessor :isTime
 
  alias_method :f_to_s, :to_s
  alias_method :truncate0, :truncate
  alias_method :round0, :round
   
  def t_to_s
    h = (self / 3600).truncate0()
    m = ((self / 60).truncate0()) % 60
    s = (self.truncate0()) % 60
    ms = (self - self.truncate0()) * 100000
    ms = ms.round(0)/100.00
    return "#{h}h #{m}min #{s}s #{ms}ms"
  end
 
  def to_s
    return t_to_s if isTime else f_to_s
  end
 
  def truncate(decPlaces = 0)
    decPlaces = -decPlaces
    return truncate0 if decPlaces == 0
    if decPlaces < 0
      return (((self * (10**decPlaces)).truncate0)/(10**(decPlaces))).truncate0
    else
      return ((self * (10**decPlaces)).truncate0)/((10**(decPlaces))/1.0)
    end
  end
 
  def round(decPlaces = 0, fivePlus1 = true)
    decPlaces = -decPlaces
    n = self.truncate(decPlaces)
    d = self - n
    d = d * (10**(decPlaces+1))
    d = d.truncate0
    if d > 5.0 then
      n += 10**(-decPlaces)
    elsif d == 5.0 and fivePlus1
      n += 10**(-decPlaces)
    end
    n = n.truncate if decPlaces <= 0
    return n
  end
 
  def sign
    return self <=> 0.0
  end
 
  def even?(index=0)
    i = self.index(index)
    return i % 2 == 0
  end
 
  def odd?(index=0)
    return !even?(index)
  end
 
  def index(index)
    float = self.to_s.split(//)
    dotindex = float.index(".")
    float.delete(".")
    if index >= nodigits or (index < 0 and -index > nodigits)
      return 0
    end
    return float[dotindex - index - 1].to_i
  end
 
  def decimals
    float = self.to_s.split(//)
    dotindex = float.index(".")
    return float.size - dotindex - 1
  end

  def integers
    float = self.to_s.split(//)
    dotindex = float.index(".")
    return float.size - decimals - 1
  end
   
  def approx(other, relative_epsilon=Float::EPSILON, epsilon=Float::EPSILON)
    difference = other - self
    return true if difference.abs <= epsilon
    relative_error = (difference / (self > other ? self : other)).abs
    return relative_error <= relative_epsilon
  end
 
  def equals?(x,tolerance=EPSILON)
    (self-x).abs < tolerance
  end
 
end
- isTime(true / false) - Ya definido por yoenmii. Define si el float es un tiempo o no (de ello dependerá su to_s)
- t_to_s - Ya definido por yoenmii. Devuelve una string del float pasado a tiempo.
- f_to_s - Ya definido por yoenmi. Devuelve una string del float escrito por defecto.
- to_s - Ya definido por yoenmi. Devuelve una string del float, escrita como tiempo o por defecto según su tipo.
- truncate(index=0) - Ya definido por yoenmi. Trunca el float al correspondiente al índice marcado.
Código:
3.59.truncate(-1) # => 3.5
1.19.truncate # => 1
- round(index=0) - Ya definido por yoenmi. Redondea el float al float más cercano al índice marcado.
Código:
3.59.round(-1) # => 3.6
1.19.round # => 1
- sign - Devuelve el signo del float; -1 si es negativo, 0 si vale 0 y 1 si es positivo.
- even?(index=0) - Mira si ese índice del float es par.
- odd?(index=0) - Mira si es índice del float es impar.
- index(index) - Devuelve el índice index
Código:
3.59.index(-1) # => 5
1.19.index(1) # => 0
- decimals - Cuenta el número de decimales del float.
- integers - Cuenta el número de enteros (no decimales xD) del float.
- approx(other, relative_epsilon=EPSILON) - Mira si un número se aproxima a otro teniendo en cuenta un rango marcado.
Código:
3.5.approx(5, 2) # => true
4.779.approx(4.778, 0.001) # => true
4.779.approx(4.778, 0.0001) # => false
- equals(other, relative_epsilon) - Mira si un número equivale a otro teniendo en cuenta un rango marcado.

Eso es todo :)
avatar
Wecoc
Administrador
Administrador



Créditos 12387

Gracias : 595

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.