[resolvido] importando dados de arquivo de texto no GMS

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

[resolvido] importando dados de arquivo de texto no GMS

Mensagem por saim em Seg 17 Dez 2012, 20:00

>não sei por onde começar a pergunta...<
Estou criando um jogo que, teoricamente, seria simplérrimo. O jogo é aquele joguinho de ligar pontos, mas ao invés de comprar uma revista cheia deles na banca, por R$1,99, resolvi que seria legal fazer uma versão eletrônica, com possibilidade infinita de inclusão de novos desenhos.
Aí, pra ter essa possibilidade de expansão infinita, achei legal criar uma pasta "imagens", onde colocar as novas imagens. O jogo se encarrega de verificar quais imagens existem.
Aí, pra que os pontos ligados não estejam em posições definidas pelo jogador DURANTE o jogo (ou seja, pra ter um "certo" e um "errado"), achei legal estabelecer um formato de arquivo que venha com as coordenadas de cada ponto, além do número de pontos. O programa se encarrega de verificar se existe o arquivo de coordenadas e se existe um arquivo de imagem associado (eles têm o mesmo nome).
Aí, de quebra, achei legal criar um ícone-miniatura pra cada imagem, pro jogador escolher qual ele quer. Botei isso numa janelinha de seleção e funciona como a função file_get_open_name (ou coisa do tipo, ela não está nem na lista de obsoletas do GMS). Beleza.
Isso tudo antes de eu ganhar o GMS. Então estava usando um bocado de funções obsoletas, como o execute_file, pra determinar as coordenadas. Até criei um arquivo que gerar o arquivo de coordenadas no formato bonitinho, pré-determinado.

Aí vem o GMS e suas funções obsoletas. E eu me deparo com o fato que não posso mais simplesmente executar um arquivo externo como se fosse um script. Ok, vamos em frente. Ainda posso ler arquivos de texto, ainda posso transformar strings em números reais, dá pra me adaptar.
Mas está dando erro, não sei porque. O erro é comprido, então vai num spoiler:
erro:

___________________________________________
FATAL ERROR in
action number 1
of Other Event: User Defined 0
for object objLoader:

############################################################################################
VMError!! Occurred - Push :: Execution Error - Variable Get rmPlay
at gml_Object_objLoader_Other_10 (line -1) -
############################################################################################
############################################################################################
Local Variables :
arquivo = 0
larRoom = 567
altRoom = 640
i = 6
Self Variables :
list_icones = 6
back = 6
botaoPontos = 100008
botaoAlfab = 100009
botaoPlay = 100010
maxPos = -63
minPos = 0
abrir = "C:\Users\USER.NB-INFOWAY\Documents\Jogos\GM\liga pontos\imagens\ursinho.gml"
nArq = 6
px = { { 640 ,760 ,880 ,1000 ,1120 ,640}, }
botao = { { 100002 ,100003 ,100004 ,100005 ,100006 ,100007}, }
py = { { 0 ,0 ,0 ,0 ,0 ,120}, }
list_nomes = 0
list_bgs = 1
list_escalas = 2
list_pX = 3
list_pY = 4
list_nPontos = 5
Global Variables :
imagemJogo = 1
arquivoCoordenadas = "C:\Users\USER.NB-INFOWAY\Documents\Jogos\GM\liga pontos\imagens\alladin.gml"

Ok, suponho que "unknown source line" seja o problema, mas o que isso quer dizer? E porque funciona no game genérico (ou seja, GM8.0)?
E olha só como eu sou prático: ainda vou postar aqui (em outro spoiler maior ainda) toda informação do objLoader! Já está meio comentado, mas posso responder perguntas. O erro acontece quando eu tento executar o evento User Defined 0 (que inseri porque o GMS não tem triggers...)
objLoader:
Information about object: objLoader
Sprite:
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent:
Mask:

Create Event:

execute code:

draw_set_halign(1); draw_set_valign(0);

// define algumas variáveis de geometria
var tamanhoIcone, borda, espIcone, nCols;
tamanhoIcone = 100; //tamanho de cada ícone, em pixels
borda = 20; //espaço entre ícones
espIcone = tamanhoIcone + borda; //espaço total ocupado por ícone
nCols = ceil(view_wview[1] / espIcone); //número de colunas (que cabem no espaço disponível pela view)

// carrega os arquivos e define nome, sprite, escala e número de pontos
var primeiroOK, arqCoor, arqImag, nome, sprite, sprIco;
primeiroOK = 0; // valor a somar ao contador se o primeiro arquivo tiver imagem
arqCoor = file_find_first(working_directory + "\imagens\*.gml", fa_archive);

list_nomes = ds_list_create(); //lista de nomes a serem exibidos na tela
list_bgs = ds_list_create(); //lista de desenhos no tamanho normal
list_escalas = ds_list_create(); //lista de fatores de escala pra criar os ícones
list_pX = ds_list_create(); //lista de coordenadas X
list_pY = ds_list_create(); //lista de coordenadas Y
list_nPontos = ds_list_create(); //lista de total de pontos
list_icones = ds_list_create(); //lista de ícones

if (arqCoor == ""){ // se não tem algum arquivo
show_message("faltam arquivos");
game_end();
exit;
}
else{ // se tem algum arquivo
arqImag = string_copy(arqCoor, 0, string_length(arqCoor) - 3) + "png";
if (file_exists(working_directory + "\imagens\" + arqImag)){ // se o arquivo tem imagem associada
primeiroOK = 1; //se o primeiro arquivo tiver imagem, o contador começa em 1

nome = string_copy(arqCoor, 0, string_length(arqCoor) - 4); //nome do arquivo, sem extensão
ds_list_add(list_nomes, nome); //bota o nome na lista
back = background_add(working_directory + "\imagens\" + nome + ".png", 0, 0); //joga a imagem num background
ds_list_add(list_bgs, back); //joga o background na lista
ds_list_add(list_escalas, tamanhoIcone / max(background_get_width(back), background_get_height(back))); // calcula um fator de escala pra produzir o ícone

carregaCoordenadas(working_directory + "\imagens\" + arqCoor, list_pX, list_pY); // lê o arquivo e alimenta as listas
ds_list_add(list_nPontos, ds_list_size(list_pX)); //pra ordenar por ordem de dificuldade
}
}
var i;
i = primeiroOK; //contador de arquivos. 0 se o primeiro encontrado não tiver imagem, 1 se tiver.
while(1){
arqCoor = file_find_next();
if (arqCoor != ""){ // se ainda tem coordenadas pra procurar
arqImag = string_copy(arqCoor, 0, string_length(arqCoor) - 3) + "png";
if (file_exists(working_directory + "\imagens\" + arqImag)){ // se a coordenada tem uma imagem associada

nome = string_copy(arqCoor, 0, string_length(arqCoor) - 4); //nome do arquivo, sem extensão
ds_list_add(list_nomes, nome); //bota o nome na lista
back = background_add(working_directory + "\imagens\" + nome + ".png", 0, 0); //joga a imagem num background
ds_list_add(list_bgs, back); //joga o background na lista
ds_list_add(list_escalas, tamanhoIcone / max(background_get_width(back), background_get_height(back))); // calcula um fator de escala pra produzir o ícone

carregaCoordenadas(working_directory + "\imagens\" + arqCoor, list_pX, list_pY); // lê o arquivo e alimenta as listas
ds_list_add(list_nPontos, ds_list_size(list_pX)); //pra ordenar por ordem de dificuldade

i += 1;
}
else { //se não tem imagem associada, ignora e toca pra frente
continue;
}
} // se não tem arquivo, pára de procurar arquivos
else {
break;
}
}
nArq = i;
// aqui os arquivos estão carregados

//cria os ícones e define as posições deles
var Surf, xx, yy;
Surf = surface_create(tamanhoIcone, tamanhoIcone);
for(i = 0; i < nArq; i += 1){
xx = (tamanhoIcone - (background_get_width(ds_list_find_value(list_bgs, i)) * ds_list_find_value(list_escalas, i))) / 2; //centraliza
yy = (tamanhoIcone - (background_get_height(ds_list_find_value(list_bgs, i)) * ds_list_find_value(list_escalas, i))) / 2; //centraliza
surface_set_target(Surf);
draw_clear_alpha($ff6688, 0.2); //faz um fundo
back = ds_list_find_value(list_bgs, i); //puxa da lista
draw_background_ext(back, xx, yy, ds_list_find_value(list_escalas, i), ds_list_find_value(list_escalas, i), 0, $ffffff, 1); //desenha
surface_reset_target();
sprIco = sprite_create_from_surface(Surf, 0, 0, tamanhoIcone, tamanhoIcone, 0, 0, 0, 0); //cria a sprite
ds_list_add(list_icones, sprIco); //joga na lista

px[i] = (i mod nCols) * espIcone + room_width; //posição do ícone
py[i] = (i div nCols) * espIcone; //posição do ícone
}
surface_free(Surf);

//cria os botões
var maxNomes;
maxNomes = 0;
for(i = 0; i < nArq; i += 1){
botao[i] = instance_create(px[i], py[i], objBotaoImagem);
botao[i] . sprite_index = ds_list_find_value(list_icones, i);
botao[i] . nome = ds_list_find_value(list_nomes, i);
maxNomes = max (string_height(botao[i] . nome), maxNomes);
}

//cria os botões de comando
botaoPontos = instance_create(borda, borda * 2 + view_hview[1], objBotaoOrdem);
botaoPontos . minhaPrioridade = list_nPontos;
botaoPontos . texto = "dificuldade";
botaoPontos . sprite_index = sprBotaoNume
botaoAlfab = instance_create(borda, borda * 3 + 40 + view_hview[1], objBotaoOrdem);
botaoAlfab . minhaPrioridade = list_nomes;
botaoAlfab . texto = "alfabetico";
botaoAlfab . sprite_index = sprBotaoAlfa;
botaoPlay = instance_create(borda + 80, borda * 2 + view_hview[1], objBotaoPlay);

// cria os botões de comando da view
maxPos = botao[nArq - 1] . y + tamanhoIcone + 2 + maxNomes - view_hport[1];
minPos = 0;
with(instance_create(view_xport[1] + view_wport[1], view_yport[1], objBotaoView)){
lado = -1; //pra SUBIR a view
sprite_index = sprBotaoUp;
maxPos = other . maxPos; minPos = other . minPos;
}
with(instance_create(view_xport[1] + view_wport[1], view_yport[1] + view_hport[1] - sprite_get_height(sprBotaoDn), objBotaoView)){
lado = 1; //pra SUBIR a view
sprite_index = sprBotaoDn;
maxPos = other . maxPos; minPos = other . minPos;
}
with (instance_create(view_xport[1] + view_wport[1], view_yport[1] + sprite_get_height(sprBotaoUp), objCtrlView)) {
maxPos = other . maxPos; minPos = other . minPos; dView = maxPos - minPos;
}

// ajeita os botões por ordem de dificuldade
ordenaIcones(list_nPontos, true, $8888ff); //o mesmo que apertar o botaoPontos

Other Event: User Defined 0:

execute code:

// define qual imagem usar e vai pra room_play, deletando tudo o que for descartável

var arquivo, i;
arquivo = -1;

for(i = 0; i < nArq; i += 1){
if (botao[i] . chosen == true){
arquivo = i;
}
}
if (arquivo == -1){
exit;
}
else {
for(i = 0; i < nArq; i += 1){
if (i != arquivo){
background_delete(ds_list_find_value(list_bgs, i));
}
sprite_delete(ds_list_find_value(list_icones, i));
}
globalvar imagemJogo, arquivoCoordenadas;
imagemJogo = ds_list_find_value(list_bgs, arquivo);
arquivoCoordenadas = working_directory + "\imagens\" + ds_list_find_value(list_nomes, arquivo) + ".gml";
}

ds_list_destroy(list_nomes);
ds_list_destroy(list_bgs);
ds_list_destroy(list_escalas);
ds_list_destroy(list_pX);
ds_list_destroy(list_pY);
ds_list_destroy(list_nPontos);
ds_list_destroy(list_icones);

var larRoom, altRoom;
larRoom = background_get_width(imagemJogo) + sprite_get_width(sprBotaoVolta) + 4;
altRoom = background_get_height(imagemJogo);
room_set_width(rmPlay, larRoom);
room_set_height(rmPlay, altRoom);

room_set_view(rmPlay, 0, true, 0, 0, larRoom, altRoom, 0, 0, larRoom, altRoom, 0, 0, 0, 0, noone);
// room_set_view(index, vind, vis, xview, yview, wview, hview, xport,yport,wport, hport, hborder, vborder, hspeed, vspeed, obj)
room_set_background(rmPlay, 0, 1, 0, imagemJogo, 0, 0, 0, 0, 0, 0, 1);
//room_set_background(ind,bind,vis,fore, back, x, y,htiled,vtiled,hspeed,vspeed,alpha);

room_goto(rmPlay);

Draw Event:

execute code:

draw_rectangle(view_xport[1] - 1, view_yport[1] - 1, view_xport[1] + view_wport[1], view_yport[1] + view_hport[1], 0);

Key Press Event for Key:

execute code:

view_yview[1] = max(view_yview[1] - 1, minPos);

Key Press Event for Key:

execute code:

view_yview[1] = min(view_yview[1] + 1, maxPos);
Num último spoiler, o script que lê as coordenadas e joga nas ds_lists. O tamanho das ds_lists vai ser o número de pontos de cada imagem:
carregaCoordenadas:
// carregaCoordenadas(arquivo texto, ds_list X, ds_list Y);
// lê o arquivo de texto dado como argumento, transformando os valores lidos em dados de coordenadas
// coloca os dados de coordenadas nas ds_lists dadas como argumento
var arquivo, listaX, listaY, lendo;
abrir = argument0; listaX = argument1; listaY = argument2;
ds_list_clear(listaX); ds_list_clear(listaY); // limpa as lists
// abre o arquivo
lendo = file_text_open_read(abrir);
var linhaX, linhaY, outlinha, pos1, pos2;
linhaX = file_text_read_string(lendo);
// acha a primeira linha
while(string_count("]", linhaX) < 2 && !file_text_eof(lendo)) {
file_text_readln(lendo);
linhaX = file_text_read_string(lendo);
}
// copia as coordenadas da linha pras ds_lists
while(string_count("]", linhaX) == 2 && !file_text_eof(lendo)){
pos1 = string_pos("]", linhaX); pos2 = string_pos(";", linhaX); //usar "]" e ";" como limitadores
outlinha = string_copy(linhaX, pos1 + 4, pos2 - (pos1 + 4)); //muito cuidado ao manter os espaçamentos corretos
ds_list_add(listaX, real(outlinha)); // joga a coordenada na lista
linhaY = string_copy(linhaX, pos2 + 2, string_length(linhaX)); //elimina parte da linha, repete o processo
pos1 = string_pos("]", linhaY); pos2 = string_pos(";", linhaY);
outlinha = string_copy(linhaY, pos1 + 4, pos2 - (pos1 + 4));
ds_list_add(listaY, real(outlinha));

file_text_readln(lendo);
linhaX = file_text_read_string(lendo);
}

file_text_close(lendo);


Última edição por saim em Qua 19 Dez 2012, 08:21, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por Alex FC em Seg 17 Dez 2012, 20:32

O erro é sobre a variável rmPlay você não a declarou em lugar algum. Pelo que vi ela armazena uma room.

Bom, é isso que consegui achar.

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por saim em Seg 17 Dez 2012, 22:06

Puxa vida(1), é verdade!
Eu tinha mudado o jogo porque a room estava ficando "esticada", achei que criá-la via código resolveria. Fiz uma room "rmInicializa" que adiciona a rmPlay e vai pra rmLoad. Deu certo, depois de você me mostrar o erro. Eu tinha esquecido de falar pra rmInicializa ser a primeira do jogo.

Variable Get rmPlay. Beleza, vou me lembrar dessa linha da próxima vez que surgir um erro.

Mas isso não resolveu o problema da room esticada, como eu imaginei que resolveria... Posso continuar aqui ou devo abrir um novo tópico? A room é criada com a largura da imagem (+ espaço pra um botão de voltar) e altura da imagem. O código está no user_event do objLoader, acima.

(1)Não sabia que a palavra que coloquei antes de "puxa vida" era considerada palavrão...

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por Kabeção em Ter 18 Dez 2012, 12:15

saim escreveu:Puxa vida(1), é verdade!
Eu tinha mudado o jogo porque a room estava ficando "esticada", achei que criá-la via código resolveria.
Então, a view e a janela propriamente dita do jogo são coisas diferentes.
Você pode encarar a view como uma surface que é esticada até atingir o tamanho da tela.

Por conveniência o GMS automaticamente define o tamanho da janela de acordo com a primeira room. Mudar as configurações da view depois de inicializado o jogo não vai mudar a janela.
Você pode fazer isso manualmente com window_set_size.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por saim em Ter 18 Dez 2012, 13:25

Kabeção escreveu:Por conveniência o GMS automaticamente define o tamanho da janela de acordo com a primeira room.
Entendi. Achei que o room_set_width/height resolveria, já que no caso do GM8.0, resolve.
Beleza. window_set_size. Vou tentar e volto a postar (ou edito esse post).
Valeu!

...

Mas se room_width/height não serve pra definir o tamanho da janela... então não serve pra muita coisa, né?
Quer dizer, é um valor de referência, a gente já está acostumado a usar e tal, tem até o evento out_of_room... Mas fora isso, me parecem umas constantes meio insossas.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por Kapoty em Ter 18 Dez 2012, 13:27

Saim, acho que é necessário sim, caso seu jogo use view, você pode definir o tamanho da room maior do que o da view...

Kapoty

Ranking : Nota B
Número de Mensagens : 635
Data de inscrição : 05/11/2011
Notas recebidas : E + D + C + B + D +B + A
Reputação : 22
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por saim em Qua 19 Dez 2012, 08:20

Sim, sim, isso eu já faço. O lance é que no GM8.0, a janela em que a room fica é dimensionada pro tamanho da room automaticamente. A diferença em questão é entre o tamanho do room e da janela, as views são outra história.
Mas depois eu pensei direitinho e realmente é útil ter limites da room independentes do tamanho da janela na tela. Bobagem minha não ver a diferença antes, agora que mudei de idéia fica até difícil ver a relação.

Ah, só pra encerrar o assunto, o window_set_size funcionou como um relógio! Tive que usar mais uma vez, por causa da volta à room de seleção, mas ficou lindo!

Tópico resolvido!

Tópico resolvido, tópico trancado para evitar posts desnecessários.
Caso o autor deseje reabrir, contacte um moderador.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] importando dados de arquivo de texto no GMS

Mensagem por Conteúdo patrocinado Hoje à(s) 17:56


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