GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


[Scirpt] Câmera seguir dois players ao mesmo tempo

3 participantes

Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por Lauro Sáb 12 Jul 2014, 12:38

Bom dia usuários, voltei depois de muitos milênios! Estive fazendo cursos de computação e fiquei um tempo (alguns anos) off aqui. Agora estou de férias e estive pensando em desenvolver um jogo pra esfriar a cabeça. Pretendo desenvolver um jogo co-op de aventura, que é bem mais divertido. Mas então eu senti uma dificuldade na questão da view, afinal, ela tem de seguir dois players ao mesmo tempo, e cá entre nós, dividir a tela em duas não é uma ideia adequada pra todos os momentos. Procurei alguns tutoriais na GMBR, e ele apenas me ajudaram um pouco. Então matutando sozinho desenvolvi uma maneira bem interessante que pode ser usada por você também!
Esse é o código que vou usar no jogo, aqui funcionou como eu queria, mas se quiser, adapte à vontade.

Para esse código, existem 3 objetos:

objSeguir // será o que a view irá seguir, e que irá seguir os dois players ao simultaneamente. A opção "visible" dele deve estar desmarcada.
objPlayer1 e objPlayer2

Bem, o código inteiro está no objSeguir. Veja:
Código:

view_object[0]=objSeguir; //a view sempre irá seguir este objeto

x = (objPlayer1.x+objPlayer2.x)/2;
y = (objPlayer1.y+objPlayer2.y)/2;
//o objeto vai ficar sempre na média da reta x e y estabelecida entre os dois players. Em outras palavras, ele vai ficar no meio dos deles.

if (objPlayer1.x>objPlayer2.x and objPlayer1.x-objPlayer2.x<100 and objPlayer1.y>objPlayer2.y and objPlayer1.y-objPlayer2.y <100 or objPlayer2.x>objPlayer1.x and objPlayer2.x-objPlayer1.x<100 and objPlayer2.y>objPlayer1.y and objPlayer2.y-objPlayer1.y <100 )

//Nessa parte,vai verificar se os players estão próximos.
{
  view_hview[0]=240;
  view_wview[0]=  320;
//se sim, as proporções da view serão mantidas.
}

else
//se não estiverem próximos...

if (objPlayer1.x-20< view_xview[0]or objPlayer1.y-20<view_yview[0]or objPlayer2.x-20< view_xview[0] or objPlayer2.y-20< view_yview[0] or objPlayer1.x+20>view_xview[0]+view_wview[0] or objPlayer2.x+20>view_xview[0]+view_wview[0] or objPlayer1.y+20>view_yview[0]+view_hview[0] or objPlayer2.y+20>view_yview[0]+view_hview[0] )

//Essa parte foi a mais trabalhosa, ela verifica se o player está na próximo de chegar na borda da view

{
    view_hview[0]+=40;
    view_wview[0]+=40;
//se sim, altera as proporções dela, aumentando um pouco.     
}
           

O que acharam? Alguma correção ou sugestão? Foi útil?
Lauro
Lauro

Games Ranking : Nota D

Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por mumiaz Sáb 12 Jul 2014, 16:35

É bem legal jogar jogos co-op com os amigos ou irmaos, sempre resulta em muitas risadas  Happy .
Realmente é muito util esse script, vlw por compartilhar.
Nao esqueça de postar o jogo aki pra gente jogar.
mumiaz
mumiaz

Data de inscrição : 21/06/2014
Reputação : 5
Número de Mensagens : 13
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por gabrielsch Sáb 12 Jul 2014, 17:01

O script é funcional, porém ele é meio pesado na minha opinião:
Código:
if (objPlayer1.x>objPlayer2.x and objPlayer1.x-objPlayer2.x<100 and objPlayer1.y>objPlayer2.y and objPlayer1.y-objPlayer2.y <100 or objPlayer2.x>objPlayer1.x and objPlayer2.x-objPlayer1.x<100 and objPlayer2.y>objPlayer1.y and objPlayer2.y-objPlayer1.y <100 )

Por experiência própria esse tipo de condição é muito ineficiente, ainda mais se isso for usado em um evento como o Step. Felizmente utilizando teu código como base é possível fazer outro com a mesma função só que mais limpo e mais eficiente:

Código:
var meio_x, meio_y, zoom;

//Média das posições X e Y dos jogadores.
meio_x = (obj_player1.x + obj_player2.x)/2
meio_y = (obj_player1.y + obj_player2.y)/2

//Distancia entre os 2 jogadores, usado para calcular o zoom.
zoom = point_distance(obj_player1.x, obj_player1.y, obj_player2.x, obj_player2.y)/2

//Tamanho da view é igual a um valor base mais o valor do zoom.
view_wview[0] = 800 + zoom                  //É divido por 1.3 para preservar o aspecto
view_hview[0] = 600 + zoom/1.3             //ao contrario a tela ficaria distorcida.

//Define a posição X e Y da view como sendo a média das posições dos jogadores
//subtraida pela metade do tamanho horizontal ou vertical das views.
view_xview[0] = meio_x - view_wview[0]/2
view_yview[0] = meio_y - view_hview[0]/2

//Evita que a view mostre fora da room.
view_xview[0] = max(0,min(room_width - view_wview[0],view_xview[0]))  
view_yview[0] = max(0,min(room_height - view_hview[0],view_yview[0]))  
gabrielsch
gabrielsch

Games Ranking : Nota A

Notas recebidas : D + A + A
Data de inscrição : 06/12/2009
Reputação : 28
Número de Mensagens : 1230
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 2 Bronze x 0

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por Lauro Dom 13 Jul 2014, 12:10

Muito bom @gabrielsch, você conseguiu deixar o script bem mais interessante e menos "gambiarrado". Eu realmente estava com problemas com a view fora da room, pode me explicar esse max?
Lauro
Lauro

Games Ranking : Nota D

Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por gabrielsch Dom 13 Jul 2014, 15:08

A função max() te retorna o maior valor dos dois que tu colocou nos argumentos, por exemplo:
Código:
variavel = max(2, 5)
Como a função retorna o maior valor, a mesma vai retornar 5.

Do mesmo jeito que o max funciona existe a função min() que é exatamente o contrário, ela retorna o menor valor.
Código:
variavel = min(2, 5)
Vai te retornar o valor 2.

Sabendo disso é possível limitar um valor usando as duas funções juntas, o código do script segue uma logica bem simples, ele primeiro acha o menor valor entre o tamanho da room menos o tamanho da view e a posição da view, depois que ele retorna esse valor ele usa o mesmo para verificar se é maior que zero usando a função max.
Talvez tenha ficado meio complicada a minha explicação, não sou bom com isso, mas para a felicidade de todo mundo o GMS tem uma função própria pra isso, ela se chama clamp() e se usa desse jeito:
Código:
var = clamp(var, min, max)

O código acima vai definir o valor da variável como sendo um valor maior que o segundo argumento e menor que o terceiro argumento em relação ao valor que tu colocou no primeiro argumento.
Código:
var = clamp(var, 20, 150)
Nesse exemplo a função vai te retornar um valor entre 20 e 150.
gabrielsch
gabrielsch

Games Ranking : Nota A

Notas recebidas : D + A + A
Data de inscrição : 06/12/2009
Reputação : 28
Número de Mensagens : 1230
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 2 Bronze x 0

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por Lauro Dom 13 Jul 2014, 17:33

Esse script é interessante, mas na minha opinião ele ficou meio estranho em sua visualização final, pois a câmera aumentava e diminuía o zoom sempre, e isso acaba por sendo meio confuso, dá até uma certa tontura no usuário.
O script que eu tinha feito verificava se eles estavam próximo do final da view, pra aí então aumentar tamanho. E pra diminuir, verificava se eles estavam próximos entre si.
Eu tentei adaptar, ficou assim:
Código:

view_object[0]=objCtrl;
x = (objPlayer1.x+objPlayer2.x)/2;       
y = (objPlayer1.y+objPlayer2.y)/2; 
zoom = point_distance(objPlayer1.x, objPlayer1.y, objPlayer2.x, objPlayer2.y)/2

  if (objPlayer1.x>objPlayer2.x and objPlayer1.x-objPlayer2.x<100 and objPlayer1.y>objPlayer2.y and objPlayer1.y-objPlayer2.y <100 or objPlayer2.x>objPlayer1.x and objPlayer2.x-objPlayer1.x<100 and objPlayer2.y>objPlayer1.y and objPlayer2.y-objPlayer1.y <100 )
   
{

view_wview[0] = 320 + zoom                  //É divido por 1.3 para preservar o aspecto
view_hview[0] = 240 + zoom/1.3

}

else  if (objPlayer1.x-20< view_xview[0]or objPlayer1.y-20<view_yview[0]or objPlayer2.x-20< view_xview[0] or objPlayer2.y-20< view_yview[0] or objPlayer1.x+20>view_xview[0]+view_wview[0] or objPlayer2.x+20>view_xview[0]+view_wview[0] or objPlayer1.y+20>view_yview[0]+view_hview[0] or objPlayer2.y+20>view_yview[0]+view_hview[0] )
{

    view_hview[0]+=40;
    view_wview[0]+=40;
 
   
}

view_xview[0] = max(0,min(room_width - view_wview[0],view_xview[0])) 
view_yview[0] = max(0,min(room_height - view_hview[0],view_yview[0]))         

Ficou meio estranho, mas foi o melhor que eu consegui fazer.
Lauro
Lauro

Games Ranking : Nota D

Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios : [Scirpt] Câmera seguir dois players ao mesmo tempo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

[Scirpt] Câmera seguir dois players ao mesmo tempo Empty Re: [Scirpt] Câmera seguir dois players ao mesmo tempo

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos