Nome e Sexo Personalizados do Jogador (Avançado)

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Nome e Sexo Personalizados do Jogador (Avançado)

Mensagem por williamd1k0 em 14.09.15 0:34

Olá, vou deixar este sisteminha para personalizar o nome e o sexo do jogador, criado a partir da dúvida em outro tópico, que apesar de ter sido sanada este sistema é mais versátil.
Mas como usa recursos mais avançados eu resolvi deixar ele separado.

Tópico da dúvida : http://renpybrasil.forumeiro.com/t66-nome-e-sexo-personalizados

(Atenção!!): Este sistema utiliza orientação a objetos (classes e instanciamento) em Python! O código está bem comentado para facilitar o entendimento, mas é recomendável saber o conceito dos objetos.

>Eu irei criar depois tópicos para falar de lógica de programação aqui pra facilitar as coisas no entendimento da linguagem Python Smile

Eu deixei o script separado externamente para facilitar a visualização dele, mas vou deixar uma cópia aqui.

Script com "corzinha" : http://williamd1k0.github.io/renpysnippets/?snippet=sexo_jogador.rpy

Cópia:
Spoiler:

Código:

## Bloco Python para criar uma Classe
# - Dependendo do tamanho pode ficar em outro arquivo
# - Uma classe é basicamente um contrutor (molde) para um objeto.
# - Um objeto precisa ser instanciado, como um Character por exemplo.
# - Ex: define lorem = Character("Lorem Ipsum")
#        [*]    [1]             [2]
# 1 = Objeto instanciado.
# 2 = Classe Character.
# * = A palavra-chave "define" é uma mistura de "init + $".
# "init" = Bloco que é executado antes de iniciar o jogo.
# "$" = Palavra-chave para usar uma expressão Python em uma unica linha.
# "python" = Bloco que é usado para usar somente expressões Python.
init python:
    ## Bloco da classe Genero
    class Genero:
        ## Método contrutor da classe
        # - Um método contrutor é executado quando um objeto é instanciado
        # - o argumento "sexo" será passado no instanciamento
        # - Ex: $ sexo = Genero("m")
        # - o objeto sexo irá receber todos os atributos masculinos(m)
        def __init__(self, sexo):
            # "self" é usado para referenciar a própria classe.
            # Usando o mesmo exemplo acima, os atributos podem ser acessados por "ponto":
            # sexo.genero
            # sexo.artigo
            self.genero = sexo

            # Abaixo vem a verificação se é masculino("m") ou feminino("f").
            # Entrando em cada bloco, serão definidas palavras específicas pra cada sexo.
            # Usando o exemplo do artigo, o masculino usa "o" e o feminino "a"
            if sexo == "m":
                self.artigo = "o"
            elif sexo == "f":
                self.artigo = "a"
# Iníco do jogo
label start:
    # um simples menu para escolher o sexo.
    menu escolha_sexo:
        "Escolha o seu sexo!"
        "Masculino":
            # Se Masculino, intancia o objeto passando o parâmetro "m"
            $ sexo = Genero("m")
        "Feminino":
            # Se Feminino, intancia o objeto passando o parâmetro "f"
            $ sexo = Genero("f")

    # Este bloco python serve para poder usar o comando while para criar
    # um loop na hora de digitar o nome do jogador (tentativas)
    python:
        # Tentativa de obter o nome
        jogador = renpy.input("Olá, qual é seu nome: ")
        # Número de tentativas caso entre com um valor em branco.
        tentativas = 2

        # Este loop obriga o jogador a entrar com o nome usando o número de tentativas.
        # Caso queira obrigar sem número de tentativas, somente use o [ jogador == "" ]
        while jogador == "" and tentativas > 0:
            # Diminui a quantidade de tentativas a cada repetição.
            tentativas -= 1
            # Avisa a entrada inválida e pede novamente.
            centered("Entrada inválida!")
            jogador = renpy.input("Qual é seu nome: ")

            # Se a entrada estiver vazia, checa o número de tentativas restantes.
            if jogador == "":
                # Se for zero, jogador receber None (nada/nenhum) e sai do loop.
                if tentativas == 0:
                    jogador = None
            # Se a entrada não for vazia (nome inserido), zera as tentativas e sai do loop.
            else:
                tentativas = 0
    # Fora do bloco python, faz uma checagem do nome do jogador.
    # Se não existir um nome (None), um nome padrão é definido com base no sexo escolhido.
    if not jogador:
        # Usando o atributo "genero" do objeto criado acima para checar.
        if sexo.genero == "m":
            $ jogador = "João"
        else:
            $ jogador = "Maria"

        # Uma mensagem para mostrar o nome padrão definido.
        centered "Por falta de escolha, o nome será [jogador]"

    # Uma mensagem exemplo para usar os atributos do objeto.
    # Se for masculino, bem-vind[sexo.artigo] vira bem-vindo
    # Se for feminino, bem-vind[sexo.artigo] vira bem-vinda
    narrator "Seja bem-vind[sexo.artigo], [jogador]!"

    # Usando esse processo com classes, é possível personalizar várias palavras que precise.
    return

[*]

_________________
avatar
williamd1k0
Regular
Regular

Masculino Mensagens : 82
Data de inscrição : 19/04/2015
Localização : Paraná
Projetos : Ren'Py for Atom

Ver perfil do usuário https://github.com/williamd1k0

Voltar ao Topo Ir em baixo

Re: Nome e Sexo Personalizados do Jogador (Avançado)

Mensagem por Kloson em 14.09.15 0:57

Muito bom William!
Apesar de eu ter começado a faculdade de programação só nesse ano, e ainda não ter chegado em orientado a objetos, consegui entender e lembrar umas coisas do curso técnico ao ler seu código.

Entendi grande parte dele (Os comentários ajudaram bastante :3)

Apenas uma dúvida:

O self.atributo é usado somente dentro do método?

Pois vi usando os atributos genero e artigo como sexo.artigo ou sexo.genero.

Tentando entender aqui, presumi que Self.atributo é usado dentro do método e sexo.atributo é usado fora. Certo? Ou estou enganado?

Bom de qualquer forma, muito obrigado pelo tuto :3
avatar
Kloson
Moderador

Masculino Mensagens : 79
Data de inscrição : 25/08/2015
Projetos : Tempo Livre

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Nome e Sexo Personalizados do Jogador (Avançado)

Mensagem por williamd1k0 em 14.09.15 1:15

Então, isso tem a ver com os escopos.
Quando vc está criando a classe, qualquer variável dentro dela é um atributo da classe. Mas dentro da classe ali vc tem o método __init__ (que poderia ser qualquer outro método), esse método possui o escopo dele e as variáveis usadas nele serão locais, tipo, se dentro do método vc criasse uma variável genero, ela iria "morrer" no fim daquele método, o self serve para referenciar a classe, seria tipo Genero.genero, ou Genero.artigo.

Mas aí depois que vc cria um objeto a partir dessa classe Genero, que poderia ter qualquer nome (tipo "palavras"), aí vc usaria palavras.genero ou palavras.artigo.

Mas então, quando vc entender orientação a objetos isso se torna bem mais claro Smile

_________________
avatar
williamd1k0
Regular
Regular

Masculino Mensagens : 82
Data de inscrição : 19/04/2015
Localização : Paraná
Projetos : Ren'Py for Atom

Ver perfil do usuário https://github.com/williamd1k0

Voltar ao Topo Ir em baixo

Re: Nome e Sexo Personalizados do Jogador (Avançado)

Mensagem por Kurotsugu-san em 14.09.15 17:23

Excelente, muito bem explicado. Até aprendi umas coisas novas com esse tutorial. o/

_________________
Tatsuhiko Takimoto escreveu:Quando leio minha história nos dias em que estou de bom humor, penso. “Incrível! Sou um gênio!”
E nos dias que estou deprimido, é sempre, “Sou uma desgraça por ter escrito algo assim! Morra agora mesmo!”
avatar
Kurotsugu-san
Criador do Ren'Py Brasil

Masculino Mensagens : 100
Data de inscrição : 28/03/2015
Localização : Porto-Alegre - RS

Ver perfil do usuário http://renpybrasil.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Nome e Sexo Personalizados do Jogador (Avançado)

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum