Entrar
Ú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
Página 1 de 1
[Scirpt] Câmera seguir dois players ao mesmo tempo
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:
O que acharam? Alguma correção ou sugestão? Foi útil?
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- Games Ranking :
Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Scirpt] Câmera seguir dois players ao mesmo tempo
É bem legal jogar jogos co-op com os amigos ou irmaos, sempre resulta em muitas risadas .
Realmente é muito util esse script, vlw por compartilhar.
Nao esqueça de postar o jogo aki pra gente jogar.
Realmente é muito util esse script, vlw por compartilhar.
Nao esqueça de postar o jogo aki pra gente jogar.
mumiaz- Data de inscrição : 21/06/2014
Reputação : 5
Número de Mensagens : 13
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Scirpt] Câmera seguir dois players ao mesmo tempo
O script é funcional, porém ele é meio pesado na minha opinião:
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:
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- Games Ranking :
Notas recebidas : D + A + A
Data de inscrição : 06/12/2009
Reputação : 28
Número de Mensagens : 1230
Prêmios :
x 0 x 0 x 0
x 1 x 2 x 0
x 1 x 0 x 0
Re: [Scirpt] Câmera seguir dois players ao mesmo tempo
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- Games Ranking :
Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Scirpt] Câmera seguir dois players ao mesmo tempo
A função max() te retorna o maior valor dos dois que tu colocou nos argumentos, por exemplo:
Do mesmo jeito que o max funciona existe a função min() que é exatamente o contrário, ela retorna o menor valor.
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:
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:
variavel = max(2, 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)
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)
gabrielsch- Games Ranking :
Notas recebidas : D + A + A
Data de inscrição : 06/12/2009
Reputação : 28
Número de Mensagens : 1230
Prêmios :
x 0 x 0 x 0
x 1 x 2 x 0
x 1 x 0 x 0
Re: [Scirpt] Câmera seguir dois players ao mesmo tempo
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:
Ficou meio estranho, mas foi o melhor que eu consegui fazer.
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- Games Ranking :
Notas recebidas : C+D
Data de inscrição : 09/11/2010
Reputação : 11
Número de Mensagens : 855
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|