A senha para algo que não faço ideia do que seja: senhade25caracteres
Aula Ativa de Javascript/Ruby/RGSS
[box class=titlebg]
Como funciona o tópico?
[/box]
É bem simples, esse tópico serve para funcionar como um bate-bola, bem mais rápido e simples de perguntar e ser respondido quando a pergunta não é especifico de um script. Pergunte sobre a linguagem Javascript, Ruby, sobre outras linguagens diversas, ou sobre algo do RGSS, caso seja algo da biblioteca(RGSS), indique a engine ou a versão do RGSS que está fazendo a sua pergunta, na dúvida sempre indique a engine que está usando.
[box class=titlebg]
Exemplo de pedido
[/box]
Engine: RMVX Ace
Explicação: Eu não estou conseguindo colocar constantes dentro do módulo, não sei oque estou fazendo de errado.
Código exemplo:
module Rai
constante = 2
end
código para quem quiser usar o template de dúvidas
Engine:
Explicação:
Código exemplo:
[code][/code]
Engine: RMXP
Explicação: Estou usando o chamar script para igualar uma variável a outras duas variáveis subtraidas
Código exemplo:
[$Game_Variables[6] = $Game_Variables[2] - $Game_Variables[4]
mas isso ai está certo xD.
tipo:
Chamar Script:
$game_variables[6] = $game_variables[4] - $game_variables[2]
Opa, estou tentando aprender um pouco de RGSS3 acompanhando as aulas do Khas, porem naaula quatro to tendo um problema que é o seguinte, o script tá assim:
class Teste
def intialize
@x = 10
end
def comparar
if @x == 10
p "@x é igual a10"
else
p "erro"
end
end
end
teste = Teste.new
teste.comparar
O problema é que, tá printado "erro", mas é pra printar "@x é igual a10"
Como to começando agora, não entendo oque eu fiz de errado, então vim pedir ajuda. Obrigado.
Poderia falar qual é o erro?
EDIT: O probelma é que você escreveu "initialize" errado, então a variável @x não é 10, escreva o initialize corretamente, que irá funcionar.
Você escreveu
def intialize
falta o i xD.
def initialize
Oh wait, Danka editou a mensagem u__u
else
p "erro"
end
ta printando "erro", mais era pra printar "erro" apenas se "@x" não fosse igual a 10, mas mesmo sendo igual a 10 ta printando, querai saber se errei em alguma parte do codigo
#edit: é mesmo, obrigado.
nossa velho, eu tentei achar o problema varias veze e nao percebi isso, obrigadao Danka e Raizen
Você errou no "def intialize" se escreve "def initialize".
Escreva o nome do metódo corretamente que vai funcionar.
Ele editou a mensagem. xD
Gente bom antes de tudo Boa Noite !
Bom galera eu começei a aprender a linguagem Ruby faz um dia e to com um problema em um script irei postalo e queria saber se você poderia mi ajudar to ficando doico com ele :aiaiai:
Bom aqui o Script:
class Teste
def q
end
end
var = " Variavel Local"
@var = " Variavel de Classe"
$var= " Variavel Global"
def q
print @var
print $var
end
teste = Teste.new
teste.q
Bom o que eu quero com esse script é basicamente que ele printe na tela as seguintes fazes:
" Variavel Local
Variavel de Classe
Variavel Global"
que são referentes ao (var, @var, $var citados acima no script).
Espero que vocês possam me ajudar to ficando doido com isso !
Desde já agradeço !
Ai meus olhos. Ò_Ó -zoa
Ele está todo errado, primeiro, você poderia ter utilizado o "def q" antes, não precisava "abrir ele novamente". E você abriu ele fora da classe "Teste".
Também errou um sinal ($var= "Variável Global", o certo seria $var = "Variável Global")
Faça isso, crie um metódo onde guarda a informação, e o chame de "initialize" ele é automatico, e é ativado assim que o script é chamado.
E no def q, use o "print (nome da variável)"
Vê se funciona.
Aaa cara valeu pela ajudinha basica rsrsrs.. mas é qui to nisso faz 1 dia só da um descontinho kkkk
Ai eu fiz como você falou e deu certim :D... vlw pela ajudinha meu irmãosinho s2 kkk zua
Galera da uma ajudinha aqui to com uma duvida... o que tem de errado nesse script de pulo basico.
class Game_Player < Game_Character
alias xaspim_update update
def update
xaspim_update
if Input.trigger?(:X)#: confirma = C, A=X, S=y, Z=d
jump_by_input if passable?(@x, @y, @direction)
end
end
def jump_by_input
case @direction
when 2 # Baixo
jump (0,1)
when 4 # Esquerda
jump (-1,0)
when 6 # Direita
jump (1,0)
when 8 # Cima
jump (0,-1)
end
end
end
eu procurei mas não achei :S.. ele da erro na linha 12
Só um erro, não de espaço entre o método e o "(" dos parâmetros.
então jump(1,0) por exemplo.
haha obrigado Raizen, mas me diga uma coisa, por que não pode ter espaço entre o jump e o (,) só uma mini duvida :), mas vlw !
é porque são as regras :P... nem zoa é assim.
O Ruby para simplificar ele, fizeram com que espaço e linhas puladas tivessem significância, então quando você pula uma linha em algumas outras linguagens é obrigatório por exemplo colocar o ; para indicar que pulou, no Ruby não, basta pular a linha, espaço é a mesma coisa, o método tem que estar tudo junto, todas as letras e os parâmetros, basta ver, não da para criar um método tipo..
def esse eh um metodo
eles não podem estar separados, e o () tem que estar junto quando se cria o método, def jump(x, y), então quando eu vou chamar o método ele também tem que estar junto :P, jump(1, 2).
Há, eu esqueci de falar algo, acho que vai ser bem útil para você.
Por exemplo, se você abrir um metódo, que já existia, tudo que tinha antes é apagado, para dar espaço para os novos comandos. Para adcionar comandos para um metódo existente use o "alias". Digite o nome do metódo e o novo nome dele, chame ele normal, adicione os novos comandos e depois chame o "novo" nome dele.
Acho que expliquei direito. ou não. -q
Desculpe se isto seria ressucitar tópico, eu não sei ao certo, pois este tópico é aberto para o povo ir tirando as dúvidas, então ressucitei POASKOPAKS.
Engine: RMVX Ace
Explicação: Eu queria saber que código posso usar para aparecer um texto exibindo o valor de uma variável na tela, só que o fundo dele tem de ser transparente.
Código exemplo:
e.e
Você pode reviver qualquer tópico que achar que deve reviver :P, não tem problema algum isso no fórum.
Ah cara, tem vários modos de fazer, xD, você pode fazer com window também, ai basta tirar o opacity do fundo dele, mas ai depende MUITO do que pretende fazer, o jeito que está pedindo, talvez seja mais fácil desse modo aqui.
@var = Sprite.new
@var.bitmap = Bitmap.new(100, 100)
@var.bitmap.draw_text(0, 0, 100, 100, $game_variables[n])
Substitua n pelo número da variável.
Mas isso se estiver usando para um script, não sei exatamente aonde usará isso, diga aonde será usado que talvez tenha outro modo mais fácil x]
É para aparecer um relógio indicando as 2 Variáveis (Hora e Minuto) Mas como não saco tanto de RGSS3 vim pedir ajuda aqui huahuah
EDIT:
Aí ficaria assim: variável 1:variável 2
Teria como? Para eu por lá em scripts.
vc não quer um script pronto para isso xD?
Ressucitando novamente esse tópico, mas acho que esse não tem problema e.e'
Engine: RMVXA
Explicação: Estou aprendendo RGSS3, e depois de estudar um pouquinho vi o vídeo do Faalco, fiz a HUD, adaptei ao meu gosto e queria por uma imagem no lugar da barra pronta do VX Ace
Código exemplo (Script da HUD):
############################################################################
#~ HUD By Koelho
#~ Credits: Faalco (by the video-tutorial)
###########################################################################
class Window_HUD < Window_Base
def initialize
super(0, 0, 150, 120)
@actor = $game_party.members[0] #Personagem da Party
refresh
end
def refresh
self.contents.clear
draw_actor_name(@actor, 0, 0) #Desenhar Nome
#draw_actor_face(@actor, 0, 0) #Desenhar Face
draw_actor_hp(@actor, 0, 30) #Desenhar HP
draw_actor_mp(@actor, 0, 60) #Desenhar MP
end
end
class Scene_Map
alias koelho_main main
alias koelho_update update
def main
@hud = Window_HUD.new
koelho_main
@hud.dispose
end
def update
koelho_update
@hud.update
@hud.refresh
end
end
Duvida "bésta", Ruby e RGSS são parecidos? tipo eu posso aprender algo útil para o RGSS3 lendo ruby? ou são linguagens totalmente diferentes?
O RGSS é uma aplicação feita em Ruby. É como o jQuery para Javascript ou Swing para Java. Se você aprender o Ruby será infinitamente mais fácil aprender o RGSS, pois entenderá por completo o que rola no mesmo.
Fora que ao aprender Ruby, entenderá melhor não só o RGSS, mas o Rails (aplicação Web em Ruby) ou Shoes (aplicação Desktop), e por aí vai. ;)
Olá, este tópico é sobre RGSS.
Pergunto àqueles que já fizeram ou entendem menus personalizados. Gostaria de saber se há como aumentar a velocidade do movimento do background.
A intenção é que 2 imagens Plane.new que fiquem se movimentando no fundo enquanto outros movimentos possam ser feitos no menu. Fiz um script para exemplificar a dúvida:
class Movimento
def main
@background = Plane.new
@background_name = "op1zn0"
@background2 = Plane.new
@background2_name = "op1zn0"
@background.bitmap = RPG::Cache.picture(@background_name)
@background.blend_type = 0
@background2.bitmap = RPG::Cache.picture(@background2_name)
@background2.blend_type = 0
@background2.opacity = 60
@x = 2
update
end
def update
#É do Plane.new e faz a imagem repetir na tela
@background.oy += 30
@background.ox += 30
@background2.oy += 30
@background2.ox -= 30
@x += 1
end
end
Então como podem ver, neste script as duas imagens se movimentam sim, mas de forma lenta.
- Como aumentar a velocidade do movimento?
- Vocês costumam utilizar esta lógica ao fazer um background em movimento no menu? Digo, como fazem para que ocorra um loop contínuo e de forma que ainda seja possível fornecer as interfaces dos menus?
Na realidade a intenção é fazer uma Scene que não necessariamente será um menu mas terá uma interatividade semelhante, e está questão do background é que fiquei em duvida no momento.
Obrigado,
tentou @background.x +....
e background.y+...?
E sim o Plane, eh a classe que já vem pré-configurado loopings não? se sim então porque não usa-lo rs :), cria uma classe ativa em paralelo para o menu, e o Plane executando por uma variável, como você fez no script, isso deveria deixar o fundo se movimentando enquanto você programa o menu, mas eu iria inserir esses background direto na classe do Menu que vai criar, bem mais fácil de manipular de lá.
Citação de: Raizen online 14/11/2013 às 15:25
tentou @background.x +....
e background.y+...?
Então, mas utilizando somente o "y" e o "x" eles se referem a coordenadas para deixa-la estática não é? E no caso, quando coloco elas acaba dando erro pois fala que para utilizar elas eu teria que declarar as variaveis como Sprite.new ao invés de Plane.new... Mas o background precisa ser Plane.new pelo fato da necessidade que a imagem se repita ao chegar aos extremos da borda.
Citação de: Raizen online 14/11/2013 às 15:25
E sim o Plane, eh a classe que já vem pré-configurado loopings não? se sim então porque não usa-lo rs :), cria uma classe ativa em paralelo para o menu, e o Plane executando por uma variável, como você fez no script, isso deveria deixar o fundo se movimentando enquanto você programa o menu, mas eu iria inserir esses background direto na classe do Menu que vai criar, bem mais fácil de manipular de lá.
Quanto esta parte, beleza! entendi, muito obrigado.
@Então, tem como aumentar a velocidade dos plane?
O membro Gab! conseguiu, quem estiver curioso:
class Movimento
def main
@background = Plane.new
@background_name = "op1zn0"
@background2 = Plane.new
@background2_name = "op1zn0"
@background.bitmap = RPG::Cache.picture(@background_name)
@background.blend_type = 0
@background2.bitmap = RPG::Cache.picture(@background2_name)
@background2.blend_type = 0
@background2.opacity = 60
@x = 2
Graphics.transition(20)
loop do
Graphics.update
update
end
end
def update
@background.oy += 30
@background.ox += 30
@background2.oy += 30
@background2.ox -= 30
@x += 1
end
end
link: http://forums.mundorpgmaker.com.br/index.php?topic=116807.0
Engine: RPG Maker VX Ace
Explicação: Como que eu crio tipo assim, um processo que carrega, os arquivos que estão dentro de uma array, e faço eles aparecerem em um menu ai eles podem ser selecionados, tipo no pokemon na seleção de windowskins, só que ai aprecece, o um numero, de acordo com a ordem em que está na array, e tambem como colocar uma palavra (titulo/tópico) no menu (esse menu não é menu menu é menu tipo menu item, menu status).
Ai eu não sei o processo, que carrega elas na pasta em que está, não sei o processo que faz ela poder ser escolhida durante o jogo, e não sei como criar uma window_selectable.
Código exemplo:
FontIndex = ["Verdana","Adobe Arabic","Segoe UI"] # Fontes que poderam ser selecionadas no menu
Boa noite, amigos.
Preferi postar aqui do que reviver o tópico da aula do Raizen, afinal.
Cheguei no ponto onde ele mostra o seguinte script:
def somar(x, y)
soma = x + y
p soma
end
somar(2, 4)
somar(3, 3)
X e Y são variáveis, certo? Eu atribuo os valores 2, 4 e 3, 3 ali no fim.
Sabendo disso, imaginei que num script essas variáveis talvez fossem definidas por um outro método, e tentei simular isso com o seguinte código:
x = 2
y = 3
def somar(x, y)
soma = x + y
p soma
end
Bom, deu errado, mas eu não consigo entender o motivo. Mesmo.
Estou estudando Ruby há poucas horas e talvez eu descubra o motivo disso estar errado em breve, mas fiquei encucado. Não posso setar essas variáveis assim?
@Van
Existe uma diferença entre "Declaração" e "Chamada de método".
No caso, em:
def soma(x, y)
soma = x + y
p soma
end
Você está Declarando que existe um método soma que exige 2 parâmetros, que, dentro do método, irão se chamar "x" e "y" respectivamente. Logo eu posso colocar qualquer variável como parâmetro, até mesmo "números puros", assim digamos, como você fez com 2 e 4, 3 e 3.
Agora quando você executa:
soma(2, 4)
Você está chamando o método "soma", e enviando "2" como primeiro parâmetro, e "4" como segundo parâmetro, e dentro do método elas irão se chamar "x" e "y" respectivamente, mas fora do método as variáveis "x" e "y" simplesmente não existem, ou seja, o que está no método é independente do que está fora dele (a menos que trate-se de variáveis de classe/globais - i.e. com @ e $ no início).
Ou seja, eu posso livremente fazer:
soma(x, y)
soma = x + y
p x # => irá printar o primeiro valor passado como parâmetro
p soma
end
mostarda = 2
vinagre = 3
soma(mostarda, vinagre) # mostarda, no método, será x, e vinagre será y
p x # => nil, pois não existe variável x.
x = 4
y = 3
soma(x, y) # x, no método, será x, e y será y
soma(y, x) # y, no método, será x, e x será y
Ou ainda:
x = 2
y = 4
p x # => 2
def soma(x, y)
x = 4 # => x do método será 4, x fora dele continuará 2
p x # => 4
soma = x + y
p soma
end
p x # => 2
Ou seja, a variável é uma coisa, um parâmetro no método é outra.
No seu caso, não funcionou pois você simplesmente declarou as variáveis, declarou o método, mas não chamou ele.
Logo, basta adicionar a chamada dele ao fim:
x = 2
y = 3
def soma(x, y)
soma = x + y
p soma
end
soma(x, y)
Rapaz, muito obrigado!
Agora sim faz sentido, eu devia ter imaginado que "def" significaria "definir".
Esse X e Y serão, por padrão, variáveis locais, certo?
O que você chamou de parâmetro (2, 4 no caso) são nada mais que variáveis existentes apenas dentro desse método. Se eu quiser que elas sejam setadas por outro script eu terei que deixar
def soma(x, y)
soma = x + y
p soma
end
soma($variavel_a, $variavel_b)
Ou estou falando bobagens?
Well, como posso dizer...
A questão do que o $ vai alterar se refere mais a, em palavras simples, "onde a variável existe". I.e.:
class Classe
def initialize
$var = 5
@var = 10
var = 15
end
def algo
p $var # => 5
p @var # => 10
p var # => nil
end
end
p $var # => 5
p @var # => nil
p var # => nil
Perceba que $var existe em todo lugar, dentro ou fora de classes ou métodos (mesmo que declarada dentro da classe), e alterando ela, essa alteração acontece em todos os $var. Chamamos esse tipo de variável de "global".
Agora @var foi declarada na classe "Classe". Logo ela vai existir apenas dentro dessa classe, e não fora dela. E alterando o valor de @var, essa alteração acontece para todos os @var dentro da classe "Classe". Chamamos esse tipo de variável de "atributo".
E por fim var foi declarada dentro de um método, e portanto só vai existir dentro dele. Alterando o valor de var vai alterar apenas dentro do método, mas não fora. Chamamos esse tipo de variável de "local".
No caso, usando soma($variavel_a, $variavel_b) irá enviar os valores de $variavel_a e $variavel_b para serem usados como x e y em "soma". Porém elas precisam ser já declaradas antes, do contrário você vai enviar "nil" como x e y, e logo dará erro em "soma = x + y" por conta de tentar somar dois "nil"s.
Se você quiser utilizar o resultado da soma, por exemplo, precisaria de um "return soma" no final do método, e assumir a uma variável. E.g:
def soma(x, y)
soma = x + y
p soma
return soma
end
var = soma(3, 2)
p var # => 5
val1 = 10
val2 = 4
var = soma(val1, val2)
p var # => 14
p val1 # => 10
p val2 # => 4
$val1 = 1
$val2 = 2
$var = soma($val1, $val2)
p $var # => 3
p $val1 # => 1
p $val2 # => 2
Tente testar cada um dos {code}{/code} que deixei nesta e na outra mensagem e ver as diferentes "reações" que o script possui. Se você quiser, no caso, utilizar os valores de x e y globalmente, pode fazer algo como:
def soma(x, y)
soma = x + y
$x = x
$y = y
p soma
end
p $x # => nil
p $y # => nil
soma(3, 2)
p $x # => 3
p $y # => 2
Sugestão de leitura: https://www.youtube.com/watch?v=Gah8FnYSypk&list=TLO-4ET0PK3ck&index=5
Como o Raizen não quer que eu encha o saco dele no Facebook, vou postar aqui.
Queria saber porquê a HUD não aparece na tela.
class Lincoln < Scene_Base
include LINCOLN_HUD
alias lincoln_update update
alias lincoln_update dispose
def initialize
@hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
@hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
@hud_hp = Sprite.new(@hud_hp)
@hud_hp.z = 999
@hud_mp.z = 999
end
def lincoln_update
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
super
end
end
Well, comecemos então.
Primeiro:
alias lincoln_update update
#[...]
def lincoln_update
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
super
end
Aqui você copiou o método "update" para "lincoln_update", e depois reescreveu o lincoln_update, ou seja...é como se não tivesse feito nada, o "update" continua intacto. A ideia é fazer:
alias lincoln_update update
#[...]
def update # reescrever o "update", não o "lincoln_update"
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
lincoln_update # chamar o lincoln_update, que seria o "update" original
end
Outro detalhe é que para uma Sprite ser exibida (e atualizada), precisa chamar o método "update" delas. Portanto o def update fica:
def update # reescrever o "update", não o "lincoln_update"
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
@hud_hp.update
lincoln_update # chamar o lincoln_update, que seria o "update" original
end
Agora, se pensarmos bem, você está criando a classe Lincoln, certo? No sentido de que não existia uma outra classe de mesmo nome antes, logo, não faz sentido dar um alias, já que não está substituindo algo que já havia sido criado numa classe Lincoln, só está sobrescrevendo algo da classe-Pai (Scene_Base) dela, certo? Então, em vez de criar aliases, pode só chamar "super" no final do método. O "super" vai chamar o mesmo método na classe-Pai. Assim:
class Lincoln < Scene_Base
include LINCOLN_HUD
def initialize
@hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
@hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
@hud_hp = Sprite.new(@hud_hp)
@hud_hp.z = 999
@hud_mp.z = 999
super # chama o initialize da Scene_Base
end
def update
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
@hud_hp.update
super # chama o update da Scene_Base
end
def dispose
super # chama o dispose da Scene_Base
end
end
Creio que agora deva funcionar.
Complemento 1: Lembre-se de sempre limpar o bitmap, para que ele não fique com o conteúdo da última atualização (no caso, em um frame o HP do herói era 18, um frame depois ele ficou com 6, e em seguida 9. Assim, a sua janela escreveria o 18, e, com ele ainda ali, escreveria um 6 e um 9 em cima). Ou seja, seu método update deve ser:
def update
@hud_hp.bitmap.clear
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
@hud_hp.update
super # chama o update da Scene_Base
end
Complemento 2: evite escrever textos a cada frame. Faça alguma comparação, como...
def update
if @ultimo_hp != $game_party.members[1].hp # mudou o HP?
@hud_hp.bitmap.clear
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
end
@ultimo_hp = $game_party.members[1].hp # Atualiza o último valor do HP
@hud_hp.update
super # chama o update da Scene_Base
end
Complemento 3: É $game_party.members, não $game_party_members ;) No caso, $game_party é a variável da classe Game_Party, e nessa variável existe um grupo chamado "members".
Perguntinha: você chamou SceneManager.call(Lincoln) para testar a sua Scene?
Off: eu me pergunto se o Van viu (hah, "vanviu") meu post :v Ah, deve ter sido ele quem deu ouro.
@Alucard_2
Pior que não deu certo não, a hud continua sem aparecer. Eu já tentei chamar usando Lincoln.new, e usando SceneManager.call(Lincoln), nenhum dos dois funciona.
module LINCOLN_HUD
# Posição X da Hud
HUD_X = 200
# Posição Y da Hud
HUD_Y = 50
# Largura da Hud
HUD_WIDTH = 110
# Altura da Hud
HUD_HEIGHT = 110
# Posição do X do HP
HP_X = 210
# Posição do Y do HP
HP_Y = 60
# Posição X do MP
MP_X = 110
# Posição Y do MP
MP_Y = 100
end
#==============================================================================
# ** Lincoln
#------------------------------------------------------------------------------
# Esta classe gerencia a criação, atualização e disposição da Hud.
#==============================================================================
class Lincoln < Scene_Base
include LINCOLN_HUD
def initialize
@hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"#{$game_party.members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"#{$game_party.members[1].mp}")
@hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
@hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
@hud_hp = Sprite.new(@hud_hp)
@hud_mp = Sprite.new(@hud_mp)
@hud_hp.z = 999
@hud_mp.z = 999
super # chama o initialize da Scene_Base
end
def update
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"#{$game_party_members[1].hp}")
@hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"#{$game_party.members[1].mp}")
@hud_hp.update
super # chama o update da Scene_Base
end
def dispose
super # chama o dispose da Scene_Base
end
end
Lincoln.new
Te enviei o script por completo.
E o script agora está dando erro, $game_party.members[1].hp não é correto, vou ver se encontro a variável correta xD
Citação de: Alucard_2 online 09/01/2015 às 11:53
Off: eu me pergunto se o Van viu (hah, "vanviu") meu post :v Ah, deve ter sido ele quem deu ouro.
Fui eu. :V
well, essa classe nao pode ser chamada logo depois de ser criada, pois os dados ainda nao foram criados ($game_party, por exemplo), chame o SceneManager.call por um evento no mapa.
Pergunta...Pra que serve o: seiquela.each { |sql| seiquela}
?
Do jeito como descreveu, acho que serve bem demais pra dar bug. Poréeeeeeem, por exemplo:
números = [ 2, 4, 6]
a = números.each { |n| 5 * n}
O método each faz com que cada valor da array números seja executado na expressão entre as chaves.
Ou seja, todos os valores contidos em números ocupará o lugar de n e será multiplicado por 5, sendo assim:
a = [10, 20, 30]
Eu acho que é isso, não tenho absoluta certeza.
Tá mais ou menos certo, king, isso aí é o .collect quem faz, o .each executa um bloco de código pra cada elemento de uma coleção e o .collect transforma eles de acordo com o retorno do bloco:
a = [2, 3, 4]
a.each {|i| print i} #=> 234
p a.collect {|i| i * 5} #=> [10, 15, 20]
Então o collect tem a mesma função de:
for i in a
p i * 5
end #=> ?
Não. O .collect retorna uma nova array com os valores retornados pelo bloco para cada elemento antigo, serve para pegar os ids de todos os personagens numa array de personagens, tente chamar um script call assim, por exemplo:
p $game_party.members.collect {|actor| actor.id}
Seria o equivalente a isso:
a = []
for actor in $game_party.members
a.push(actor.id)
end
p a
O que você fez aí é o .each, na verdade o que o for faz é chamar o .each internamente mesmo.
Pergunta: Quero que quando o herói fique parado por certo tempo aconteça certa coisa... Mas não sei como fazer-lo esperar...? Já tentei o
@wait = 0
@wait += 1 if @wait <= Tempo
@wait = 0 if @wait == Tempo
como faço?
Um dos jeitos para se fazer isso, é basicamente o que você está fazendo mesmo, mas você não pode deixar o @wait = 0 acima do @wait += 1, é meio redundante você ficar zerando a variável antes de somar ela x).
E depende de onde está colocando esse código, se tiver como mostrar o trecho do código com um pouco mais do que você colocou x).
Vlw, mas já consegui: Zerei o @wait logo no initialize, então não precisa mais de zera-lo toda hora xD...
Gente, alguém pode me explicar para o que serve o comando "attr_acessor" e por quê ele não funciona no meu IR de maneira nenhuma? Todos os tutoriais que vi citam que é esse o comando que deve ser usado para se atribuir caracteristicas as classes, mas acho que talvez ele tenha sido retirado/substituído nas versões mais recentes do Ruby (?)
É uma questão idiota, de quem não entende nada de programação, mas se alguém pudesse me explicar ficaria agradecido.
deveria funcionar x).
mande um trecho de como está fazendo essa parte do código ai a gente vê o que pode estar faltando...
E outra, você tá usando isso em que programa xD? RPG Maker...? já que você disse IR e eu mesmo desconheço o que seja ^^
@Watanukiz
Fica difícil saber o que está errado se não sabemos nem como usou =T Poderia postar seu código?
E aliás, o que seria IR?
Isso aqui ta funcionando ? posso fazer perguntas por aqui ainda ?
Sim, desculpe a demora, se ainda tiver perguntas sobre isso só mandar, também generalizei mais o tópico para quem quiser perguntar de outras linguagens de programação
Engine: RMVX Ace
Explicação: Gostaria de saber se existe a possibilidade de redimensionar janelas (Window_Selectable, Window_Base, etc ), a um tamanho perfeito ao conteúdo que ela vai conter de forma "automática", ou seja, quando instanciar a janela atribuir valores arbitrários e após adicionar o conteúdo à janela, alterá-la de forma a se ajustar ao conteúdo inserido.
Por exemplo primeiro é necessário instanciar.
Até o momento minha solução "gambiarrosa" funciona para quantidade de linhas que a janela conterá.
Eu crio uma janela dummy, uma janela qualquer só para que eu possar acessar o método fitting_height, em seguida utilizo o
esse método passando o valor 2, para que ele calcule a altura ideal da janela para duas linhas (minha Window_Selectable, conterá duas opções). Não consigo fazer nada semelhante para a largura da janela.
Então.. Gostaria de saber se tem uma solução mais elegante, e que funcione também pra largura da janela.
Só mais um acréscimo, já vi que existem diversos scripts de caixa de mensagem, principalmente os que alteram a caixa de texto padrão para uma no estilo "balãozinho" que isso é bem evidente, o tamanho dela se ajusta ao conteúdo que contém, basicamente essa é minha dúvida, se tem como fazer isso de forma simples individual para as janelas de meu interesse.
Código exemplo1: Scene para teste
#Criei uma scene para teste, em que:
class Planting_Scene < Scene_Base
def start
super
#`Para adicionar um fundo à scene:
@background = Sprite.new #Cria-se um novo sprite
@background.bitmap = SceneManager.background_bitmap #Extrai o fundo da Scene
dummy_window = Window_Base.new(0,0,0,0)
vertical_content_height = dummy_window.fitting_height(2)
@planting_selectable = Planting_Selectable.new( 0 , 0,
320, vertical_content_height )
end
end
Window Selectable:
class Planting_Selectable < Window_Selectable
def initialize( x, y , width , height )
self.create_commands_list()
super
self.fitting_height( 2 )
self.update()
self.draw_commands()
#Ativa a janela para que seja utilizada
self.activate()
#Faz o cursor aparecer na primeira opção da janela
self.select( 0 )
end
#O método update das janelas é chamado em todas as scenes
def update
super
#Se o botão de decisão for pressionado e a janela estiver ativa
if Input.trigger?(:C) && self.active
Sound.play_ok
chosen_option = @list[ self.index() ]
run_option( chosen_option)
end
end
def create_commands_list()
@list = []
commands = ["Plantar", "Sair"]
for i in 0...commands.size
@list.push( commands[i] )
end
end
def draw_commands()
for i in 0...@list.size
#Cria um retângulo com o tamanho e posição correto para desenhar o texto
# do comando
rect = self.item_rect(i)
#Desenha no rect o comando de @list[i]
self.draw_text( rect , @list[i] )
end
end #draw_commands()
def item_max
#Se a lista não foi instanciada, retorna 0
if @list.nil?
return 0
else
#Senão, retorna o tamanho da lista
return @list.size
end
end #item_max
def run_option( chosen_option )
case chosen_option
when "Plantar"
msgbox("Opção escolhida foi Plantar")
when "Sair"
SceneManager.return
end
end
end #class
Segue em anexo imagem com o resultado.
Pois bem essas são minhas dúvidas. Esses código foram baseado nas aulas de Ruby do Alisson de Window_Selectable, portanto muito obrigado Alisson! Já aprendi algumas coisas :XD:
[Anexo excluído pelo administrador]
Fico feliz que as aulas deram frutos.
Fiz um pequeno teste aqui que talvez possa te dar uma luz:
class Test_Window < Window_Base
def initialize(x = 0, y = 0)
# Estarei realizando o super padrão com 1/1 de dimensões para a janela.
# Isso é apenas para garantir que não haverão erros, embora você possa sim
# criar uma janela com 0/0 de dimensões.
super(x, y, 1, 1)
draw_stuff
end
# Estarei usando esse método para desenhar as coisas.
# Note que o que fiz aqui serve apenas como demonstração, você pode querer
# caprichar mais para deixar o código mais limpo criando a lista de
# itens a serem desenhados externamente.
def draw_stuff
# Aqui estarei criando uma hash que será responsável por obter as dimensões
# finais dos itens a serem desenhados.
# Estas dimensões irão se expandir até caberem os itens a serem desenhados.
dimensions = {:width => 0, :height => 0}
# Nesta parte estarei chamando o método de exemplo "process_text_dimensions"
# para que ele calcule as dimensões necessárias do texto a ser desenhado.
# Recomendo que veja os exemplos abaixo e tente fazer com ícones, faces
# e outras coisas.
# Vale notar que ele modifica a variável local "dimensions" se for necessário.
process_text_dimensions("Hey There!", 0, 0, dimensions)
process_text_dimensions("Just some text.", 100, line_height, dimensions)
process_text_dimensions("Another text in here.", 20, line_height * 2, dimensions)
# Após ter calculado as dimensões necessárias, é hora de criar um bitmap
# com as mesmas dimensões calculadas. Esse bitmap será usado como
# o conteúdo final da janela.
# Vou chamar o método "recreate_contents" que criei apenas para isso.
recreate_contents(Bitmap.new(dimensions[:width], dimensions[:height]))
# Após ter criado o bitmap de conteúdo da janela, podemos enfim desenhar
# as coisas nela.
# Eu recomendo usar as mesmas coordenadas/dimensões que usamos para
# calcular o espaço necessário durante a criação das dimensões.
draw_text_ex(0, 0, "Hey There!")
draw_text_ex(100, line_height, "Just some text.")
draw_text_ex(20, line_height * 2, "Another text in here.")
end
# Este método será encarregado de calcular as dimensões necessárias para
# se desenhar um texto na janela.
# Ele modifica a hash "dimensions" que usamos caso for necessário.
def process_text_dimensions(text, x, y, out_dimensions)
# Aqui obtemos o retângulo que determina as dimensões verdadeiras do
# texto na janela.
rect = contents.text_size(text)
# Nesta parte nós calculamos as dimensões totais para se desenhar o texto nela.
# Note que eu adicionei 2 na largura pois o Ace possui um erro ao calcular
# a largura do texto em alguns casos. Isso não acontecia no XP nem no VX.
calculated_width = x + rect.width + 2
calculated_height = y + rect.height
# Agora nós iremos checar se as dimensões atuais que passamos são menores
# que as dimensões necessárias.
# Caso elas sejam, ele irá alterar as dimensões que passamos.
# Do contrário, ele não faz nenhuma alteração.
# Precisamos fazer isso para a largura E altura, então nada de elsif.
if out_dimensions[:width] < calculated_width
out_dimensions[:width] = calculated_width
end
if out_dimensions[:height] < calculated_height
out_dimensions[:height] = calculated_height
end
end
# E por fim, este é o método que irá recriar o bitmap do conteúdo da janela.
def recreate_contents(source_bitmap)
# Como nós criamos o bitmap assim que o passamos como argumento,
# não precisamos dar dispose nele.
self.contents = source_bitmap
# A largura da janela é a largura do conteúdo dela, somado com o padding
# multiplicado por 2 (visto que temos padding na esquerda e na direita).
self.width = contents.width + padding * 2
# A mesma coisa do padding da largura se aplica ao padding da altura.
self.height = contents.height + padding * 2
# Se você não souber, o padding indica o quão longe da borda da janela
# o conteúdo fica. Por padrão, é 12.
end
end
Creio que se tiver entendido o conceito, você pode melhorar esse código, haha'
Valeuzão por responder Alisson, no momento não posso olhar com calma a sua solução mas assim que puder estudarei seu código e comento.
Mais uma vez, valeus!
Só avisando que atualizei o tópico para incluir Javascript, antes estava voltado ao Ruby apenas, então caso tenham dúvidas rápidas de JS podem usar esse tópico também para resolverem. :ok:
Eu sei que não é uma linguagem muita utilizada nesse fórum, mas se tiverem dúvidas sobre C# podem postar aqui também que ficarei feliz em poder ajudar. :=p:
Não sei se o tópico ainda é ativo ou se é aqui o lugar certo pra perguntar, mas estou com uma dúvida, comecei a estudar rgss3 ontem, e testando algumas coisas cheguei numa parte que não entendi o porque disso acontecer...
Spoiler
class Teste2
def initialize
@var3 = 399
$var2 = 394
@var4 = 773
@var5 = 464
@var = palavra
end
def er
if @var3 == 399
p @var3
end
end
def era
if not $var2 == 393
p @var4
end
end
def ueo
if @var3 == 390 or @var5 == 464
p @var2
end
end
def qdj
p @var
end
end
classe = Teste2.new
classe.er
classe.era
classe.ueo
classe.qdj
Até aqui "if @var3 == 390 or @var5 == 464" funcionava, porém como eu coloquei um "or" coloquei @var3 errado e o @var5 correto, na minha cabeça se um deles estivesse correto printaria na janela de depuração o "p @var2", porém deu nil, porque isso?
E a outra dúvida é, eu coloquei @var = palavra, mas depois disso deu erro e agora vem a pergunta, não pode colocar letras em variáveis?
O problema com o retorno nil de @var2 acontece porque você não definiu @var2. Veja com atenção o seu código e encontrará o erro. Você definiu $var2, que é uma variável global, diferente da variável de instância @var2.
Para guardar textos em uma variável como string você precisa utilizar aspas.
@var = "palavra"
Citação de: Gabriel N. online 10/11/2019 às 13:27
O problema com o retorno nil de @var2 acontece porque você não definiu @var2. Veja com atenção o seu código e encontrará o erro. Você definiu $var2, que é uma variável global, diferente da variável de instância @var2.
Para guardar textos em uma variável como string você precisa utilizar aspas.
@var = "palavra"
Obrigado moço, nossa não tinha visto, agora funcionou certinho, preciso prestar mais atenção.
Provavelmente vou perguntar mais coisas logo, bem difícil aprender algo sem poder tirar dúvidas :T.T:
Eu cheguei na parte de attr, estou vendo as aulas do Khas, porém eu não entendi muito bem pra que serve attr, eu fiz uns testes pra entender melhor como funciona, primeiro eu fiz classes e defini um "initialize" na primeira, e coloquei as variáveis no attr, até onde entendi eu posso acessar o initialize da primeira classe desde tenham as heranças e attr.
Também sei que só posso acessar attr (accesor/reader) o writer deu erro na hora de mandar printar, porque disse que não tem um método definido.
Depois eu retirei o attr e testei, então deu um erro aqui ( class Teste02 < Teste01/ def g/ if lox == "or" ), entendi que mesmo com heranças eu não posso acessar o initialize da primeira classe sem attr.
Porém na classe Teste03 eu chamei um attr (obj = Teste03.new/ n = obj.ked/ p obj.ked), mas pra que? não entendi pra que serviu, só pra chamar?
Pelo menos na minha cabeça eu entendi algumas coisas, se caso falei besteira e não entendi nada me ajudem plis. :T.T:
Espero que dê pra entender :T.T:
Spoiler
class Teste01 #com attr
attr_reader :eke
attr_reader :ekp
attr_reader :ked
attr_accessor :kad
attr_accessor :lox
def initialize
@eke = 38345
@ekp = 372
@ked = 182.32
@kad = "temd"
@lox = "or"
end
def y
if @eke == 38345
p " aaa"
end
end
end
var = Teste01.new
var.y
class Teste02 < Teste01 #com herança
def g
if lox == "or"
p @eke
p @kad
end
end
def m
if lox == "or"
p lox
end
end
def y
if ekp == 372
p "nao"
super
end
end
end
var = Teste02.new
var.g
var.m
var.y
class Teste03 < Teste02 #com herança/attr
def x
if @ked == 182.32
p "000"
end
end
end
obj = Teste03.new
n = obj.ked
p obj.ked
var = Teste03.new
var.x
Não entendi bem qual é a sua dúvida, mas, de toda forma, recomendo que estude as aulas de Ruby feitas pelo Alisson. Provavelmente você não vai encontrar em nenhum outro lugar um material mais completo que esse a respeito do assunto, quando voltado para o RPG Maker.
Aulas de Ruby #13 - Attr (https://youtu.be/j0DjIzkMScE)
Aulas de Ruby (https://centrorpg.com/index.php?topic=16769.msg127696#msg127696)
Com certeza na aula acima do tio Ali deve explicar muito bem o que é, mas vou aproveitar o tempinho que tenho aqui para mandar um adicional também :XD:.
No Ruby as variáveis tem visibilidades igual boa parte se não todas as linguagens orientadas a objetos. Os atributos no ruby que são definidos pelo attr nada mais são do que adicionar um tipo de visibilidade para as variáveis de instância. As variáveis de instância no Ruby são semelhantes as variáveis privadas de outras linguagens, elas são visíveis apenas dentro da classe aonde foi declarada, existe um tipo de variável nas linguagens que são as variáveis públicas. Elas não tem declaração especifica no Ruby, essas variáveis públicas são as que podem ser acessadas fora da classe, no Ruby o que é feito é transformar aquela variável de instância (precedidas por @) em atributo.
as diferenças de writer, accessor e reader são as permissões que vou dar em relação aos acessos externos a classe, então se eu dou um acesso de reader a variável de instância, ela pode ser lida fora da classe, porém ela não pode ser modificada. Se for writer então ela pode ser modificada, mas não pode ser lida e se for accessor, você tem acesso completo a variável fora da própria classe.
Porque é esse nome attr? Bom como dito é porque veio de "attribute", ele significa que eu pego a variável de instância e transformo em um atributo da classe, ou sejá, quando você faz essa declaração:
class Test
attr_accessor :teste
def init
@teste = 2
end
end
Então inicializo a minha classe.
test = Test.new
test.teste retorna 2,
e também posso modificar, já que dei a permissão para tal.
test.teste += 2
test.teste vai retornar 4
Mais alguma dúvida :)? Ah veja o video do Alisson antes, se ainda houver dúvidas só mandar aqui!
Adicionando ao que os amigos acima disseram, isso é o que a virtual machine do ruby faz por trás dos panos quando você usa attr_*, caso estiver curioso:
(https://i.imgur.com/2sglfhm.png)
Em ruby isso é chamado de atributo, mas em programação geral, o termo correto para isso é Propriedade (https://en.wikipedia.org/wiki/Property_(programming)) (ou Property em inglês). Apenas tenha em mente que elas são uma forma de você escolher que variáveis podem ser públicas e quais devem ser privadas. Muitas das vezes quando criamos classes, temos aquela variável que não deve ser alterada de fora de maneira alguma, do contrário pode gerar erros no programa. Você que decide se quer deixar algo público ou não, se julgar necessário o/
Eu entendi em partes o que vocês falaram moço Raizen e Syureri, consegui compreender melhor sobre attr e as permissões, achava que accessor e reader funcionavam no geral e writer não funcionava, mas não sabia para que servia accessor e reader só usava sem entender o que eram, porém agr entendi que reader e writer dão permissões diferentes e accessor as duas permissões, isso já me ajudou a entender bem melhor. Mas ainda é bem confuso pra mim entender em algumas partes, como o moço Gabriel disse ali em cima para estudar as aulas do moço Alisson, vou começar a ver essas aulas também, quem sabe daqui uma semana ou mais eu consiga entender melhor sobre attr, me esforcei pra entender tudo o que vocês falaram, mas ainda não está tudo claro, vou estudar mais e se surgir mais dúvidas eu pergunto aqui se não for incomodo. :XD:
Obrigado ein, ajudou demais!
Então, eu estou assistindo as aulas do moço Alisson, estou na parte de janelas selecionáveis, eu anotei o script todo certinho pra testar e tentar criar algo sozinho, mas sem saber o porque desse erro eu não vou conseguir avançar ;-;, alguém pode me dizer porque não funcionou? eu criei um evento e chamei o script, só aparece a tela com as opções, mas não da pra selecionar as opções...
Spoiler
class Test_Scene < Scene_Base
def start
super
@background = Sprite.new
@background.bitmap = SceneManager.background_bitmap
@my_select = My_Select.new(0,0,300,200)
end
end
class My_Select < Window_Selectable
def initialize(x,y,width,height)
make_command_list
super
draw_commands
activate
select(0)
end
def make_command_list
@list = []
commands = ["selecionar1", "selecionar2", "selecionar3"]
for i in 0...commands.size
@list.push(commands[i])
end
end
def draw_commands
for i in 0...@list.size
rect = item_rect(i)
self.draw_text(rect, @list[i])
end
end
def update
if Input.trigger?(:C) && self.active
Sound.play_ok
p @list[index]
end
end
def item_max
return @list.nil? ? 0 : @list.size
end
end
O que tem de errado?
Você esqueceu o
super no método
update da janela. Nesse caso recomendo chamar ele antes do resto do código:
(https://i.imgur.com/jsedOUU.png)
O que o super faz é chamar o método original da classe "mãe" (aqui seria o update da classe Window_Selectable), nesse caso ele irá atualizar a janela, como a animação do cursor e processar a seleção quando você pressiona uma tecla.
Você pode usar o super antes ou depois, mas recomendo checar se uma tecla for pressionada após atualizar a janela (o/
Citação de: Syureri online 15/11/2019 às 00:00
Você esqueceu o super no método update da janela. Nesse caso recomendo chamar ele antes do resto do código:
(https://i.imgur.com/jsedOUU.png)
O que o super faz é chamar o método original da classe "mãe" (aqui seria o update da classe Window_Selectable), nesse caso ele irá atualizar a janela, como a animação do cursor e processar a seleção quando você pressiona uma tecla.
Você pode usar o super antes ou depois, mas recomendo checar se uma tecla for pressionada após atualizar a janela (o/
Obrigado moço, agora funcionou certinho, preciso prestar mais atenção daqui pra frente principalmente no super e return :._.:, suas aulas são ótimas e estão me ajudando bastante a evoluir, obrigado mais uma vez! :*-*:
Tranquilo, sempre que tiver dúvidas só postar aí (o/
Programar é assim mesmo, tudo na tentativa e erro. Enquanto estiver vendo as aulas, é uma boa ideia sempre tentar fazer o contrário do que faço pra ir descobrindo os erros que dão e como você mesmo gosta de fazer as coisas haha' (tipo o que acontece se chamar um método com o número errado de parâmetros, e se eu fizer um método dentro de um método?) Boa sorte no aprendizado!
Citação de: Syureri online 15/11/2019 às 00:29
Tranquilo, sempre que tiver dúvidas só postar aí (o/
Programar é assim mesmo, tudo na tentativa e erro. Enquanto estiver vendo as aulas, é uma boa ideia sempre tentar fazer o contrário do que faço pra ir descobrindo os erros que dão e como você mesmo gosta de fazer as coisas haha' (tipo o que acontece se chamar um método com o número errado de parâmetros, e se eu fizer um método dentro de um método?) Boa sorte no aprendizado!
Verdade, como diz o ditado, é com os erros que se aprende, ou quase isso kkk.
Eu já tentei fazer uma classe com condições, case,arrays e hash nas condições kkk porém não deu muito certo não, foi uma bagunça, mas é bem legal sair testando tudo, e mais uma vez obrigado! :*-*:
Eu estou com umas dúvidas sobre o return, eu já entendi pra ele serve e como usar, porém eu não sei ao certo o que da pra retornar com ele, esses dias eu estou revisando tudo que tenho aprendido, e hoje foi o return, fiz esses testes até agora...
Spoiler
def nome()
return("eliza")
p "8654"
end
p nome
def numero()
return[82,292,020]
end
p numero
class Numeros
def x()
if x == ("uww", "wsywg")
p "6262"
return["uww", "wsywg"]
end
end
end
classe = Numeros.new
classe.x
Por exemplo nesse ultimo, eu posso retornar nomes e números nas arrays, creio que seja arrays né ;-;, porém eu fiz uma bagunça pra saber se tem como identificar se o def x é igual o que foi retornado, já fiz de muitas outras maneiras e nenhuma deu certo, tem como colocar uma condição pra verificar o que foi retornado é igual?
Helcurt, eu tava escrevendo aqui um textão pra te explicar como o return funciona em linguagens em geral, aí reli o seu texto e vi "eu já entendi pra ele serve e como usar"
Eu não entendi direito sua dúvida.
Olhando no seu código... admito que faz tempo que não mecho no ruby, mas no código você não declarou o x dentro do def x(), e ele nao é um parâmetro que você entrou nem a própria função sendo chamada recursivamente, então ele é basicamente nada, um valor fantasma indefinido. nunca que aquele if vai ser verdadeiro, e o return está antes do end do if, então o return nunca vai acontecer.
Além disso, ele está sendo comparado com dois valores dentro de um parênteses, mas não são parâmetros de uma função e nem um array, arrays usam colchetes.
ou seja, você não está podendo ver se o def x é igual ao retornado porque nada está sendo retornado
...eu acho. como disse antes faz literalmente anos que não mexo em ruby e esse código parece que é apenas uma parte, então posso estar falando asneira
Citação de: Yorae Rasante online 20/11/2019 às 14:46
Helcurt, eu tava escrevendo aqui um textão pra te explicar como o return funciona em linguagens em geral, aí reli o seu texto e vi "eu já entendi pra ele serve e como usar"
Eu não entendi direito sua dúvida.
Olhando no seu código... admito que faz tempo que não mecho no ruby, mas no código você não declarou o x dentro do def x(), e ele nao é um parâmetro que você entrou nem a própria função sendo chamada recursivamente, então ele é basicamente nada, um valor fantasma indefinido. nunca que aquele if vai ser verdadeiro, e o return está antes do end do if, então o return nunca vai acontecer.
Além disso, ele está sendo comparado com dois valores dentro de um parênteses, mas não são parâmetros de uma função e nem um array, arrays usam colchetes.
ou seja, você não está podendo ver se o def x é igual ao retornado porque nada está sendo retornado
...eu acho. como disse antes faz literalmente anos que não mexo em ruby e esse código parece que é apenas uma parte, então posso estar falando asneira
Opa moço, obrigado, acho que agora entendi melhor, achei que dava pra fazer assim, mas deve ser por isso que estava dando erro, e na real o código era só aquilo mesmo, não tinha outra parte, só estava fazendo uns testes pra entender melhor o return ai surgiu essa dúvida, vou fazer de um jeito melhor agora, obrigado :XD:
ah, o return parece complicado até você entender só.
quando chega no return, a função termina. não importa em que ponto dela você esteja, ela termina. pode ser dentro de um if, pode ser dentro de um loop, pode ser só na função mesmo, se chega nele ela acaba.
o nome "return" é que antigamente ele era usado só pra retornar um valor, seja de uma variável ou de um cálculo. tipo um "return 1+2" ia retornar 3. se x = 5 e "return x" iria retornar 5. se x = 7 e "return x+3" iria retornar 10.
Só que nem sempre você precisa de um valor de retorno, e para esses casos só precisa de um "return" pra fechar a função. em algumas linguagens tem que declarar a função como algo diferente, lembro que aprendi com uma linguagem que tinha que declarar a função retornaria algo do tipo void (vazio em português), em outras você tem que retornar um valor mas é só ignorar ele mesmo onde a função foi chamada mesmo.
Em resumo, return retorna um valor e fecha a função na hora. mas não precisa retornar um valor se só quiser fechar a função.
Citação de: Yorae Rasante online 20/11/2019 às 21:41
ah, o return parece complicado até você entender só.
quando chega no return, a função termina. não importa em que ponto dela você esteja, ela termina. pode ser dentro de um if, pode ser dentro de um loop, pode ser só na função mesmo, se chega nele ela acaba.
o nome "return" é que antigamente ele era usado só pra retornar um valor, seja de uma variável ou de um cálculo. tipo um "return 1+2" ia retornar 3. se x = 5 e "return x" iria retornar 5. se x = 7 e "return x+3" iria retornar 10.
Só que nem sempre você precisa de um valor de retorno, e para esses casos só precisa de um "return" pra fechar a função. em algumas linguagens tem que declarar a função como algo diferente, lembro que aprendi com uma linguagem que tinha que declarar a função retornaria algo do tipo void (vazio em português), em outras você tem que retornar um valor mas é só ignorar ele mesmo onde a função foi chamada mesmo.
Em resumo, return retorna um valor e fecha a função na hora. mas não precisa retornar um valor se só quiser fechar a função.
Opa, obrigado moço, agr entendi com mais clareza, pelo jeito eu não tinha entendido o return completamente, mas creio que com o tempo eu vou entendendo, obrigado msm :XD:
Ahoy, possível pergunta besta a baixo, por motivos de eu estar enferrujado afu em programação, e eu estar sempre pulando os estudos básicos e indo para coisas mais avançadas. A resposta deve ser algo bem simples.
Engine: RPG Maker MV
Contexto: Estou usando o Chrono Engine do Mog, em modo ABS. Quando se usa o escudo, tu defende qualquer ataque fisico, mas eu não quero isso. Eu quero que rode um teste de chance, tipo o Escudo de Madeira tem 40% de chance de defender esse ataque. Assim como em RPG de Mesa, que tu faz primeiro um teste para ver se tu defende o golpe ou não. Atualmente estou gerando um número aleatório de 1 a 10, e se for maior que 5, é defendido o ataque.
Dúvida: Como fazer uma função de porcentagem em Javascript, tendo a var _chance_ como o valor da chance de acerto, e caso tu passe esse teste de chance, a função retorna true.
Imagino algo assim:
let chance = busca_chance_na_nota_do_item
algo_randomico() // retornou 78
return true if randomico > chance
Código atual:
/**
* Returns a random integer between min (inclusive) and max (inclusive).
* The value is no lower than min (or the next integer greater than min
* if min isn't an integer) and no greater than max (or the next integer
* lower than max if max isn't an integer).
* Using Math.round() will give you a non-uniform distribution!
*/
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
//==============================
// * executeTouch Damage // FUTURE_NUMPAD: Aqui é executado a checkagem do escudo e aplicado o dano.
//==============================
Game_Chrono.prototype.executeTouchDamage = function(user,target) {
if (target.battler()._ras.collisionD > 0) {return};
if (this.isGuardingDirectionTouch(user,target)) {
this.executeGuardTouch(user,target);
let a = getRandomInt(1, 10);
console.log("Valor aleatório é: " + a);
if (a > 5) return; // Se a for maior que 5, é defendido e o dano é anulado!
};
// Abaixo segue o código que aplica o dano
Paz e tédio a todos.
Se eu entendi direito, tu quer obter a porcentagem entre um valor mínimo e máximo baseado em um valor aleatório, certo?
Faz tempo que não mexo em javascript, mas vou usar o exemplo do InverseLerp (https://docs.unity3d.com/ScriptReference/Mathf.InverseLerp.html) em Unity:
// C#
// https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Mathf.cs#L367
public static float InverseLerp(float a, float b, float value)
{
if (a != b)
return Clamp01((value - a) / (b - a));
else
return 0.0f;
}
Se o valor mínimo a for 0, e o valor máximo b for 100, e o valor value for 50, o método retorna 0.5 (50%). Clamp01 é um método que mantém um valor entre 0 e 1 para que ele não extrapole.
Na maioria das linguagens que conheço, chamar uma função random sem argumentos retorna um número entre 0 e 1 (0 e 100%). Eu sugiro trabalhar com esses valores quando se está querendo porcentagem ao invés de números inteiros como 1 e 10.
O método do Syureri resolve lindamente. Já havia escrito, mas me esqueci de postar ontem. Então cá está, é basicamente a mesma coisa em Python, só pra exemplificar a lógica:
# Importando o método que gera os valores aleatórios.
from random import randint
def attack_chance(x: int, y: int, z: int) -> int:
""" Verifica a chance de acerto de um golpe
:param x: Valor necessário para sucesso.
:param y: Valor mínimo possível.
:param z: Valor máximo possível.
"""
if (x < y) or (x > z):
raise ValueError("Invalid value.")
elif (y > z) or (y == z):
raise ValueError("Invalid limits.")
else:
return True if x * 0.01 >= randint(y, z) * 0.01 else False
Os argumentos são: x, o valor que o jogador precisa tira. Y e z, respectivamente, o mínimo e o máximo possível na jogada. Fazemos uma verificação pra ver se o valor necessário está dentro dos limites especificados e se esteslimites são válidos, então calculamos. Randint é o método que busca um valor aleatório dentro destes limites. As multiplicações transformam o número em um float menor que 1, como Syureri recomendou.
Por fim, a conta é mais ou menos essa:
(Valor necessário [em float <1]) é maior ou igual ao (valor aleatório [em float < 1])?
No MV seria:
getRandomInt(1, 100) < _chance_
Valeu galera, todas soluções me servem. Vou fazer algo aqui.
Alguém poderia me explicar como essa condição funciona?
(https://i.ibb.co/BCLj7hH/d1.png)
Eu estou aprendendo javascript, e estava praticando o que eu aprendi até o momento. Após tentar bastante, consegui fazer uma condição funcionar, mas não entendi muito bem como ela sabia o valor da variável, sendo que eu não coloquei na condição " se a variável n4 for igual a 25 ", foi só colocar o número que funcionou. No javascript funciona sem precisar declarar a variável na condição?
A primeira vez que tentei fiz assim, mas não funcionou. Não está certo assim também?
(https://i.ibb.co/k9wD0kr/d2.png)
Dá uma zoiada aqui: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Operadores_de_compara%C3%A7%C3%A3o
um = não é operador de comparação, ele está fazendo o n4 ser igual a 25 e não comparando com 25.
Citação de: Raizen online 23/02/2020 às 15:36
Dá uma zoiada aqui: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Operadores_de_compara%C3%A7%C3%A3o
um = não é operador de comparação, ele está fazendo o n4 ser igual a 25 e não comparando com 25.
Obrigadoo moço Raizen, agora está funcionando e também consegui entender melhor. Ajudou bastante, nunca que ia saber que precisaria de 3 de igualdade, fora as outras informações que vão ajudar muito também, obrigado mais uma vez.
:*-*:
Então, eu tenho aprendido muito em java, e resolvi tentar recriar um novo projeto teste, com o intuito de ver o meu progresso, chegando na parte de criar um game looping pro jogo rodar a 60 fps, mesmo sabendo o funcionamento em partes, ainda é muito confuso.
No meu projeto, uso esse aqui:
(https://i.ibb.co/ZYfbSw9/Capturar.png)
No stackoverflow, vi esse aqui:
(https://i.ibb.co/ZXh5YrH/Capturar1.png)
É bem parecido com o que eu uso, mas não entendi 100%, na stack eles colocaram um try/catch, até onde eu sei, é usado se caso houver algum problema no código.
Qual a diferença entre esses dois? Um é melhor do que o outro, ou funcionam da mesma forma, independente da maneira que foi escrito?
Também queria saber se usar um try/catch faz diferença, pelo que entendi, quando ocorre algum erro na hora que estou programando, ele avisa no console, mas isso faz alguma diferença quando o jogo/aplicação está finalizado digamos assim, ou só é usado no desenvolvimento?
Não sei se aqui pode postar coisas sobre java, mas se puder e alguém tirar essa duvida, ficaria agradecido, claro se não for incomodo da minha parte. :XD:
Boa tarde pessoas! Não sei se pode postar coisas sobre desenvolvimento de bots aqui, mas como é em javascript, imagino que não tenha problema.
Então, queria saber se alguém pode me ajudar com esse código, em parte ele já está funcionando do jeito que quero, que é enviar perguntas para que a pessoa responda, assim ele coleta as respostas e envia para outro canal.
O código é esse:
Spoiler
const Discord = require("discord.js");
exports.run = async (client, message, args) => {
const questions = ['Escolha um título!', 'Escolha uma descrição!', 'Escolha uma segunda descrição!','Obrigado! Sua sugestão será avaliada.'];
const question = await message.channel.send(questions[0]);
const filter = msg => msg.author.id === message.author.id;
const collector = message.channel.createMessageCollector(filter, { time: 150 * 1330 });
const answers = [];
collector.on('collect', msg => {
answers.push(msg.content);
questions.shift();
if (questions.length <= 0) return collector.stop('done');
question.edit(questions[0]).catch(error => {
console.error(error);
collector.stop();
});
var channel = message.guild.channels.cache.find(ch => ch.id === "773593081605914684");
channel.send(`Autor: ${message.author}\nDescrição: ${msg.content = answers[0]}\nDescrição2: ${msg.content = answers[1]}\nDescrição3: ${msg.content = answers[2]}`)
});
}
(https://i.ibb.co/55G6Z0C/d2.png)
(https://i.ibb.co/v3d5QJB/d1.png)
E como dá pra ver nas imagens, ele envia cada uma das respostas e as que ainda não foram respondidas ficam indefinidas. Pois bem, o que eu queria fazer é, esperar a pessoa responder todas as perguntas e depois enviar, alguém aí pode me ajudar se possível?
Só mover o trecho que envia as repostas pra dentro da condição de terem acabado as questões:
const Discord = require("discord.js");
exports.run = async (_, message) => {
const questions = [
'Escolha um título!',
'Escolha uma descrição!',
'Escolha uma segunda descrição!',
'Obrigado! Sua sugestão será avaliada.'
];
const question = await message.channel.send(questions[0]);
const filter = msg => msg.author.id === message.author.id;
const collector = message.channel.createMessageCollector(filter, { time: 150 * 1330 });
const answers = [];
collector.on('collect', msg => {
answers.push(msg.content);
questions.shift();
if (questions.length <= 0) {
var channel = message.guild.channels.cache.find(ch => ch.id === "773593081605914684");
channel.send(`Autor: ${message.author}\nDescrição: ${msg.content = answers[0]}\nDescrição2: ${msg.content = answers[1]}\nDescrição3: ${msg.content = answers[2]}`)
return collector.stop('done');
}
question.edit(questions[0]).catch(error => {
console.error(error);
collector.stop();
});
});
}
Dá pra dar uma melhorada na organização e lógica também, por exemplo usar um índice pra passar para a próxima questão ao invés de dar shift no array e separar as coisas em funções:
const Discord = require("discord.js");
const questions = [
'Escolha um título!',
'Escolha uma descrição!',
'Escolha uma segunda descrição!',
'Obrigado! Sua sugestão será avaliada.'
];
exports.run = async (_, message) => {
const questionIndex = 0;
const question = await message.channel.send(questions[0]);
const collector = message.channel.createMessageCollector(
msg => msg.author.id === message.author.id,
{
time: 150 * 1330
}
);
const answers = [];
function sendAnswers() {
var channel = message.guild.channels.cache.find(
ch => ch.id === "773593081605914684"
);
channel.send(
`Autor: ${message.author}\n` +
`Descrição: ${msg.content = answers[0]}\n` +
`Descrição2: ${msg.content = answers[1]}\n` +
`Descrição3: ${msg.content = answers[2]}`
);
}
async function editQuestion() {
try {
question.edit(questions[questionIndex]);
} catch (error) {
console.error(error);
collector.stop();
}
}
collector.on('collect', msg => {
answers.push(msg.content);
questionIndex++;
if (questionIndex == questions.length) {
sendAnswers();
return collector.stop('done');
} else {
editQuestion();
}
});
}
Citação de: Brandt online 25/12/2020 às 22:33
Só mover o trecho que envia as repostas pra dentro da condição de terem acabado as questões:
const Discord = require("discord.js");
exports.run = async (_, message) => {
const questions = [
'Escolha um título!',
'Escolha uma descrição!',
'Escolha uma segunda descrição!',
'Obrigado! Sua sugestão será avaliada.'
];
const question = await message.channel.send(questions[0]);
const filter = msg => msg.author.id === message.author.id;
const collector = message.channel.createMessageCollector(filter, { time: 150 * 1330 });
const answers = [];
collector.on('collect', msg => {
answers.push(msg.content);
questions.shift();
if (questions.length <= 0) {
var channel = message.guild.channels.cache.find(ch => ch.id === "773593081605914684");
channel.send(`Autor: ${message.author}\nDescrição: ${msg.content = answers[0]}\nDescrição2: ${msg.content = answers[1]}\nDescrição3: ${msg.content = answers[2]}`)
return collector.stop('done');
}
question.edit(questions[0]).catch(error => {
console.error(error);
collector.stop();
});
});
}
Dá pra dar uma melhorada na organização e lógica também, por exemplo usar um índice pra passar para a próxima questão ao invés de dar shift no array e separar as coisas em funções:
const Discord = require("discord.js");
const questions = [
'Escolha um título!',
'Escolha uma descrição!',
'Escolha uma segunda descrição!',
'Obrigado! Sua sugestão será avaliada.'
];
exports.run = async (_, message) => {
const questionIndex = 0;
const question = await message.channel.send(questions[0]);
const collector = message.channel.createMessageCollector(
msg => msg.author.id === message.author.id,
{
time: 150 * 1330
}
);
const answers = [];
function sendAnswers() {
var channel = message.guild.channels.cache.find(
ch => ch.id === "773593081605914684"
);
channel.send(
`Autor: ${message.author}\n` +
`Descrição: ${msg.content = answers[0]}\n` +
`Descrição2: ${msg.content = answers[1]}\n` +
`Descrição3: ${msg.content = answers[2]}`
);
}
async function editQuestion() {
try {
question.edit(questions[questionIndex]);
} catch (error) {
console.error(error);
collector.stop();
}
}
collector.on('collect', msg => {
answers.push(msg.content);
questionIndex++;
if (questionIndex == questions.length) {
sendAnswers();
return collector.stop('done');
} else {
editQuestion();
}
});
}
Olá Brandt, muito obrigado, funcionou que é uma beleza, estava a dias tentando fazer isso, e como discord js ainda é bem confuso as vezes, fico empacado fácil.
CitarDá pra dar uma melhorada na organização e lógica também, por exemplo usar um índice pra passar para a próxima questão ao invés de dar shift no array e separar as coisas em funções:
Ainda é algo novo pra mim, mas vou estudar o seu código e tentar usar nos outros comandos do bot. Ah sim, o segundo código deu um erro:
(https://i.ibb.co/TTPRxrv/Capturar.png)
Porém eu vou tentar descobrir o porque do erro, acho que vai ser bom pro meu aprendizado, essa semana tenho visto muitos erros e depois de um tempo consigo entender, e pelo que entendi é algum valor que não pode ser alterado, ou que já foi declarado, espero que seja algo referente a isso, esses erros as vezes me confundem demais.
Alguém sabe me dizer o que tem de errado nesse comando do bot?
const Discord = require("discord.js");
exports.run = async (_, message) => {
//=======================================================
const embed = new Discord.MessageEmbed()
.setColor('RANDOM')
.setTitle('__COMANDOS DISPONÍVEIS__')
.setDescription('\n\n**__DIVERSÃO__**\n- =angry\n- =attack\n- =clap\n- =dance\n- =embarassed\n- =gic\n- =hug\n- =hungry\n- =happy\n- =kiss\n- =meme\n- =poke\n- =pout\n- =sad\n- =scared |**em breve**\n- =wink\n**- Para todos os Membros Cadastrados!**\n\n**__JOGOS__**\n- =atnl **em breve**\n\n**__OUTROS__**\n- =imgeneration\n- =image\n- =color\n- =sg\n**- Alguns necessitam de Cargos!**\n\n **__RESTRITOS__**\n- =atr\n- =clear\n **- Apenas para ADMs ou MODs!**\n\n**Para saber como funcionam os comandos consulte, =ex.** ');
await message.channel.send(embed);
//=======================================================
const pollTopic = await message.channel.send(message.content.slice(1));
//=======================================================
await pollTopic.react('UM EMOJI');
//=======================================================
const filter = (reaction,user) => reaction.emoji.name && user.id === reaction;
//=======================================================
(collected => {
const reaction = collected.first();
if(reaction.emoji.name === 'UM EMOJI'){
message.channel.send('agag')
};
//=======================================================
});
//=======================================================
};
Ao reagir o emoji era para enviar essa mensagem no canal, porém nada acontece, tirando o fato de não mostrar nenhum erro no console. Até o momento estou achando que poderia ser essa parte (const filter = (reaction,user) => reaction.emoji.name && user.id === reaction;), porém já escrevi de tudo após(===), mas nada funciona e nem ao menos mostra um erro.
(https://i.ibb.co/H7T2tGQ/Capturar.png)
Só fica nisso aí.
De Js não entendo, mas você viu se o bot tem permissão para ver reações? Nas configurações da API você define com o que ele pode ou não interagir. E ele está mandando outras mensagens normalmente?
Citação de: Corvo online 14/01/2021 às 17:06
De Js não entendo, mas você viu se o bot tem permissão para ver reações? Nas configurações da API você define com o que ele pode ou não interagir. E ele está mandando outras mensagens normalmente?
Ele tem permissão de Administrador. Os outros comandos estão normais, além desse, tenho outros comandos com reações e funcionam bem, mas esse em específico não quer dá sinal de vida nessa parte de jeito nenhum. Já testei algo semelhante com condições e está funcionando, só esse que não.
:T.T:
Mas mesmo assim obrigado Corvo.
E este "UM EMOJI"? Os nomes das reações não precisam estar codificados (https://discordjs.guide/popular-topics/reactions.html#custom-emojis)?
Citação de: Corvo online 14/01/2021 às 17:27
E este "UM EMOJI"? Os nomes das reações não precisam estar codificados (https://discordjs.guide/popular-topics/reactions.html#custom-emojis)?
No código tem um emoji que copiei, porém aqui estava dando erro "A mensagem foi deixada em branco.", então escrevi isso no lugar. Eu vi alguns exemplos nesse guia do discord.js, usei um deles que era semelhante ao que eu estou usando, tentei até mudar algumas coisas já que estava funcionando, mas foi pior, surgiram vários erros.