[Resolvido]Erro em surfaces

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

Resolvido [Resolvido]Erro em surfaces

Mensagem por Rhino em Ter 12 Out 2010, 22:31

Olá!
Gostaria de saber como eu poderia ajustar o meu obj_surface para acabar com este erro: "Trying to use non-existing surface."
Sei que ele é bem comum, pois já vi várias pessoas sofrendo com ele e não obtendo muitos resultados. No caso do meu jogo, eu gostaria de saber como eu poderia fazer para que, ao dar load game na tela inicial, o player, caso tiver salvado em uma room cujo obj_surface estiver operando, não sofra mais com ele.
Andei lendo que precisaria chamar o objeto novamente ou coisa do tipo. A informação procede?


Última edição por Rhino em Ter 19 Out 2010, 20:52, editado 1 vez(es)

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Convidad em Ter 12 Out 2010, 22:55

Você pode tentar checar se a surface existe com a função surface_exists(id). Se ela não existir é só recriá-la, porém, o conteúdo dela não será o mesmo afinal, você fez o load. Contanto que você não necessite arbitrariamente do conteúdo e sim, apenas as vantagens de se usar surface, vai funcionar normalmente!

Mas se porventura vier àlgum erro, esse tópico aqui me ajudou bastante:
http://www.gamemakerbrasil.com/perguntas-respostas-f8/erro-em-surface-de-video-t11112.htm

Boa sorte!

Convidad
Convidado


Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Ter 12 Out 2010, 23:08

E aonde eu colocaria isso? No objeto que dá load no jogo?
Código:
if surface_exists(global.surface)
{
//load
}
else
{
instance_create(x,y,obj_surface)
//load
}

Seria isso?

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Convidad em Ter 12 Out 2010, 23:34

Você pode fazer o seguinte: no evento de criação da room confira lá se a surface existe, independentemente do fato de que a partida tenha sido restaurada pelo load ou não. Se a surface não existir, então é só criá-la. O envento Create da room acontece antes dos eventos Create dos objetos, eliminando alguns erros que possam ocorrer:

Código:
if not surface_exists(global.surface) then global.surface := surface_create(w,h);

Mas isso pode depender muito de como seu jogo está programado ou de como você vem fazendo o load! Você também poderia checar se a variável que contém o id da surface existe, por exemplo:

Código:
if not variable_global_exists('surface') then global.surface := surface_create(w,h);

Em qualquer hipótese, pra eliminar definitivamente qualquer possibilidade de erros, você pode criar um objeto que monitora essa surface o tempo todo. Crie-o na primeira room do jogo e marque-o como persistente para que ele exista nas outras rooms. No step dele, você pode colocar quaisquer dos códigos acima (de preferência, o primeiro). Você só terá que ter cuidado para que não crie duas surfaces, caso esse objeto seja criado antes da surface!

Como eu disse, vai depender de como seu jogo está programado e de como você faz o load, então, o que eu escrevi são apenas ideias... Boa sorte!

Convidad
Convidado


Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Qua 13 Out 2010, 13:44

Tentei fazer isso no Creation Code da Room que tem o obj_surface e não consegui.
Outra coisa que também tentei foi no obj_surface, no evento de Draw, colocar a condição "if surface_exists", mas não adiantou. :/

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por diego333 em Qua 13 Out 2010, 15:31

vish , tente isso , assim que vc criar a surface ja checa o retorno
Código:

surf =surface_create(640,480):
if (surf < 0)
{
show_message("vc nao tem memória o suficiente");
}

diego333

Número de Mensagens : 84
Data de inscrição : 06/10/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Qua 13 Out 2010, 21:07

Não adiantou, diego333!
Por enquanto eu estou usando o sistema do GM mesmo de salvar (F5 e F6), porém mais pra frente vou modificar. Mesmo assim, o erro persiste.
Ajudem, por favor! Sad

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Convidad em Qua 13 Out 2010, 23:02

Na hora em que você faz o load, o Game Maker tá perdendo a referência dessa surface, Quando você faz o load, a variável global.surface ainda terá o id da surface, porém o Game Maker não porá acessá-la na memória. Quem sabe pode ser isso...

Então faça o seguinte, EXCLUA primeiro a surface ANTES de recriá-la, tente isso:

Código:
surface_free(global.surface);
global.surface := surface_create(tamanho_w,tamanho_h);

Ou então, tenta uma forma mais "radical":

Código:
for (s := 0; s <= 1000; s += 1) begin if surface_exists(s) then surface_free(s); end;
global.surface := surface_create(tamanho_w,tamanho_h);

Convidad
Convidado


Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por diego333 em Qua 13 Out 2010, 23:26

no loadgame do game maker ele carrega surfraces da memoria vc vai ter q fazer assim
Código:

load_game(...) //  carrega o jogo e ja cria a surface denovo , o save e load game do game maker n salva surfaces , particulas , etc
if not surface_exists(global.surface)
{
global.surface = surface_create(tamanho_w,tamanho_h);
}

diego333

Número de Mensagens : 84
Data de inscrição : 06/10/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Denis Lemos em Qui 14 Out 2010, 14:54

Essas surfaces são bem danadas

Veja o que o help diz sobre o que não se pode fazer com as surfaces:
Alguns cuidados devem ser tomados ao usar essas funções. Em particular, observar o seguinte:

Você nunca deve alterar o destino de desenho enquanto você está realmente de desenho na tela, ou seja, nunca usá-lo na elaboração de eventos. Isso vai causar problemas sérios com a projeção e visor.
Superfícies não funcionam corretamente com o modo 3D. Você pode usá-los, embora não no modo 3D (por d3d_end chamando () antes de utilizá-los), mas quando você começar o modo 3D novamente as superfícies serão destruídos.
Por razões de velocidade, a superfície é mantida em videomemory só. Como resultado, você pode perder a superfície quando, por exemplo as mudanças de resolução de tela ou protetor de tela aparece.
Superfícies não serão salvos quando salvar o jogo.
Note bem na última linha !
As surfaces não podem ser salvas, então quando você der o load_game acho que ela não existirá mais !

Bom, eu não testei, mas na lógica acho que pode funcionar, eu faria assim para salvar o jogo e não perder o conteúdo da surface !

No Evento que "SALVA" o jogo:
surface_save(surf,fname) // Salva a imagem da surface em alguma pasta, ela é salva no formato PNG
game_save(filename) // E só depois salvar o jogo

Agora no Evento de "LOAD":

game_load(filename) // Carrega o jogo primeiramente
var back; // Declara uma variável que puxará o recurso da surface para o jogo
back=background_add(fname,removeback,smooth) // Carrega a surface salva como uma background
if not surface_exists(surf) // Se não existir a surface
{
surf=surface_create( background_get_width(back),background_get_height(back) ) // Cria a surface com as dimensões da back, que é a surface salva anteriormante !
}
surface_set_target(surf) // Inicia a surface
draw_background(back,0,0) // Desenha a back da surface salva
surface_reset_target() // Desliga a surface

background_delete(back) // Deleta a back para liberar memória, pois ela já está desenhada na surface "(surf)"
Obs: Não tenho certeza, mas talvez seja necessário declarar também o nome da variável "surf" junto onde foi declarada a variável "back", depois que der load, mas acho que é somente a surface que some a variável fica ainda no jogo, mas todo caso se der erro, tente colocar assim no load onde declara a variável "back":
var back, surf;

Háh, também acho que não seja necessário verificar se a surface existe quando der o load, acho que basta somente criar uma nova com o mesmo ID, pois se ela existir ela só vai ser subistituída por esse nova, pelo menos é o que eu acho: se o código de load de cima não funcionar tente somente assim:

game_load(filename) // Carrega o jogo primeiramente
var back; // Declara uma variável que puxará o recurso da surface para o jogo
back=background_add(fname,removeback,smooth) // Carrega a surface salva como uma background
surf=surface_create( background_get_width(back),background_get_height(back) ) // Cria a surface com as dimensões da back, que é a surface salva anteriormante !
surface_set_target(surf) // Inicia a surface
draw_background(back,0,0) // Desenha a back da surface salva
surface_reset_target() // Desliga a surface

background_delete(back) // Deleta a back para liberar memória, pois ela já está desenhada na surface "(surf)"
Lembrando de declarar a variável "surf" junto com a back, caso seja necessário !

Fiz aqui de cabeça, mas acho que vai funcionar, agora é só você preencher alguns argumentos que eu coloquei só os nomes deles, pois é a sua escolha !

Té + flw

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Qui 14 Out 2010, 15:16

Então Denis, eu segui o seu raciocínio e o do diego333 e realmente deu certo.
Mas no caso, simplifiquei o código. Porém, como eu disse anteriormente, eu iria mudar o sistema de salvar e dar load (pra não ficar aquela coisa de F5 e F6 que vem no próprio GM). Mas agora, meio que parou de funcionar!

Por exemplo: Se estou fase 3 (que tem surface), salvo e vou para o menu dar load para testar, aparece erro de "Trying to use a non-existing surface."!
Gostaria de saber como que eu poderia ajustar o código, pois já tentei colocar a parte "instance_create(x,y,obj_surface)" no evento Room Start do obj_controle (obj_surface e obj_controle não são os mesmos) para evitar o erro e não deu certo! Estou usando os seguintes códigos:

Evento Create do obj_controle:

Código:
if !surface_exists(global.surface)
{
instance_create(x,y,obj_surface)
}

Botão de Load Game no Menu Principal:
Código:
load=get_open_filename("*.sav","")
game_load(load)

Botão de Save Game no Menu do Player:
Código:
save=get_save_filename("*.sav","")+".sav"
game_save(save)

Não sei se deu pra entender muito bem, mas qualquer coisa tento explicar novamente. Razz


EDIT:

Vou postar os códigos que eu usava anteriormente para salvar/load:

Botão F5 do obj_player:
Código:
game_save("jogo.sav")

Botão F6 do obj_player:
Código:
if !surface_exists(global.surface)
{
instance_create(x,y,obj_surface)
game_load("jogo.sav")
}

Desse jeito funcionava!

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por diego333 em Qui 14 Out 2010, 17:04

no botao de load coloca
Código:

load=get_open_filename("*.sav","")
game_load(load)
    if !surface_exists(global.surface)
    {
    global.surface = surface_create(640,480);
    }

diego333

Número de Mensagens : 84
Data de inscrição : 06/10/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Qui 14 Out 2010, 17:16

Eu já tinha tentado dessa maneira. O problema é que deu esse erro:

"Unknown variable surface."

Outra coisa, se eu clicar em "Cancelar" depois de apertar para dar load, o jogo dá o mesmo erro! Sad

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Denis Lemos em Qui 14 Out 2010, 18:02

Então não crie a surface quando der o Load, já que você disse que ela fica lá em outra room, então a crie somente quando iniciar aquela room, fazendo o esquema de ADD a back da surface salva na hora do save_game e gravar na surface quando ela for criada, pois não é necessário estar gastando memória se ainda não vai precisar dessa surface !

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por diego333 em Qui 14 Out 2010, 18:24

Código:

load=get_open_filename("*.sav","")
game_load(load)
    if variable_global_exists('surface) && !surface_exists(global.surface)
    {
    global.surface = surface_create(640,480);
    }

diego333

Número de Mensagens : 84
Data de inscrição : 06/10/2010
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Denis Lemos em Qui 14 Out 2010, 21:54

Cara aconteceu um erro parecido comigo no programa que estou desenvolvendo, usando a função get_open_filename, pois se fechar sem selecionar nada vai dar erro dizendo que não existe mesmo a surface, e acho que o código que o diego333 passou acima, também vai dar o mesmo erro novamente !

Para resolver é bem simples, temos que saber se a pessoa selecionou ou não algum arquivo, então vou fazer usando o código acima do diego333, aí depois você tenta adapitar ao seu código:
Código:


load=get_open_filename("*.sav","")
if load!='' { game_load(load) } else break;

    if variable_global_exists('surface) && !surface_exists(global.surface)
    {
    global.surface = surface_create(640,480);
    }
É um bom exemplo para aprender o uso do '"break" !

Explicação:

É criada avariável "load" para abrir a janela e procurar o endereço do arquivo certo ? Sim, daí o que fiz depois foi só ver se ela não está vindo vazia, e caso ela tenha vindo vazia"(fechado a janela ou cancelado)" vai breka a função e não vai continuar o load game, não dando mais o erro !

Caso você não consiga, me passe o código que você está usando para eu ver se corrijo, agora estou sem tempo !

Fui e até amanhã !!!

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Qui 14 Out 2010, 22:57

Obrigado Denis, consegui arrumar agora o código quando apertar o botão de cancelar! Very Happy
Esse "break" é usado quando queremos cancelar uma ação ou fazer com que não dê em nada?

Sobre a surface: Eu tentei jogar este código no obj_controle novamente e não funcionou.

Código:
if variable_global_exists(global.surface) and !surface_exists(global.surface)
{
instance_create(x,y,obj_surface)
}

Eu não entendo como que anteriormente funcionava e agora não funciona mais. Antes mesmo se eu estivesse em outra room e clica-se no F6, não dava esse problema, mas agora que troquei o sistema de save/load, começou a não dar mais! ;(

PS: uso instance_create pois no obj_surface há códigos que ligam-se com os objetos de luz.

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Denis Lemos em Sex 15 Out 2010, 14:00

O break, ele interrompe a função e não executa os códigos que vem a seguir !

Vou fazer aquele primeiro código que passei, com esse último erro corrigido, pois você disse que funcionou, e quando você mudou o esquema de load deu o problema !


var load;
load=get_open_filename("*.sav","") // Pega o endereço
if load!='' // Se ele "NÃO" vier vazio !
{
game_load(load) // Carrega o jogo primeiramente
}
else { break; } //Senão para por aqui
var back; // Declara uma variável que puxará o recurso da surface para o jogo
back=background_add(fname,removeback,smooth) // Carrega a surface salva como uma background
surf=surface_create( background_get_width(back),background_get_height(back) ) // Cria a surface com as dimensões da back, que é a surface salva anteriormante !
surface_set_target(surf) // Inicia a surface
draw_background(back,0,0) // Desenha a back da surface salva
surface_reset_target() // Desliga a surface

background_delete(back) // Deleta a back para liberar memória, pois ela já está desenhada na surface "(surf)"
Assim só vai seguir a função se a pessoa selecionar um caminho, caso contrário ela para !

Se não funcionar, moste o script que você está usando para o load !

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Rhino em Ter 19 Out 2010, 20:51

Consegui fazer funcionar Denis (quer dizer, até agora não deu nenhum erro Very Happy)! Mas fiz de um jeito mais fácil e simples:

Na tela inicial, coloquei o obj_surface e marquei "persistent" (programei-o para apenas criar a surface se estiver na room desejada), assim, quando der load, automaticamente ele detecta a room e não preciso criar novamente a surface!

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Erro em surfaces

Mensagem por Conteúdo patrocinado Hoje à(s) 12:19


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