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
» Retorno da GMBR!!!
por theguitarmester Ter 19 Mar 2024, 22:38

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21

» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39

» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16

» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05

» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55

» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39

» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28

» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01


[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


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