Página 1 de 1

Como criar a função instance_deactivate_region?

Enviado: Qua Jul 13, 2016 7:35 pm
por TRFN95
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.

Re: Como criar a função instance_deactive_region?

Enviado: Qua Jul 13, 2016 9:46 pm
por Markito
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é:

Re: Como criar a função instance_deactive_region?

Enviado: Qua Jul 13, 2016 9:54 pm
por Gonzo
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;

Re: Como criar a função instance_deactivate_region?

Enviado: Qua Jul 13, 2016 10:37 pm
por TRFN95
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: