Conectar-se
Quem está conectado
19 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 19 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Nota C
Notas recebidas : B+D
Data de inscrição : 18/01/2011
Número de Mensagens : 482
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 5

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

[Tutorial] Sistema de Recordes com arquivo .ini

em Dom 05 Fev 2012, 21:50
Nome: Sistema de Recordes com arquivo .ini
Categoria: Tutorial
Plataforma: Game Maker 8 PRO
Nível: Iniciante
Créditos: 100% da Intec
(Link removido, não é permitido postar o link, só o nome nos créditos)


Introdução

Vou explicar como criar um sistema de recordes personalizado, desda programação até o designer. E para isso vou usar os recursos dos arquivos .ini que servem para guardar informações, neste caso vamos usar para guardar os valores dos recordes, para saber mais sobre arquivos .ini: aula 1, aula 2 e aula 3
Por que usar arquivos .ini?

Entre vários motivos podemos destacar, que se usássemos outros métodos de armazenamento de informações, como ds_lists e arrays, os valores iriam se perder ao reiniciar o jogo(voltaria a ser 0) usando arquivos ini, podemos reiniciar o aplicativo quantas vezes quiser que o recorde continuara gravado, a não ser que movamos o aplicativos da pasta que esta o arquivo ini.

Pre-requisitos

Só será necessário um novo objeto no seu jogo. Eu dei o nome de: obj_SRecordes
Saber o básico de arquivos .ini(não é muito necessário, apenas recomendado): Aula



1°-Criando o arquivo .ini e os valores

Não existe um código especifico para criar o arquivo .ini, ele é criado instantaneamente quando tentamos ler e ele não existir. O que facilita muito, evitando a necessários de mais arquivos acompanhando o .exe para o jogo rodar corretamente e evitando a necessidade de mais códigos para a criação do arquivo. Com isso o código no create do obj_SRecordes fica assim:
Código:
//INICIAR SISTEMA DE RECORDES POR INI

NumeroLugares=3//defina quantos lugares quer gravar aqui

ini_open("recordes.ini")//abre o arquivo "recordes.ini", se ele não existir: cria

for (i = 0; i < NumeroLugares; i += 1)//repete o código, o numero de lugares escolhidos
{
    NovoLugar=string(i)//transforma o lavor de [i] em uma string(coloca entre aspas), e guarda na variável NovoLugar
    if !(ini_key_exists("lugares",NovoLugar))//se não existir o "NovoLugar"
    {
        ini_write_real("lugares",NovoLugar,0)//cria o "NovoLugar"
    }
}

ini_close()//fecha o arquivo .ini que esta sendo usado (recordes.ini)

Informações adicionais:
INI_OPEN(“ARQUIVO.INI”):
Serve para abrir ou, como já foi dito, criar automaticamente, caso não exista, um arquivo.ini. O arquivo será criado no mesmo lugar que esta o .gmk ou o .exe
ini_close():
Fecha o arquivo .ini que estava sendo usado
INI_KEY_EXISTS(SEÇÃO,CHAVE):
Checa se a chave indicada existe
INI_WRITE_REAL(SEÇÃO,CHAVE,VALOR):
Serve para criar ou substituir o valor anterior, na seção e chave indicadas
for:
for (variável = 0; variável < [numero de repetições]; variável += 1){código}
Não sei explicar muito bem como funciona uma [for], mas basicamente é isso:
Defini o valor da variável
Se a variável for menor que o numero de repetições
Adiciona uma quantia a variável
Ou seja ele repete o código entre "{}" ate a variável alcançar o numero de repetições
2°-Redefinindo os valores(Novo recorde)

Não ha um lugar especifico para colocar esta função, use-a sempre que for definir um novo recorde.
Não existe uma função especifica para fazer isso, até porque estamos criando um novo sistema de recordes. Então eu criei o código abaixo:

Código:
//ADICIONAR NOVO RECORDE

for (i = 0; i < NumeroLugares; i += 1)//repete o codigo, o numero de lugares escolhidos
{
    ini_open("recordes.ini")
    Lugar=ini_read_real("lugares",string(i),0)//procura no arquivo ini, qual é o recorde do lugar indicado pela variavel i da [for]. E grava na variavel Lugar
   
    if score > Lugar//se score for maior que o lugar indicado pela variavel i da [for]
    {//quer dizer que score quebrou o recoude do lugar indicado pela variavel i da [for]
        ini_write_real("lugares",string(i),score)//grava no arquivo ini a pontuação do novo recorde
        ini_close()
        exit;//como a [for] vai continuar encontrando os outrus lugares menores que o score, exit fecha o codigo, para preservar o valor dos outros lugares
    }
}
O código ficou um pouco complicado, mas acho que expliquei bem.
Informações adicionais:
INI_READ_REAL(SEÇÃO,CHAVE,DEFAULT):
Serve para ler o valor da seção e chave indicadas
INI_WRITE_REAL(SEÇÃO,CHAVE,VALOR):
Serve para criar ou substituir o valor anterior, na seção e chave indicadas
for:
for (variável = 0; variável < [numero de repetições]; variável += 1){código}
Não sei explicar muito bem como funciona uma [for], mas basicamente é isso:
Defini o valor da variável
Se a variável for menor que o numero de repetições
Adiciona uma quantia a variável
Ou seja ele repete o código entre "{}" ate a variável alcançar o numero de repetições

3°-Desenhando o "pódio"


Isso é muito pessoal, cada um organiza como quê, então vou passar apenas o básico e as posições x's, y's, cores e tamanhos você é que definirá melhor:
Código:
//DESENHAR RECORDES

ini_open("recordes.ini")
for (idraw = 0; idraw < NumeroLugares; idraw += 1)//repete o codigo, o numero de lugares escolhidos
{
var Lugar;
Lugar=ini_read_real("lugares",string(idraw),0)//procura no arquivo ini, qual é o recorde do lugar indicado pela variável idraw da [for]. E grava na var Lugar
draw_text(10,idraw*16,string(idraw)+": "+string(Lugar))//desenha o recorde
}

ini_close()

Dica:
Tire uma "foto" da room de como esta quando o jogador perder com a função sprite_create_from_screen, e adicione uma sprite "fosca" como essa:aqui. Isso dará um bom efeito, e o código ficará assim:
Código:
//TIRAR "FOTO" DA ROOM

global.screen=sprite_create_from_screen(0,0,view_wview,view_hview,0,0,0,0);//salva a a tela na variavel global.screen
Código:
//DESENHAR RECORDES

draw_sprite(global.screen,0,0,0)//desenha a "foto" da tela
draw_sprite(spr_fosco,0,0,0)//desenha a sprite fosco

ini_open("recordes.ini")
for (idraw = 0; idraw < NumeroLugares; idraw += 1)//repete o codigo, o numero de lugares escolhidos
{
var Lugar;
Lugar=ini_read_real("lugares",string(idraw),0)//procura no arquivo ini, qual é o recorde do lugar indicado pela variável idraw da [for]. E grava na var Lugar
draw_text(10,idraw*16,string(idraw)+": "+string(Lugar))//desenha o recorde
}

ini_close()

4°-Entendendo melhor o código

Aqui vou explicar como esta salvo os recordes no arquivo ini, caso você queira fazer augo diferente isso é útil:
Dentro do arquivo tem umas "pastas" que servem para organizar o arquivo:
ARQUIVO>SEÇÃO>CHAVE>VALOR
ARQUIVO:
é o arquivo mesmo, no nosso caso "recordes.ini"
ini_open("recordes.ini")
SEÇÃO:
É a primeira pasta, que damos o nome de "lugares"
ini_write_real("lugares",NovoLugar,0)
CHAVE:
É a ultima pasta, que damos o nome conforme o numero do lugar:
"1"=primeiro
"2"=segundo
"3"=terceiro
...
Não percebemos muito isso, pois usamos sempre a variável da for:
ini_write_real("lugares",Numero na [for],0)
Valor:
É o que existe dentro de todas essas "pastas", ou seja o valor de cada recorde
ini_write_real("lugares",Lugar,score)
Ou seja se quiser encontrar o score do terceiro lugar, por exemplo, use:
Código:
terceiro=ini_read_real("lugares","3",0)



Aqui esta uma engine do tutorial:
Download

5°-O resultado

Aqui esta exemplos de jogos que usaram esse sistema de recordes:
Um jogo meu:
E na engine do tutorial:


..::Créditos::..
avatar
Data de inscrição : 18/01/2012
Número de Mensagens : 85
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 1

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Ter 21 Fev 2012, 18:06
Vlw,me ajudou bastante...
avatar
Ranking : Sem avaliações
Notas recebidas : B
Data de inscrição : 28/02/2012
Número de Mensagens : 1908
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 1
Reputação : 80

Prêmios
   : 2
   : 2
   : 1
Ver perfil do usuáriohttp://guitarmester.no.comunidades.net/index.php?pagina=19362978

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Qua 09 Maio 2012, 13:26
ta meio estranho esses jogos que você mostrou
imagem do seu jogo:

como o 2°lugar tem o SCORE maior que o primeiro, e maior que o terceiro???
avatar
Ranking : Nota D
Notas recebidas : D
Data de inscrição : 14/02/2010
Número de Mensagens : 911
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 3

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Qua 09 Maio 2012, 15:15
otimo tutorial!

As .ini são muito boas, pelo que sei da para fazer savegames nela e agora sistema de recordes Happy

Vou tentar fazer SaveGames e esse sistema de Recordes em .ini no meu proximo jogo!
avatar
Ranking : Nota C
Notas recebidas : B+D
Data de inscrição : 18/01/2011
Número de Mensagens : 482
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 5

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Qui 24 Maio 2012, 23:45
@theguitarmester escreveu:ta meio estranho esses jogos que você mostrou
imagem do seu jogo:

como o 2°lugar tem o SCORE maior que o primeiro, e maior que o terceiro???
kkk, é porque eu dei o Print-screen, quando não tava pronto ainda, estava com bug's..... Mas logo corrigirei isso!

E as outras respostas, muito obrigado!
avatar
Ranking : Nota A
Notas recebidas : A
Data de inscrição : 19/01/2009
Número de Mensagens : 98
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 7

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuário

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Seg 05 Nov 2012, 16:58
O Codigo esta errado.
Ao acrescentar um novo recorde ele nao atualiza as demais posições.
Aqui esta a versao correta:

Código:

//ADICIONAR NOVO RECORDE

recordeanterior=0;

for (i = 0; i < NumeroLugares; i += 1)//repete o codigo, o numero de lugares escolhidos
{
    ini_open("recordes.ini")
    Lugar=ini_read_real("lugares",string(i),0)//procura no arquivo ini, qual é o recorde do lugar indicado pela variavel i da [for]. E grava na variavel Lugar
   
    if score > Lugar//se score for maior que o lugar indicado pela variavel i da [for]
    {//quer dizer que score quebrou o recoude do lugar indicado pela variavel i da [for]

        recordeanterior=ini_read_real("lugares",string(i),score);//NEOFIX
        ini_write_real("lugares",string(i),score)//grava no arquivo ini a pontuação do novo recorde
        score=recordeanterior;//NEOFIX
        //exit;//como a [for] vai continuar encontrando os outrus lugares menores que o score, exit fecha o codigo, para preservar o valor dos outros lugares
    }
    ini_close();
}
avatar
Ranking : Nota C
Notas recebidas : D-B-C
Data de inscrição : 08/09/2010
Número de Mensagens : 914
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 5

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuáriohttp://luizgm.blogspot.com/

Re: [Tutorial] Sistema de Recordes com arquivo .ini

em Seg 05 Nov 2012, 17:54
Não querendo dar off topic, mas seria bom deixar esse arquivo fora do alcance do usuário, em uma pasta que ele não possa alterar o arquivo. Ou também deixar o arquivo oculto ou em "somente leitura".

Até+
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum