[Tutorial] Sistema de Recordes com arquivo .ini

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

[Tutorial] Sistema de Recordes com arquivo .ini

Mensagem por irlansn 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::..

irlansn

Ranking : Nota C
Número de Mensagens : 482
Idade : 18
Data de inscrição : 18/01/2011
Notas recebidas : B+D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

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

Mensagem por fbixd em Ter 21 Fev 2012, 18:06

Vlw,me ajudou bastante...

fbixd

Número de Mensagens : 85
Idade : 17
Data de inscrição : 18/01/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

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

Mensagem por theguitarmester 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???

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

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

Mensagem por peixoto 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!

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

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

Mensagem por irlansn 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!

irlansn

Ranking : Nota C
Número de Mensagens : 482
Idade : 18
Data de inscrição : 18/01/2011
Notas recebidas : B+D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

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

Mensagem por Neofix 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();
}

Neofix

Ranking : Nota A
Número de Mensagens : 98
Data de inscrição : 19/01/2009
Notas recebidas : A
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

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

Mensagem por Luiz A. Oliveira 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é+

Luiz A. Oliveira

Ranking : Nota C
Número de Mensagens : 914
Idade : 19
Data de inscrição : 08/09/2010
Notas recebidas : D-B-C
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://luizgm.blogspot.com/

Voltar ao Topo Ir em baixo

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

Mensagem por Conteúdo patrocinado Hoje à(s) 03:45


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