Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP][VX][VXA]Ruleta!

Ver el tema anterior Ver el tema siguiente Ir abajo

[XP][VX][VXA]Ruleta!

Mensaje por newold el 2014-10-04, 15:37

Pues sí, como dice el título os traigo un script con el que se crea una ruleta que te puede dar premios (instrucciones en el script).

Cuando se lanza la ruleta se le asigna a una variable de tu elección el premio que le ha tocado para que puedas hacer con ese dato lo que quieras (ver el video o el ejemplo k solo lo pongo en xp)


Demo solo xp -> https://www.mediafire.com/?tfkbz7jd8cpamls

Código:
=begin

  Script creado por newold
  Versión 1.0 - 04-10-2014
  De uso libre

  Crea una ruleta con varias opciones y guarda el resultado de la tirada
  en una variable para poder ser usada por los eventos.


                                  INSTRUCCIONES
                                  
  * comando llamar script en los eventos y poner
  
      $ruleta = Roulette.new
      
  * Configuración de la ruleta (escribir dentro del comando llamar script):
  
    $ruleta.width = número  <- Ancho de la ruleta
    
    $ruleta.height = número <- Alto de la ruleta
    
    $ruleta.x = número <- Posición x en la pantalla de la ruleta
    
    $ruleta.y = número <- Posición y en la pantalla de la ruleta
    
    $ruleta.minMov = número <- Menor valor de desplazamiento
                               horizontal del selector
    
    $ruleta.maxMov = número <- Mayor valor de desplazamiento
                               horizontal del selector
    
    $ruleta.mov = número <- Valor fijo para calcular movimiento del selector
    
    $ruleta.randMov = número <- Valor aleatorio para calcular
                                movimiento del selector
    
    $ruleta.se = "Ruta de un efecto de sonido" <- efecto de sonido al
                                                  mover el selector
    
    $ruleta.variable = número <- número de variable a la que se le asignará el
                                 valor de dónde se ha parado la ruleta
                                 (empezando por 0)
                                
    $ruleta.fontName = "nombre tipografía" <- nombre de la tipografía cuando se
                                              escribe texto
                                              
    
    $ruleta.fontSize = número <- Tamaño del texto
    
    $ruleta.fontColor = color <- Color con el que se dibujará el texto
                                 color = Color.new(0-255,0-255,0-255,0-255)
                                
  * Añadir datos a la ruleta:
  
    la estructura básica para añadir cosas a la ruleta es como sigue:
    
    $ruleta.set_data(tipo,id,porciento,color de fondo)
  
    - Añadir un objeto: $ruleta.set_data('item',ID item, Porciento, Color fondo)
    
    - Añadir un protector: $ruleta.set_data('armor',ID armor, Porciento, Color fondo)
    
    - Añadir un arma: $ruleta.set_data('weapon',ID weapon, Porciento, Color fondo)
    
    - Añadir una imagen: $ruleta.set_data('ruta imagen',0, Porciento, Color fondo)
  
    - Añadir una texto: $ruleta.set_data('texto',0, Porciento, Color fondo)
    
    - Añadir porción vacía: $ruleta.set_data('',0, Porciento, Color fondo)
    
  * lanzar la ruleta:
  
    Una vez configurada la ruleta y añadido los datos, lanzar la ruleta con
    
        $ruleta.start
        
    la ruleta empezará a girar y al detenerse asignará la posición del cursor
    a la variable especificada en la configuración.
    
    Si por ejemplo has añadido 4 cosas a la ruleta, y cuando se para ésta está
    la segunda cosa que añadiste, el valor de la variable será entonces 1. Si
    está en la primera posición será 0, y así con todos los datos (0,1,2,3,4,5...)
    
    Con ese dato ya puedes configurar un evento para que reaccione con el premio
    que ha tocado
=end

#===============================================================================
class Roulette
  # ----------------------------------------------------------------------------
  attr_accessor :width,     :height,      :x,      :y,
                :minMov,    :mod,         :se,     :variable,
                :mov,       :randMov,     :maxMov,
                :fontName,  :fontSize,    :fontColor
  # ----------------------------------------------------------------------------
  def initialize
    @data = []
    @perc = 0
    @width = 320
    @height = 42
    @x = RUBY_VERSION < "1.9" ? 160 : 112
    @y = RUBY_VERSION < "1.9" ? 433 : 369
    @mov = 750
    @randMov = 1000
    @maxMov = 12
    @minMov = 0.2
    @mod = 12
    @se = 'Audio/SE/cursor'
    @variable = 1
    @fontName = ["Verdana","Arial"]
    @fontSize = 18
    @fontColor = Color.new(255,255,255)
  end
  # ----------------------------------------------------------------------------
  def set_data(type,id,perc,color=nil)
    @data << [type,id,perc,(color.is_a?(Color) ? color :
    Color.new(rand(255),rand(255),rand(255)))]
    @perc += perc
  end
  # ----------------------------------------------------------------------------
  def start
    draw
    mov = @mov + rand(@randMov)
    mod = @mod.to_f
    maxMov = @maxMov
    minMov = @minMov
    xx = @line.x
    n = 0
    while true
      Graphics.update
      if mov / mod >= 0.25
        x = [[mov / mod,maxMov].min,minMov].max
        xx += x
        n += x
        if n >= 5
          Audio.se_play(@se) rescue nil
          n = 0
        end
        @line.x = xx
        if @line.x > @x + @width - 3
          @line.x = @x; xx = @line.x;
        end
        mov -= x
      else
        break
      end
      mod += 1
    end
    12.times {Graphics.update}
    reward = 0
    x = @x + 2
    for i in 0...@data.size
      data = @data[i]
      x2 = x + (data[2] * (@width-4) / @perc)
      if @line.x + 2 >= x and @line.x + 2 <= x2
        break
      else
        reward += 1
        x = x2
        next
      end
    end
    $game_variables[@variable] = reward
    dispose
  end
  # ----------------------------------------------------------------------------
  def draw
    w, h = @width, @height
    @bar = Sprite.new
    @bar.x = @x
    @bar.y = @y
    @bar.z = 10000000
    @bar.bitmap = Bitmap.new(w,h)
    @bar.bitmap.fill_rect(0,0,w,h,Color.new(235,235,235))
    @bar.bitmap.fill_rect(1,1,w-2,h-2,Color.new(160,160,160))
    @bar.bitmap.fill_rect(2,2,w-4,h-4,@data[-1][3])
    b2 = Bitmap.new(w,h)
    x = 2
    sep = []
    for data in @data
      w2 = (data[2] * (w-4) / @perc)
      @bar.bitmap.fill_rect(x,2,w2,h-4,data[3])
      item = nil
      case data[0]
      when 'item','objeto',1
        item = $data_items[data[1]]
      when 'weapon','arma',2
        item = $data_weapons[data[1]]
      when 'armor','armadura',3
        item = $data_armors[data[1]]
      else
        if (data[0].class == Bitmap)
          item = data[0]
        elsif (data[0].class == String)
          begin
            item = Bitmap.new(data[0])
          rescue
            begin
            b = Bitmap.new(1,1)
            b.font.name = @fontName
            b.font.size = @fontSize
            size = b.text_size(data[0])
            b = Bitmap.new(size.width,size.height)
            b.font.name = @fontName
            b.font.size = @fontSize
            b.font.color = @fontColor
            b.draw_text(0,0,b.width,b.height,data[0])
            b2.blt(x+w2/2-b.width/2,(h-4)/2-b.height/2,b,b.rect)
            rescue
            end
          end
        end
      end
      if [RPG::Item,RPG::Weapon,RPG::Armor].include?(item.class)
        if defined?(Cache)
          bitmap = Cache.system("Iconset")
          icon_index = item.icon_index
          rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
          b = Bitmap.new(bitmap.width,bitmap.height)
          b.blt(0, 0, bitmap, rect, 255)
        else
          b = RPG::Cache.icon(item.icon_name)
        end
        b2.blt(x+w2/2-b.width/2,(h-4)/2-b.height/2,b,b.rect)
      elsif item.is_a?(Bitmap)
        b = item
        b2.blt(x+w2/2-b.width/2,(h-4)/2-b.height/2,b,b.rect)
      end
      x += w2
      sep << x unless data == @data[-1]
    end
    @bar.bitmap.blt(0,0,b2,b2.rect)
    
    color = Color.new(0,0,0)
    sep.each {|x|
      @bar.bitmap.fill_rect(x,2,1,h-4,color)
    }
    
    @line = Sprite.new
    @line.bitmap = Bitmap.new(5,h+4)
    @line.bitmap.fill_rect(0,0,1,h+4,Color.new(255,0,0,55))
    @line.bitmap.fill_rect(1,0,1,h+4,Color.new(255,0,0,160))
    @line.bitmap.fill_rect(2,0,1,h+4,Color.new(255,0,0,255))
    @line.bitmap.fill_rect(3,0,1,h+4,Color.new(255,0,0,160))
    @line.bitmap.fill_rect(4,0,1,h+4,Color.new(255,0,0,55))
    @line.x = @x
    @line.y = @y - 2
    @line.z = 10000001
  end
  # ----------------------------------------------------------------------------
  def dispose
    @bar.dispose
    @line.dispose
  end
  # ----------------------------------------------------------------------------
end
#===============================================================================



Última edición por newold el 2014-10-05, 21:37, editado 3 veces
avatar
newold
Principiante
Principiante

0/3

Créditos 1232

Gracias : 119

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por FhierusIV el 2014-10-04, 15:45

Muy interesante, no se si le dare uso a este script, pero lo guardare por si se me da por incluirlo o algo xD
avatar
FhierusIV
Iniciado
Iniciado

0/3

Créditos 17

Gracias : 2

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por BlazeCrimson el 2014-10-04, 15:57

Muy interesante, el script.

La verdad me desesperé en el vídeo porque no tocaba nunca por suerte al final conseguiste la espada de bronce Smile

Yo hice algo similar con engines, pero evidentemente no me quedó tan bonito como este script.

Gracias por el aporte newold, seguro que será de utilidad gcool

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1127

Gracias : 111

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por newold el 2014-10-04, 16:00

a mi también me desesperó, antes de grabar tocaban muchos premios y justo empecé a grabar y ya no tocaba na :D, pero no había ganas de empezar a grabar otra vez :D
avatar
newold
Principiante
Principiante

0/3

Créditos 1232

Gracias : 119

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Wecoc el 2014-10-05, 01:04

Estoy viendo que utiliza una class única no default y una global como llamada. ¿Sería muy complejo modificarlo para que en vez de salir juntamente con el mensaje saliera como victory de batalla con los treasures pertenientes? Lo digo por curiosidad, soy incapaz de probarlo actualmente...
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por newold el 2014-10-05, 09:19

@Wecoc escribió:Estoy viendo que utiliza una class única no default y una global como llamada. ¿Sería muy complejo modificarlo para que en vez de salir juntamente con el mensaje saliera como victory de batalla con los treasures pertenientes? Lo digo por curiosidad, soy incapaz de probarlo actualmente...



Sería fácil de implementar aunque yo no lo voy a hacer.

El código sería más o menos así:

En la parte del script de batalla donde se entrega al jugador lo que ha ganado en la batalla, se quitaría esa parte y se llamaría al script de ruleta, que una vez configurado daría a la variable de tu elección un número que representa la posición en la que se ha parado la ruleta (el premio que has conseguido). Con ese número mediante un ifelse o un case ya determinas que cosa dar al jugador. Los objetos que se añadirían como posibles premios en la ruleta los podrías asignar mediante una lista aleatoria o dependiendo de los enemigos abatidos ya eso como quiera el scripter ;)

Algo así (en imágenes):

Antes:
Después del cambio:
avatar
newold
Principiante
Principiante

0/3

Créditos 1232

Gracias : 119

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Lena 3Up el 2014-10-05, 19:14

Excelente Scrip NewOld-san! :3, esta muy lindo y se ve divertido!, entonces tambien funciona para VxAce? :O, si es así seguro lo utilizo jijiji~
Saludos y gracias!

avatar
Lena 3Up
Principiante
Principiante

0/3

Créditos 527

Gracias : 37

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Mackton el 2014-10-06, 12:06

Muy bueno el Script. Y con imágenes y todo! Seguro que lo implemento -con los debidos creditos, obviamente- para hacer mas llamativo el "Battle Aftermath". Muy buena idea, nunca se me hubiera ocurrido!
avatar
Mackton
Principiante
Principiante

0/3

Créditos 415

Gracias : 87

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Kenshi3645 el 2015-02-10, 04:21

use el script en ACE y funciona muy bien, solo un detalle no aparecen los iconos, solo las barras de colores...
avatar
Kenshi3645
Iniciado
Iniciado

0/3

Créditos 11

Gracias : 2

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Ledai el 2015-02-10, 12:24

Oh!!! muy bueno, sin duda un aporte excelente, estoy pensando y puede que encuentre el modo de añadirlo a mi juego, pero tengo que ver dónde.. XD

De todos modos, es un trabajo muy práctico, gracias por ello!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5491

Gracias : 211

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por isaac12 el 2015-03-10, 18:11

hola soy nuevo por aqui me pregunto donde devo poner el codigo
avatar
isaac12
Novato
Novato

0/3

Créditos 97

Gracias : 4

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Kenshi3645 el 2015-03-10, 19:39

@isaac12 escribió:hola soy nuevo por aqui me pregunto donde devo poner el codigo
arriba de main en los script.
avatar
Kenshi3645
Iniciado
Iniciado

0/3

Créditos 11

Gracias : 2

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Lance Amano el 2015-06-16, 22:20

Me disculpo por el necro post pero estoy intentando usar este script y a la hora de configurar la ruleta me doy cuenta de que no puedo meter todos los datos en la ventana para llamar al script.

Basicamente necesito todo este código en la ventana como se ve en la demo:



Pero lo cuando intento escribirlo en mi projecto, sólo me alcanza para esto:

Código:
a = Roulette.new
a.set_data('',0,20,Color.new(160,0,0,100))
a.set_data('item',1,10)
a.set_data('',0,20,Color.new(160,0,0,100))
a.set_data('armor',1,35)
a.set_data('',0,20,Color.new(160,0,0,100))
a.set_data('weapon',1,10)
a.set_data('',0,20,Color.new

¿Qué puedo hacer aqui?
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Ledai el 2015-06-17, 15:02

Mételo en un condicional a ver; a mí un día me funcionó...
en el hueco que hay para pegar script del "condiciones y efectos."
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5491

Gracias : 211

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Lance Amano el 2015-06-17, 15:38

No resulta. Sólo hay espacio para una linea para llamar a scripts en las condicionales.
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por kyonides-arkanthos el 2015-06-29, 23:31

Habría que reescribir el script para que sea de un uso más práctico. El que Uds. tengan que colocar ahí el color no es algo simple ni recomendable por el espacio que se quiere.

Cabe recordar que newold todavía tiene que aprender ciertas cosas prácticas del scripting, pero supongo que solo con situaciones como esta él irá aprendiendo lo necesario para mejorar.

Hay cosas como que el método para colocar los datos sea tan genérico, serviría más que se creen métodos con nombres más fáciles de identificar. Es más, ni siquiera hay que borrar el método original sino que hay que crear otros que lo llamen.

En vez de un $roulette.set_data(todos los datos) podría ser un $roulette.weapon_data(casi todos los datos de antes menos uno).

Color debería de ser una variable de una clase o una constante si solo se utilizará dentro de un módulo. Hasta se podría ingresar como un "string" o un :symbol.

newold incluso ignora que en Ruby y su derivado el RGSS no se debe utilizar la nomenclatura de lenguajes de programación como C. No se debe llamar a un método miMetodo sino mi_metodo o mimetodo. Claro que para Uds. mientras el script funcione da igual, pero eso implica que para alguien que está acostumbrado al estilo del maker sea más difícil entender el estilo muy personal de newold o de otros.

Este es el script que lo modifica.
Código:
#  Modificaciones al Script Roulette de newold
#  por Kyonides-Arkanthos

#  Instrucciones

#  Ejemplo de cómo llamar al script desde un llamado a script de algún evento
#  ruleta = Roulette.new

#  Cuando ya hayan agregado los datos solo deben agregar lo siguiente:
#  ruleta.start

#  Para añadir un objeto
#    ruleta.item_data(id, porcentaje, color)
#  Ejemplo:  ruleta.item_data(1, 25, :negro)

#  Para añadir una arma
#    ruleta.armor_data(id, porcentaje, color)
#  Ejemplo:  ruleta.armor_data(1, 25, :negro)

#  Para añadir una pieza de armadura
#    ruleta.armor_data(id, porcentaje, color)
#  Ejemplo:  ruleta.armor_data(1, 25, :negro)

#  Para añadir algo sin especificar de qué tipo es
#    ruleta.empty_data(id, porcentaje, color)
#  Ejemplo:  ruleta.empty_data(1, 25, :negro)

#  Para agregar más colores deben modificar el contenido de RouletteSetup que
#  se encuentra justo debajo siguiendo las instrucciones disponibles.

module RouletteSetup
  COLORS = {}
  # Agregue tantos colores como guste con el siguiente formato
  # Sin Cambios de Opacidad
  #    COLORS[:color_que_desee] = Color.new(Rojo, Verde, Azul)
  # Con Cambios de Opacidad
  #    COLORS[:color_que_desee] = Color.new(Rojo, Verde, Azul, Opacidad)
  COLORS[:negro] = Color.new(0, 0, 0)
  COLORS[:blanco] = Color.new(255, 255, 255)
  COLORS[:celeste] = Color.new(192, 224, 255)
  COLORS[:amarillo] = Color.new(255, 255, 64, 255)
  COLORS[:rojo] = Color.new(255, 64, 0)
  COLORS[:raro] = Color.new(160, 0, 0, 100)
end

class Roulette
  def set_data(type, id, perc, color=nil)
    if color.is_a?(Symbol)
       color = RouletteSetup::COLORS[color]
     elsif color.nil?
       color = Color.new(rand(255),rand(255),rand(255))
     end
    @data << [type, id, perc, color]
    @perc += perc
  end

  def item_data(id, perc, color=nil) set_data('item', id, perc, color) end

  def weapon_data(id, perc, color=nil) set_data('weapon', id, perc, color) end

  def armor_data(id, perc, color=nil) set_data('armor', id, perc, color) end

  def empty_data(id, perc, color=nil) set_data('', id, perc, color) end
end

Y esto es un ejemplo de cómo tanto la vieja como la nueva forma de hacer el llamado a script incluso pueden coexistir.
Código:
a = Roulette.new
a.set_data('',0,20,Color.new(160,0,0,100))
a.set_data('item',1,10)
a.set_data('',0,20,Color.new(160,0,0,100))
a.armor_data(1, 35)
a.empty_data(0, 20, :raro)
a.set_data('weapon',1,10)
a.set_data('',0,20,Color.new(160,0,0,100))
a.start
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 517

Gracias : 79

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Lance Amano el 2015-07-08, 18:26

Unas preguntas sobre esta modificación.

- ¿Se utiliza junto con el script de newold?
- Si es así, ¿Se pone arriba o debajo de éste?
- Con el script arriba y la modificación abajo, intenté usar el ejemplo que tú nos diste.

El código sigue siendo muy grande para la ventana de call script.
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 218

Gracias : 23

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por kyonides-arkanthos el 2015-07-08, 18:52

En realidad las modificaciones de un script deben ir debajo del original. Ahí en el ejemplo mostré los llamados antiguos y nuevos, los nuevos son los más cortos. En cualquier caso yo preferiría utilizar mi script de Gem Roulette, pero como soy scripter no es la recomendación más objetiva que pueda dar, aun si tengo mis razones scripteras para preferirlo.

Realmente considero que newold tendría que remozar este script.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 517

Gracias : 79

Volver arriba Ir abajo

Re: [XP][VX][VXA]Ruleta!

Mensaje por Contenido patrocinado


Contenido patrocinado


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.