🤔 Para Refletir :
"Fazer um jogo é um ótimo aprendizado para se notar que normalmente o que é bom não é por acaso e sim fruto de muito planejamento e trabalho."
- Rafael_Sol_MAKER

Para que serve os comandos Self e draw_text no RGSS?

Estado
Tópico fechado. Não é possível fazer postagens nela.

Rayner

Cidadão
Membro
Membro
Juntou-se
26 de Junho de 2015
Postagens
63
Bravecoins
0
Boa tarde. Estou com dúvidas sobre esses comandos (sobre para que eles servem) em scripts para RPG Maker XP. (Sei que funcionam nas Engines VX e Ace, mas estou usando o XP )

Agradeço a quem puder me ajudar. Se possível, dê algum exemplo que possa ajudar um NB(claro que não é muito necessário).

Até Breve~
 
(Nessa resposta eu suponho que você tem conhecimentos básicos de Ruby e sabe o que é uma linguagem orientada a objetos.)

O self na verdade é uma keyword, que quando chamada por um método de instância retorna o objeto que está rodando aquela função. Não sei dar nenhum exemplo específico, na verdade os usos disso são tão amplos que nem dá pra exemplificar tudo. Basicamente, o self serve pra usar o objeto dentro de si mesmo da mesma forma que você usaria ele em outros lugares. Meio que assim:
Código:
class Exemplo
  def metodo()
    puts 'Olá mundo!'
  end

  def initialize
    self.metodo()
  end
end

obj = Exemplo.new #=> Olá mundo!
obj.metodo             #=> Olá mundo!

Note que o self é opcional no caso acima. Um uso mais interessante do self é declarar funções estáticas para classes, por exemplo:
Código:
class Exemplo
  def self.metodo()
    puts 'Olá mundo!'
  end
end

Exemplo.metodo() #=> Olá mundo!

O draw_text é um método exclusivo da classe Bitmap nos RGSSs, e ele, como o nome diz, serve pra escrever textos no bitmap. Nem sei que exemplo dar, você usa o draw_text quando quiser escrever texto num bitmap, ué.
A sintaxe do método comando é essa:
Código:
bitmap.draw_text(x, y, width, height, text, align = 0)

O x e y são as coordenadas onde o texto será escrito, width e height são a largura e altura máximos ocupados pelo texto, text é (suspense...) o texto que vai ser escrito e align é o alinhamento do texto (0 = esqurda, 1 = centro, 2 = direita).

Também tem um método draw_text na classe Window_Base, que basicamente chama o método draw_text do bitmap da janela. A sintaxe é a mesma.
 
Como o [member=78]Masked[/member] falou, o self. naquele exemplo é opcional. Um momento bem parecidinho em que ele não é opcional seria:

Código:
class Example
  def something()
    puts 'Olá mundo!'
  end

  def initialize
    something = 5    # Variável local `something` criada
    something  # Quem está sendo chamado aqui? A variável local ou o método acima? -- A resposta é: a variável!
    self.something # Aqui certamente é o método `something` que está sendo chamado, não a variável
  end
end



** A partir daqui fiz um leve EDIT pois reli a resposta acima e vi o self. no lugar errado na minha cabeça :v a resposta está certa, mas fica ainda assim o que havia escrito para complementar **

O uso do self para declarar métodos é bem perceptível quando se tenta adquirir algum valor do objeto. Pegando de exemplo (`<algo>.object_id` retorna o ID que Ruby deu ao <algo> - note que cada ID é única e todo objeto possui um `object_id`):

Código:
class A
  def a_method()
    p self.object_id
  end
end

A.new.a_method() # => (número "aleatório")
A.a_method() # => Erro: método indefinido `a_method`

Isso ocorre porque, na linha 7, A.new gera um objeto do tipo A, e portanto se está chamando `a_method()` do objeto recém criado, enquanto que na linha 8 estou `A` é uma classe, e quando se faz `Classe.método` o Ruby procura por "método" dentro dos métodos estáticos daquela classe (i.e. pelos métodos definidos como "def self.método").

O que tem um comportamento diferente de:

Código:
class A
  def self.a_method()
    p self.object_id
  end
end

A.new.a_method() # => Erro: método não definido: `a_method`
A.a_method() # => Não chega aqui por conta do erro acima, mas se chegasse, rodaria OK

Aqui o erro acontece em `A.new.a_method()` por conta de que agora `a_method` é estático, ou seja, é um método da classe A mas não um método dos objetos do tipo A, enquanto que Ruby está procurando métodos do objeto `A.new`.



Se quiser um exemplo do `draw_text`, coloque este script acima do main:

Código:
class MyBitmap < Sprite

  def initialize
    self.bitmap = Bitmap.new(640, 480)
    @value = 0
    refresh
  end

  def refresh
    self.bitmap.clear
    self.bitmap.fill_rect(self.bitmap.rect, Color.new(0, 0, 64)) # Preenche o fundo com azul escuro
    # Escreve um texto centralizado
    self.bitmap.draw_text(320, 240, 640, 32, "MyBitmap.value = #{@value}", 1)
    # Escreve um texto nas coordenadas (4, 4)
    self.bitmap.draw_text(4, 4, 128, 32, "Um texto =)")
  end

  def value=(value)
    @value = value
    refresh
  end

  def value
    return @value
  end
end

class Scene_Texts
  def main
    bitmap = MyBitmap.new
    Graphics.transition
    while $scene == self
        Input.update
        Graphics.update
        if Input.repeat?(Input::LEFT)
          bitmap.value -= 1
        elsif Input.repeat?(Input::RIGHT)
          bitmap.value += 1
        end
        bitmap.update
    end
  end
end

E use o comando de evento "Chamar Script" para chamar:

Código:
$scene = Scene_Texts.new

Não testei pois estou sem o maker, mas deve funcionar.
 
Masked comentou:
(Nessa resposta eu suponho que você tem conhecimentos básicos de Ruby e sabe o que é uma linguagem orientada a objetos.)

O self na verdade é uma keyword, que quando chamada por um método de instância retorna o objeto que está rodando aquela função. Não sei dar nenhum exemplo específico, na verdade os usos disso são tão amplos que nem dá pra exemplificar tudo. Basicamente, o self serve pra usar o objeto dentro de si mesmo da mesma forma que você usaria ele em outros lugares. Meio que assim:
Código:
class Exemplo
  def metodo()
    puts 'Olá mundo!'
  end

  def initialize
    self.metodo()
  end
end

obj = Exemplo.new #=> Olá mundo!
obj.metodo             #=> Olá mundo!

Note que o self é opcional no caso acima. Um uso mais interessante do self é declarar funções estáticas para classes, por exemplo:
Código:
class Exemplo
  def self.metodo()
    puts 'Olá mundo!'
  end
end

Exemplo.metodo() #=> Olá mundo!

O draw_text é um método exclusivo da classe Bitmap nos RGSSs, e ele, como o nome diz, serve pra escrever textos no bitmap. Nem sei que exemplo dar, você usa o draw_text quando quiser escrever texto num bitmap, ué.
A sintaxe do método comando é essa:
Código:
bitmap.draw_text(x, y, width, height, text, align = 0)

O x e y são as coordenadas onde o texto será escrito, width e height são a largura e altura máximos ocupados pelo texto, text é (suspense...) o texto que vai ser escrito e align é o alinhamento do texto (0 = esqurda, 1 = centro, 2 = direita).

Também tem um método draw_text na classe Window_Base, que basicamente chama o método draw_text do bitmap da janela. A sintaxe é a mesma.

Alucard_2 comentou:
Como o [member=78]Masked[/member] falou, o self. naquele exemplo é opcional. Um momento bem parecidinho em que ele não é opcional seria:

Código:
class Example
  def something()
    puts 'Olá mundo!'
  end

  def initialize
    something = 5    # Variável local `something` criada
    something  # Quem está sendo chamado aqui? A variável local ou o método acima? -- A resposta é: a variável!
    self.something # Aqui certamente é o método `something` que está sendo chamado, não a variável
  end
end



** A partir daqui fiz um leve EDIT pois reli a resposta acima e vi o self. no lugar errado na minha cabeça :v a resposta está certa, mas fica ainda assim o que havia escrito para complementar **

O uso do self para declarar métodos é bem perceptível quando se tenta adquirir algum valor do objeto. Pegando de exemplo (`<algo>.object_id` retorna o ID que Ruby deu ao <algo> - note que cada ID é única e todo objeto possui um `object_id`):

Código:
class A
  def a_method()
    p self.object_id
  end
end

A.new.a_method() # => (número "aleatório")
A.a_method() # => Erro: método indefinido `a_method`

Isso ocorre porque, na linha 7, A.new gera um objeto do tipo A, e portanto se está chamando `a_method()` do objeto recém criado, enquanto que na linha 8 estou `A` é uma classe, e quando se faz `Classe.método` o Ruby procura por "método" dentro dos métodos estáticos daquela classe (i.e. pelos métodos definidos como "def self.método").

O que tem um comportamento diferente de:

Código:
class A
  def self.a_method()
    p self.object_id
  end
end

A.new.a_method() # => Erro: método não definido: `a_method`
A.a_method() # => Não chega aqui por conta do erro acima, mas se chegasse, rodaria OK

Aqui o erro acontece em `A.new.a_method()` por conta de que agora `a_method` é estático, ou seja, é um método da classe A mas não um método dos objetos do tipo A, enquanto que Ruby está procurando métodos do objeto `A.new`.



Se quiser um exemplo do `draw_text`, coloque este script acima do main:

Código:
class MyBitmap < Sprite

  def initialize
    self.bitmap = Bitmap.new(640, 480)
    @value = 0
    refresh
  end

  def refresh
    self.bitmap.clear
    self.bitmap.fill_rect(self.bitmap.rect, Color.new(0, 0, 64)) # Preenche o fundo com azul escuro
    # Escreve um texto centralizado
    self.bitmap.draw_text(320, 240, 640, 32, "MyBitmap.value = #{@value}", 1)
    # Escreve um texto nas coordenadas (4, 4)
    self.bitmap.draw_text(4, 4, 128, 32, "Um texto =)")
  end

  def value=(value)
    @value = value
    refresh
  end

  def value
    return @value
  end
end

class Scene_Texts
  def main
    bitmap = MyBitmap.new
    Graphics.transition
    while $scene == self
        Input.update
        Graphics.update
        if Input.repeat?(Input::LEFT)
          bitmap.value -= 1
        elsif Input.repeat?(Input::RIGHT)
          bitmap.value += 1
        end
        bitmap.update
    end
  end
end

E use o comando de evento "Chamar Script" para chamar:

Código:
$scene = Scene_Texts.new

Não testei pois estou sem o maker, mas deve funcionar.

Ahh, valeu!! Agora sim eu entendi.

(Nessa resposta eu suponho que você tem conhecimentos básicos de Ruby e sabe o que é uma linguagem orientada a objetos.)

Sei sim. ;D

Não testei pois estou sem o maker, mas deve funcionar.

Não funcionou não. Deu: "Erro no Script Exemplo, em 4 na linha 'RGSSError' disposed sprite.
 
[member=97]Rayner[/member]: O Alucard esqueceu de chamar o initialize da classe Sprite, só coloca um 'super' logo depois do 'def initialize' que deve funcionar.
 
Estado
Tópico fechado. Não é possível fazer postagens nela.
Voltar
Topo Inferior