Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Como criar a função instance_deactivate_region?

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
TRFN95
Programador
Programador
Reações: 0
Mensagens: 31
Localização: BH-MG
Contato:

Como criar a função instance_deactivate_region?

Mensagem por TRFN95 » Qua Jul 13, 2016 7:35 pm

Boa noite,gostaria do auxilio da comunidade para resolver um obstáculo. Estou desenvolvendo um jogo no Tululoo Game Maker ( HTML5 ) e estou convertendo o projeto para android via apache-cordova. O mesmo ( Tululoo Game Maker -TGM ) tem funcionalidades familiarizadas com a forma do Game Maker trabalhar ( propriamente dizendo o GM8 ) e ele tem a função para desativar instancias e tudo e também tenho como listar todas as instancias da room, mas gostaria de desativar somente as instancias fora da view. Tenho a posicao da view (x,y) e também a dimensão (w,h)  e tenho como percorrer todas as instancias da room.  Tentei logicas intuitivas para o caso mas nao cheguei a uma resposta que funcionasse. Minha pergunta é, como seria criar a função nativa do GM ( instance_deactivate_region ) dentro desses valores que posso obter mesmo estando em outro ambiente de desenvolvimento? Julgo que seja possível mas nao consegui estabelecer uma logica funcional ao percorrer as instancias. Ah o motivo e por rendimento do APK final. Está na seção GM pela similaridade das engines.

Avatar do usuário
Markito
Colaborador
Colaborador
Reações: 0
Mensagens: 50

Re: Como criar a função instance_deactive_region?

Mensagem por Markito » Qua Jul 13, 2016 9:46 pm

O cálculo levaria em consideração a origem da sprite e a bounding box. Cheguei neste resultado (testando no próprio GM)

Código: Selecionar todos

var left, top, width, height, inside, notme;
left = argument0; top = argument1;
width = argument2; height = argument3;
inside = argument4; notme = argument5;

for(i=0;i<instance_count; i+=1) {
    var obj, xx, yy, ww, hh, check;
    obj = instance_id[i];
    if (notme and obj.id == self) continue;
    xx = obj.x - obj.sprite_xoffset;
    yy = obj.y - obj.sprite_yoffset;
    ww = obj.bbox_right - obj.bbox_left;
    hh = obj.bbox_bottom - obj.bbox_top;
    check = (
        xx >= left and yy >= top and
        xx+ww <= left+width and yy+hh <= top+height
    );
    if (!inside) check = !check;
    if (check) instance_deactivate_object(obj);
}
Eu tava testando no GM5 (formatei o PC e não sei onde botei o 8 ), e na minha lógica eu precisaria adicionar o bbox_left e bbox_top nos xx e yy, só que por algum motivo, numa sprite simples de 32x32, o valor delas era maior do que 0 :ué:

Avatar do usuário
Gonzo
Membro
Membro
Reações: 0
Mensagens: 194

Re: Como criar a função instance_deactive_region?

Mensagem por Gonzo » Qua Jul 13, 2016 9:54 pm

No GMS me ensinaram assim..

obj_player  >>  create events

Código: Selecionar todos

alarm[0] = 1;
create events alarm 0

Código: Selecionar todos

instance_deactivate_all(true);
instance_activate_region(view_xview-500,view_yview-500,view_wview+768,view_hview+500,true)
alarm[0] = 0.5*room_speed;
......∩____∩............_______...
......| (• ◡•)| ノ\(❍ᴥ❍ʋ)..
Não seja uma cabrita selvagem "tutankhamun"

Avatar do usuário
TRFN95
Programador
Programador
Reações: 0
Mensagens: 31
Localização: BH-MG
Contato:

Re: Como criar a função instance_deactivate_region?

Mensagem por TRFN95 » Qua Jul 13, 2016 10:37 pm

Muito obrigado Markituh e Gonzo pelas respostas.
Vendo a solução do Markituh, pensei em uma lógica e estruturei ela e funcionou bem  :blz:

Como o Tululoo Trabalha nativamente no Javascript, alterei pelo objeto a estrutura de funcionamento do sistema  :pc: porque não tive a paciência de saber o porque da função instance_deactive e a instance_destroy dar bugs esquisitos  :suspect:.

Ficou assim, criando o objeto obj_otimizar...

CREATE

Código: Selecionar todos

listar = [obj_parede, obj_chao]; 
window.$objetos = [];


for( i in listar ){
 lista = instance_list( listar[i] );
 for( j in lista ){
 $objetos.push({
 depth_coord: [lista[j].depthstart, tu_depth[lista[j].depthstart].indexOf(lista[j])],
 type_coord: [lista[j]._object_index_,tu_types[lista[j]["_object_index_"]].indexOf(lista[j])],
 object: lista[j],
 position: [lista[j].xstart, lista[j].ystart],
 visibility: lista[j].visible
 });
 }
 }
 
border = 2;
STEP

Código: Selecionar todos

for( i in $objetos ){
 var obj = $objetos[i],
 active = (
 obj.position[0] > room_viewport_x - border &&
 obj.position[0] < room_viewport_x + room_viewport_width + border &&
 obj.position[1] > room_viewport_y - border &&
 obj.position[1] < room_viewport_y + room_viewport_height + border
 );
 if( active ){
 tu_types[obj.type_coord[0]][obj.type_coord[1]] = obj.object;
 /*tu_types[obj.type_coord[0]][obj.type_coord[1]]["x"] = tu_types[obj.type_coord[0]][obj.type_coord[1]]["xstart"] = obj.position[0];
 tu_types[obj.type_coord[0]][obj.type_coord[1]]["y"] = tu_types[obj.type_coord[0]][obj.type_coord[1]]["ystart"] = obj.position[1];
 tu_depth[obj.depth_coord[0]][obj.depth_coord[1]].visible = obj.visibility;*/

 tu_depth[obj.depth_coord[0]][obj.depth_coord[1]].visible = obj.visibility;
 } else {
 tu_types[obj.type_coord[0]][obj.type_coord[1]] = {};
 tu_depth[obj.depth_coord[0]][obj.depth_coord[1]].visible = 0;
 }
 }
Claro o código ainda precisa ser otimizado kk, mas está rodando. Ainda estou realizando testes também. Na internet nao achei qualquer material que fosse uma real resolução para esse problema, pois me parece que devido aos bugs da engine, ela foi abandonada. Está sendo bem didático fazer ela funcionar sem bugar kkk

Obrigado pela ajuda, e se alguém for utilizar e estiver com o mesmo problema, esse código resolve muito a questão de "lentidao" que acontece quando convertido para APK. O Jogo está rodando bem agora  :feliz:

A propósito, quando ele estiver mais estruturado, compartilho ele aqui  :trampolim:

Trancado

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante