O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Aula Ativa de Javascript/Ruby/RGSS e outras linguagens de programação

Iniciado por Raizen, 22/11/2012 às 13:04

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!
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

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
[close]

O que tem de errado?
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

Você esqueceu o super no método update da janela. Nesse caso recomendo chamar ele antes do resto do código:


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:


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! :*-*:
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

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! :*-*:
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

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
[close]

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?
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

20/11/2019 às 14:46 #67 Última edição: 20/11/2019 às 14:48 por Yorae Rasante
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:
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

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:
Depressão sem obsessão, pulsos livres da dor, tristeza confusa, felicidade sem sentido, ânimo e desânimo, raiva momentânea e a solidão sempre presente...até que a morte os separe, amém.

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 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])?