Velho Fantasma 1: views (parte 2)

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

Velho Fantasma 1: views (parte 2)

Mensagem por saim em Seg 22 Out 2012, 10:22

E chegamos à segunda parte da minha dúvida a respeito de views.
Recapitulando, eu queria ajeitar um script pra ajeitar via código a room criada via código (com room_add()), sendo que ela teria uma altura maior que a janela do jogo. Agradeço a todos que me ajudaram lá, mas o crédito do script vai mesmo para o Alex FC. Eu dei uma jeitada nele, pra poder entrar com mais argumentos, aqui está a versão que estou usando agora:
Código:
// room com view(room, larguraRoom, alturaRoom, larguraView, alturaView, objeto)
// define as coordenadas da janela e tamanho da room (argument0), além de criar um objeto
var larRoom, altRoom, larView, altView;
larRoom = argument1; altRoom = argument2; larView = argument3; altView = argument4;

//Tamanho da room
room_set_width(argument0, larRoom);
room_set_height(argument0, altRoom);

//Configura view
room_set_view(argument0, 0, true, 0, altRoom - altView, larView, altView, 0, 0, larView, altView, 200,  200, 0, 0, argument5);

//Coloca background na room
// room_set_background(argument0,0,1,0,background0,0,0,1,1,0,0,1) // comentado porque ainda não estou usando uma background

//Adiciona objeto na room
room_instance_add(argument0, 150, altRoom, argument5)

//Ativa view
room_set_view_enabled(argument0, true);
Notem que o script não definem o valor de view_object[0], então não deve haver nenhuma movimentação na view, a princípio.

Agora a dúvida.

CLARO que eu quero que a view se movimente, mas eu quero fazer isso via código. Então, no objControle, eu adicionei no step:
Código:
view_yview[0] -= 1;
Isso parece ter funcionado. Depois eu vou precisar de um controle maior, mas pra começar, está bom.
Então, finalmente, eu criei um outro objeto pra uma engine de escuridão - aquela velha técnica de desenhar uma surface preta sobre o jogo. No draw desse objeto, eu ajeitei a surface "preto" e desenhei a surface na tela
Código:
surface_set_target(preto);
draw_clear($000000);
draw_set_blend_mode_ext(bm_zero, bm_inv_src_color);

with(objPlayer){
   draw_sprite_ext(sprFoco, 0, x - view_xview[0], y - view_yview[0], other . escala, other . escala, 0, image_blend, 1); //sprFoco é um círculo com alpha reduzindo nas extremidades
   }

draw_set_blend_mode(bm_normal);
surface_reset_target();

draw_surface_ext(preto, view_xview[0], view_yview[0], 1, 1, 0, $ffffff, alphaLuz);
Resultado: a surface foi desenhada numa posição cada vez mais alta, fugindo da tela. Foi até gozado ver os focos de luz sendo desenhados no lugar certo da surface e vê-la sendo desenhada no lugar errado, sendo que usei a mesma variável (view_yview[0]) pra definir as duas posições.

Reparei que quando eu não mexia no valor de view_yview[0] (no objControle), isso não acontecia, então troquei a última linha por:
Código:
draw_surface_ext(preto, view_xview[0], 0, 1, 1, 0, $ffffff, alphaLuz);
Isso resolveu.

Bom, eu estou programando através do meu jogo genérico, então alguns comportamentos são estranhos mesmo. Gostaria que alguém verificasse se essa solução faz sentido, porque pra mim, não faz. Eu achava acho que o certo seria como fiz na primeira tentativa, desenhar a surface na posição da view.

Acho que você podem querer o resto dos códigos pra testar. Vou deixar aqui num spoiler:
demais códigos:
Na verdade, vou adaptar pra poder reduzir a quantidade de código, talvez eu escreva alguma bobagem. Se acontecer, me avisem.
objEscuro:
depth = -900;
create:
Código:
alphaLuz = 1;
velEscuro = 0.01; // velocidade de escurecimento

preto = surface_create(view_wview[0], view_hview[0]);
surface_set_target(preto);
draw_clear($000000);
surface_reset_target();
escala = (1 / sprite_get_width(sprFoco)) * 64;
step:
Código:
alphaLuz = min(alphaLuz + velEscuro, 1);
apertar espaço:
Código:
alphaLuz = 0;
e o draw eu já mostrei:
Código:
surface_set_target(preto);
draw_clear($000000);
draw_set_blend_mode_ext(bm_zero, bm_inv_src_color);

with(objPlayer){
   draw_sprite_ext(sprFoco, 0, x - view_xview[0], y - view_yview[0], other . escala, other . escala, 0, image_blend, 1); //sprFoco é um círculo com alpha reduzindo nas extremidades
   }

draw_set_blend_mode(bm_normal);
surface_reset_target();

draw_surface_ext(preto, view_xview[0], view_yview[0], 1, 1, 0, $ffffff, alphaLuz);
Usem uma sprite qualquer pra ser a sprFoco, o que importa que que ela seja visível
objPlayer:
step:
Código:
x += 5 * (keyboard_check(vk_right) - keyboard_check(vk_left));
y += 5 * (keyboard_check(vk_down) - keyboard_check(vk_up));
objControle:
create:
Código:
instance_create(view_wview[0] / 2, room_height, objPlayer);
instance_create(0, 0, objEscuro);
step:
Código:
view_yview[0] -= 1;

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: Velho Fantasma 1: views (parte 2)

Mensagem por luiz_eldorado em Seg 22 Out 2012, 14:29

Testei aqui os códigos e deu o mesmo problema, mesmo não sendo um jogo genérico. Estranho... parece que quando desenhamos a surface, a "origem" para desenhar é a janela, e não a room.
Mas qual é o problema?

luiz_eldorado

Ranking : Nota C
Número de Mensagens : 928
Idade : 17
Data de inscrição : 30/07/2011
Notas recebidas : C
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://luizpontes.tk/

Voltar ao Topo Ir em baixo

Re: Velho Fantasma 1: views (parte 2)

Mensagem por saim em Seg 22 Out 2012, 15:26

O problema é que isso não faz sentido! As coordenadas (x, y) são da room, não da janela... certo?
Se eu aceitar uma solução que eu não consiga entender, daqui a um tempo você vai me ver matando uma galinha preta em cima do computador...

Mas o problema piorou, agora. Veja bem, o objEscuro tem a depth -900 e o objControle (que agora mudei o nome pra objControleJogo, porque existem outros controles nos menus) tem a depth -1000.
Eu notava que alguns códigos do draw do objControle estavam acontecendo por baixo da surface (não tinha reparado antes).
Apesar de achar que não deveria funcionar, inverti a ordem de criação dos objetos. Agora, o objEscuro cria o objControle, que não cria mais o objEscuro. O erro mudou.

Agora, o draw do objControle está por cima da surface (conforme esperado), mas a view não se movimenta mais! Como se não fosse estranho o bastante, o draw do objControle sobe e a posição do foco de luz na surface desce!

Ambos dependem do valor de view_yview[0], então entendo que esse valor está sendo variado, conforme o step do objControle manda, apesar da view não andar.

Como eu não postei o draw do objControle e ele é um pouco complexo (depende de um monte de variáveis que eu não expliquei), considere que ele é apenas
Código:
draw_rectangle(view_xview[0] + 20, view_yview[0] + 20, view_xview[0] + 80, view_yview[0] + 80, 0)

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: Velho Fantasma 1: views (parte 2)

Mensagem por Kabeção em Seg 22 Out 2012, 16:10

Use o debug e veja se a view esta mesmo habilitada e visível.
Se não sei se entendi mas testei aqui e esta tudo certo.
Não era pra acontecer isso?
https://dl.dropbox.com/u/60691076/exemplos/view/index.html
Coloquei para reiniciar quando chegasse no final da view.

Por falar nisso, pode não ter nada a ver, mas não é recomendável desenhar na surface no evento Draw.

Por curiosidade que versão do GMS você está usando?

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: Velho Fantasma 1: views (parte 2)

Mensagem por saim em Qua 24 Out 2012, 11:03

Ufa, finalmente um descanso pra responder ao tópico...

Você editou a mensagem? Em casa eu conseguia jogar o jogo, aqui eu só vejo o link. Mas isso não vem ao caso.
O resultado era - É - basicamente, esse mesmo. Só quero entender porque estou tendo que fazer tanta gambiarra pra chegar nele. O valor de view_yview não é uma global?

Quanto às surfaces, realmente parece ter alguma coisa a ver, porque eu não consigo desenhar a surface com o screen_redraw (pra fazer uma pausa) se ela está no draw_event. Mais que isso, passei o código pro end step e o erro inverteu (ou corrigiu)! Agora eu posso usar os valores de view_yview e view_xview pra desenhar a surface.

Faz sentido pra você?

[Edit:] Ah, e eu estou usando o GM8.0

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: Velho Fantasma 1: views (parte 2)

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


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