[Trancado] erro: out of memory

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

[Trancado] erro: out of memory

Mensagem por saim em Ter 26 Mar 2013, 21:30

tenho um objeto-parent que, quando colide com outro objeto-parent deve destruir as duas instâncias, criando um outro objeto-efeito. Esse objeto-efeito precisa ter uma sprite que é igual às duas sprites anteriores juntas. Pra isso, eu elaborei um script que cria a nova sprite e posiciona o objeto corretamente.
Aí, no evento de colisão, eu destruo as duas instâncias, garantindo que apenas uma delas irá rodar o evento.
Todos os childs têm "event_inherited()" no começo do create e nenhum deles tem o evento de colisão (garantindo que o evento rode).

Entretanto, ao fazer isso, o GMS me dá a mensagem "out of memory" e fecha o jogo.

Por que?

eis os códigos do objeto-parent:
>create<
Código:
jaCriou = false;
>colisão<
Código:
if (jaCriou == false){
   
    with(instance_create(0, 0, objEfBoom)){
        sprite_index = criaSpriteBoom(id, other . id);
        // sprite_index = other . sprite_index; // se eu troco qual linha está comentada, o erro não acontece
        }
   
    with(other){
        jaCriou = true;
        instance_destroy();
        }
    instance_destroy();
   
    }
e o script "criaSpriteBoom" é:
Código:
 // cria uma sprite que é a soma das duas sprites dadas como argumentos, nas posições originais, com origem no centro
// posiciona o objeto de modo que sua sprite sobreponha as originais

var instancia1, instancia2,x1, x2, y1, y2 lar, alt, Surf, Sprite;
instancia1 = argument0; instancia2 = argument1;
x1 = min(instancia1 . bbox_left, instancia2 . bbox_left);
x2 = max(instancia1 . bbox_right, instancia2 . bbox_right);
y1 = min(instancia1 . bbox_top, instancia2 . bbox_top);
y2 = max(instancia1 . bbox_bottom, instancia2 . bbox_bottom);
lar = x2 - x1; alt = y2 - y1;

Surf = surface_create(lar, alt);
surface_set_target(Surf);
draw_clear_alpha($000000, 0);
draw_sprite(instancia1 . sprite_index, instancia1 . image_index, instancia1 . x - x1, instancia1 . y - y1);
draw_sprite(instancia2 . sprite_index, instancia2 . image_index, instancia2 . x - x1, instancia2 . y - y1);
surface_reset_target();

Sprite = sprite_create_from_surface(Surf, 0, 0, lar, alt, 0, 0, lar / 2, alt / 2);
surface_free(Surf);

x = x1 + lar / 2; y = y1 + alt / 2; // posiciona o objeto

return(Sprite);


[edit] faltou uma informação: eu testei o script em outro projeto, só com dois objetos e o evento de rodar o script quando apertasse "enter". A sprite foi criada na posição correta, não deu o erro.
[edit2] No outro projeto, se eu movo o evento pra uma colisão, o erro acontece novamente... estranho!


Última edição por saim em Qua 27 Mar 2013, 10:07, editado 3 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: [Trancado] erro: out of memory

Mensagem por Gonçalves em Ter 26 Mar 2013, 21:33

Não sei se é isso, mas olhando rápido dá pra perceber que você define como true o jaCriou do other, e não do próprio objeto, o que permite que o loop siga ativo. E criando várias instâncias, provavelmente o jogo trave mesmo.

Depois olho com mais calma se não for isso...

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Trancado] erro: out of memory

Mensagem por saim em Ter 26 Mar 2013, 22:30

Essa variável só existe pra evitar das duas instâncias criarem o objEfBoom. A primeira instância roda o código, define "jaCriou" como "true" pra segunda, que não vai mais rodar o código. Não existe (ou não deveria existir) loop. O objEfBoom não é child do objeto. Repare naquela linha em comentário.

Ah, tenho que adicionar uma informação. Vou editar o post inicial.

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: [Trancado] erro: out of memory

Mensagem por PedroX em Ter 26 Mar 2013, 22:52

Não há erros no seu código. O problema é do seu computador. Pesquisando por "out of memory", você encontrará vários resultados.

Há um artigo no Wikipedia: http://en.wikipedia.org/wiki/Out_of_memory

E ao que tudo indica não é limitação de hardware (física).

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Trancado] erro: out of memory

Mensagem por saim em Ter 26 Mar 2013, 23:00

PedroX escreveu:O problema é do seu computador.
Estranho. Porque, então, no outro projeto, o erro não aconteceu? (ver o edit do primeiro post)
Se importa de testar o projeto? (está em formato .zip, GMS)

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: [Trancado] erro: out of memory

Mensagem por PedroX em Ter 26 Mar 2013, 23:10

Claro que não me importo. Era o que eu ia pedir. O erro aconteceu aqui também.

Mas acho que sei o erro:
Código:
  with(instance_create(0, 0, objEfBoom)) sprite_index = criaSpriteBoom(id, other . id);

Se era pra ser os dois anteriores juntos, então seria:
Código:
 var ele; ele=other.id; with(instance_create(0, 0, objEfBoom)) sprite_index = criaSpriteBoom(other.id, other.ele);

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Trancado] erro: out of memory

Mensagem por saim em Ter 26 Mar 2013, 23:48

É isso mesmo! Eu estava usando a variável "id" dentro do "with", o que causava (de fato) um loop. O objeto, pra definir seu sprite_index, usava o próprio sprite_index!
Tá, talvez não seja um loop INFINITO, mas acho que isso transtornou a máquina...

Agora funcionou! Pode trancar o tópico!

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: [Trancado] erro: out of memory

Mensagem por PedroX em Ter 26 Mar 2013, 23:57

É que o código foi traduzido assim:

with(objEfBoom) sprite_index = criaSpriteBoom(objEfBoom, objCriador);

Sendo que era pra ser assim:

with(objEfBoom) sprite_index = criaSpriteBoom(objCriador, objCriador);

O problema é que o other dentro do with() serve para quem chamou. E dentro da colisão para o outro objeto colidindo. Ou seja, você confundiu. O other lá dentro aplicava-se ao principal da colisão e não ao secundário.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Trancado] erro: out of memory

Mensagem por Conteúdo patrocinado Hoje à(s) 06:47


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