Entrar
Últimos assuntos
» Como ajustar velocidade de cada frame da animação no game makerpor Ralphed Ontem à(s) 18:28
» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07
» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45
» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51
» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31
» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11
» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39
» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» 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
Plataforma fantasma
2 participantes
Página 1 de 1
Plataforma fantasma
Enfim consegui fazer um sistema de movimento com rampa e colisão sem que o obj seja solido, mas agr falta a plataforma fantasma.
Aqui está a engine de movimento e rampa >https://www.dropbox.com/s/mkhifo5vxa1ki6w/Eng%20Movimento.gmk?m< , mas oque falta a plataforma fantasma, queria que o personagem pulasse debaixo da plataforma e caísse em cima, sem afetar os outros objs na room que poderão fazer a msm coisa ( no caso inimigos ) , alguem pode ajudar ?
thx
obs: essa engine naum é toda minha, só fiz umas modificações. Não sei quem foi o outro de quem peguei a base *---*
Aqui está a engine de movimento e rampa >https://www.dropbox.com/s/mkhifo5vxa1ki6w/Eng%20Movimento.gmk?m< , mas oque falta a plataforma fantasma, queria que o personagem pulasse debaixo da plataforma e caísse em cima, sem afetar os outros objs na room que poderão fazer a msm coisa ( no caso inimigos ) , alguem pode ajudar ?
thx
obs: essa engine naum é toda minha, só fiz umas modificações. Não sei quem foi o outro de quem peguei a base *---*
Última edição por FlyAway em Dom 03 Mar 2013, 21:37, editado 1 vez(es)
Zero.- Data de inscrição : 19/08/2010
Reputação : 47
Número de Mensagens : 1300
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 0
x 0 x 0 x 0
Re: Plataforma fantasma
Eu tenho quase certeza de já ter entrado nesse assunto contigo, antes...
Parei um pouco pra pensar nas plataformas fantasmas. Elas devem permitir passagem quando a velocidade vertical for negativa e negar passagem quando for positiva. O bug é quando o sentido da velocidade muda e o objeto está em contato com a plataforma... Aí, o objeto fica preso e isso provavelmente permite outro pulo, no ar.
O que eu faria é colocar uma variável na plataforma, tipo "passando" ou coisa do tipo. Daí, no step da plataforma, eu mando um
Aí, se a velocidade for negativa, o objPlayer passa pela plataforma normalmente. Se for ">= 0", só passa se o "passando" for true. Isso pode ser usado pra saltos de cima pra baixo, (agachando e apertando pulo, por exemplo). Ou simplesmente permitir passagem enquanto o jogador estiver apertando pra baixo, independente do sinal da velocidade (em geral, acho meio ruim, desse jeito, mas pode ser que funcione no seu jogo).
Pode parecer que a ordem em que as instâcias são criadas vai influenciar, mas acho que não. Se você permitir ao objPlayer entrar em contato no último step em que a velocidade é negativa, no step seguinte em que ele rodar o teste a plataforma já vai estar com "passando = true", quer ela rode o step antes ou depois do objPlayer.
É meio lento, porque vai um pedacinho de código no STEP de cada plataforma, mas não acho que vá causar lag. De qualquer forma, você poderia colocar o teste no begin step do objPlayer, mas aí teria que usar o "with (objPlataformaFantasma)", o que dá no mesmo. Não consigo pensar numa forma de fazer o "passando" voltar pra "false" se não rodar o teste a cada step.
Parei um pouco pra pensar nas plataformas fantasmas. Elas devem permitir passagem quando a velocidade vertical for negativa e negar passagem quando for positiva. O bug é quando o sentido da velocidade muda e o objeto está em contato com a plataforma... Aí, o objeto fica preso e isso provavelmente permite outro pulo, no ar.
O que eu faria é colocar uma variável na plataforma, tipo "passando" ou coisa do tipo. Daí, no step da plataforma, eu mando um
- Código:
if (place_meeting(x, y, objPlayer)){
passando = true;
}
else {
passando = false;
}
Aí, se a velocidade for negativa, o objPlayer passa pela plataforma normalmente. Se for ">= 0", só passa se o "passando" for true. Isso pode ser usado pra saltos de cima pra baixo, (agachando e apertando pulo, por exemplo). Ou simplesmente permitir passagem enquanto o jogador estiver apertando pra baixo, independente do sinal da velocidade (em geral, acho meio ruim, desse jeito, mas pode ser que funcione no seu jogo).
Pode parecer que a ordem em que as instâcias são criadas vai influenciar, mas acho que não. Se você permitir ao objPlayer entrar em contato no último step em que a velocidade é negativa, no step seguinte em que ele rodar o teste a plataforma já vai estar com "passando = true", quer ela rode o step antes ou depois do objPlayer.
É meio lento, porque vai um pedacinho de código no STEP de cada plataforma, mas não acho que vá causar lag. De qualquer forma, você poderia colocar o teste no begin step do objPlayer, mas aí teria que usar o "with (objPlataformaFantasma)", o que dá no mesmo. Não consigo pensar numa forma de fazer o "passando" voltar pra "false" se não rodar o teste a cada step.
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Plataforma fantasma
saim, eu já tinha pensando numa variavel local nas plataformas, inclusive ja fiz até o teste. O problema é que pondo esta variavel local, ela acaba virando "global" porque outros objs que esteja em cima da msm plataforma vão identificar que passando está true por causa do jogador. Eu ja pensei em muitas formas, mas não consigo concluir. Você baixou a engine ? '-'
Zero.- Data de inscrição : 19/08/2010
Reputação : 47
Número de Mensagens : 1300
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 0
x 0 x 0 x 0
Re: Plataforma fantasma
Baixei não... Se bem que eu devia baixar, até hoje não tenho uma engine com rampas...
Mas não entendo porque os outros objetos deveriam checar pelo valor da variável. Note que, embora a variável esteja nas plataformas, quem verifica o valor dela é o objPlayer. Pras IAs, simplesmente não cheque o valor da variável
Mas não entendo porque os outros objetos deveriam checar pelo valor da variável. Note que, embora a variável esteja nas plataformas, quem verifica o valor dela é o objPlayer. Pras IAs, simplesmente não cheque o valor da variável
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Plataforma fantasma
KKKKKKKKKKKK, Verdade. simplesmente não checo que é pra descer certo ?
Se puder baixar e tentar fazer, eu vou fazer aq da minha forma, mas queria ver como vc faria tb.
Se puder baixar e tentar fazer, eu vou fazer aq da minha forma, mas queria ver como vc faria tb.
Zero.- Data de inscrição : 19/08/2010
Reputação : 47
Número de Mensagens : 1300
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 0
x 0 x 0 x 0
Re: Plataforma fantasma
Baixar, agora, não dá... Aquele velho motivo de sempre: estou longe de casa.
Agora, eu pesquisei nas minhas engine aqui e encontrei uma que NÃO usa a tal variável e funciona bem! Permite até empilhar plataformas e deixar o jogador descer através de algumas delas (ou todas, mas o legal é que podem ser só algumas). Veja só:
Agora, eu pesquisei nas minhas engine aqui e encontrei uma que NÃO usa a tal variável e funciona bem! Permite até empilhar plataformas e deixar o jogador descer através de algumas delas (ou todas, mas o legal é que podem ser só algumas). Veja só:
- Spoiler:
- >create<
- Código:
//define variáveis da movimentação
spdX = 0; maxSpdX = 4;
spdY = 0; maxSpdy = 10; Grav = 0.5; jumpSpeed = -10;
//verifica se deve entrar na room caindo ou não
if (place_meeting(x, y + 1, objPlataforma)){
noAr = false;
}
else {
noAr = true;
}
- Código:
//movimentação horizontal (simplezinha mesmo)
//define a velocidade
spdX = (keyboard_check(vk_right) - keyboard_check(vk_left)) * maxSpdX;
//movimenta
if (!place_meeting(x + spdX, y, objPlataforma)){ //se não vai colidir
x += spdX; //movimenta
}
else { //se VAI colidir
while(!place_meeting(x + sign(spdX), y, objPlataforma)){ //enquanto não colide
x += sign(spdX); //anda um pixel na direção pedida
}
}
//depois de movimentar, verifica se é pra cair
if (!place_meeting(x, y + 1, objPlatFantasma) && !place_meeting(x, y + 1, objPlataforma)){
noAr = true; //permite a queda
}
//movimentação vertical
//entrada de comandos
if (noAr == false){ //se está no solo
if (keyboard_check_pressed(vk_up) || keyboard_check_pressed(vk_space)){ //se apertou o pulo
if (!keyboard_check(vk_down)){ //se não está tentando descer
spdY += jumpSpeed; noAr = true; //pula
}
else if (!place_meeting(x, y + 1, objPlataforma)){ //se ESTÁ tentando descer e PODE descer
noAr = true;
}
}
}
if (noAr == true){ //se está no ar (poderia ser um "else")
//define a velocidade
spdY = min(spdY + Grav, maxSpdy); //limita a velocidade terminal
//verifica colisões
if (place_meeting(x, y + spdY, objPlatFantasma) && !keyboard_check(vk_down) && spdY > 0){ //se vai colidir com uma plataforma fantasma
event_perform(ev_trigger, 0);
}
if (place_meeting(x, y + spdY, objPlataforma)){ //se vai colidir com uma plataforma comum
event_perform(ev_trigger, 1);
}
y += spdY;
}
- Código:
//colisão com plataforma fantasma
var platAtual, platNova;
platNova = collision_line(bbox_left, bbox_bottom + spdY, bbox_right, bbox_bottom + spdY, objPlatFantasma, 1, 1); //a plataforma de baixo
platAtual = collision_line(bbox_left, bbox_bottom , bbox_right, bbox_bottom , objPlatFantasma, 1, 1); //a plataforma daqui
if (platAtual != platNova && platNova != noone){ //se não colide atualmente com a próxima E existe uma próxima
while (!place_meeting(x, y + Grav, platNova)){ //enquanto não colide (já que vai acabar colidindo, mesmo)
y += min(Grav, 1); //anda tantos pixels quanto a gravidade mandar (ou só 1, se a gravidade for muito alta)
}
//ao final do while, os objetos estarão se tocando
spdY = 0; noAr = false; //zera a velocidade e não deixa ela ser atualizada no próximo step
}
- Código:
//colisão com plataforma normal
while (!place_meeting(x, y + sign(spdY), objPlataforma)){ //enquanto não colide (já que vai acabar colidindo, mesmo)
y += sign(spdY); //usei o sign, aqui, porque tem que funcionar também enquanto sobe
}
if (spdY > 0){ //se estava caindo
noAr = false;
}
spdY = 0; //a velocidade deve ser zerada independente de estar caindo ou não
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Plataforma fantasma
Naum entendi a parte do bbox, min e sign *---*
Zero.- Data de inscrição : 19/08/2010
Reputação : 47
Número de Mensagens : 1300
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 0
x 0 x 0 x 0
Re: Plataforma fantasma
sign e min são funções que eu usei pra economizar if-else. Os bboxes eu usei pra generalizar um pouco a engine.
sign = sinal.
A função te retorna um desses 3 valores: +1, -1 ou 0. Como eu estou SOMANDO uma unidade, ela tem que estar com o sinal da velocidade. Aí, se a velocidade for negativa, eu somo "pra trás", efetivamente diminuindo o valor da posição.
"Enquanto não colide, avança um pixel na direção (sign) da velocidade - e, quando for colidir, sai do while"
Esse while é minha gambiarra pra substituir o move_contact.
bbox = limites da caixa de colisão.
Como eu fiz essa engine pensando numa plataforma em que a origem da sprite pode estar em qualquer lugar (eu não queria atrelar o funcionamento da engine à origem), então resolvi usar os bboxes. Se a origem for no ponto (0,0), então temos
bbox_left = 0, bbox_top = 0, bbox_right = sprite_width, bbox_bottom = sprite_height
e se a origem for no ponto (a, b), temos
bbox_left = -a, bbox_top = -b, bbox_right = sprite_width - a, bbox_bottom = sprite_height - b
min = menor.
A função te retorna o menor dos argumentos
Então quando eu escrevo
sign = sinal.
A função te retorna um desses 3 valores: +1, -1 ou 0. Como eu estou SOMANDO uma unidade, ela tem que estar com o sinal da velocidade. Aí, se a velocidade for negativa, eu somo "pra trás", efetivamente diminuindo o valor da posição.
"Enquanto não colide, avança um pixel na direção (sign) da velocidade - e, quando for colidir, sai do while"
Esse while é minha gambiarra pra substituir o move_contact.
bbox = limites da caixa de colisão.
Como eu fiz essa engine pensando numa plataforma em que a origem da sprite pode estar em qualquer lugar (eu não queria atrelar o funcionamento da engine à origem), então resolvi usar os bboxes. Se a origem for no ponto (0,0), então temos
bbox_left = 0, bbox_top = 0, bbox_right = sprite_width, bbox_bottom = sprite_height
e se a origem for no ponto (a, b), temos
bbox_left = -a, bbox_top = -b, bbox_right = sprite_width - a, bbox_bottom = sprite_height - b
min = menor.
A função te retorna o menor dos argumentos
Então quando eu escrevo
- Código:
spdY = min(spdY + Grav, maxSpdy);
- Código:
spdY = spdY + Grav;
if (spdY > maxSpdy){
spdY = maxSpdy;
}
- Código:
y += min(Grav, 1)
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Tópicos semelhantes
» Movimento plataforma (rampa e plataforma "fantasma")
» Plataforma Fantasma
» Bug Plataforma Fantasma com video
» Plataforma Fantasma
» Plataforma Fantasma ("BUG")
» Plataforma Fantasma
» Bug Plataforma Fantasma com video
» Plataforma Fantasma
» Plataforma Fantasma ("BUG")
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|