O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Como criar um sistema estilo Bomberman?

Iniciado por HammerStrike, 17/03/2019 às 15:29

17/03/2019 às 15:29 Última edição: 22/03/2019 às 12:07 por Jorge_Maker
Estou criando um modo alternativo para o meu projeto em que ele se inspira em em Bomberman, mas a questão é que não sei fazer o sistema de colocar bombas pra explodirem. Gostaria de saber se alguém poderia me ajudar a fazer isso de alguma forma.


Só preciso de um sistema que eu possa colocar uma bomba e os eventos reagirem a explosão, já fiz alguns assets para os mapas e sistema.


Hammer Strike

Haha, muito boa a screen xD

Bom, acho que não é complicado, desde que haja um limite de bombas. Por exemplo, se tu pode por três bombas, é bom já ter três eventos separadinhos no canto do mapa para usá-los e não precisar de um script de spawn.

Quando o jogador apertar a tecla definida, você moverá um desses eventos-bomba para a posição do personagem e trocará o gráfico dele para o gráfico da bomba. Ele pode estar com prioridade igual à do jogador, pois mesmo estando no mesmo tile, o jogador pode se mover dele e não poderá pisar sobre ele novamente, tal como é em Bomberman mesmo.

Pra bomba explodir, acho que seria interessante criar uma página no evento-bomba que será ativada quando ela for posicionada (parágrafo anterior). Nessa página você, se pudesse, faria aquela animaçãozinha de pulsar, uma única vez, e após a animação adicionaria 1 à uma variável que seria o timer daquela bomba. Cada bomba deve ter uma variável para si. Ao fim da programação teria uma condição que, se o número de pulsadas tiver chegado no definido, ela explode.

A explosão tu pode fazer, visualmente, por animação. Assim tu pode fazer ela grande. Acho que com blendagem/mistura em multiplicar fica um resultado legal.

Pra verificar se havia alguma unidade na área de explosão tu vai precisar de (igual receita):
Var001: para a coordenada mínima de um eixo (X e Y).
Var002: para a coordenada máxima de um eixo (X e Y).
Var003: para a coordenada do eixo perpendicular (X ou Y).
Var004: para colher o ID de um possível evento na coordenada verificada.

Primeiro tu vai verificar horizontalmente. Var001 será igual a coordenada X de onde está a bomba menos o alcance dela. Por exemplo, se ela está em X 10 e seu alcance é 3, Var001 será igual a 7.
Var002 será igual a coordenada X de onde está a bomba mais o alcance dela. Por exemplo, se ela está em X 10 e seu alcance é 3, Var001 será igual a 13.
Var003 será igual a coordenada Y da bomba, ou seja, o eixo perpendicular ao que estamos calculando (X). Isto para saber em qual linha analisaremos o dano.
Com esses três valores tu vai montar um ciclo onde, enquanto Var001 for menor ou igual a Var002, você vai armazenar em Var004 o ID do evento que existe na coordenada X Var001 e Y Var003. Se for maior do que zero, existe um evento ali e será destruído pois está dentro do alcance da bomba. Depois tu vai adicionar 1 à Var001 pois analisaremos o tile seguinte, até Var001 ser maior que Var002, informando que analisamos todo o alcance do eixo X da bomba.

Depois tu vai montar a mesma coisa, mas ao invés de Var001 e Var002 pegarem a coordenada X, pegará a Y, e Var003 a X.

Imagem bunita.²
Sistema de bomberman deve ser legal de fazer, porquê quando você para e pensa em todas as possibilidades, o bixo vai ficando complexo de um jeito que você nem esperava. auhuh'
A explicação do Gerar foi perfeita, e vai servir. No entanto, ela só abrange a colisão com os eventos. Se houvesse alguma barreira do lado da bomba, o raio de sua explosão não seria barrado, já que isso não foi levado em conta.
Um amigo meu fez um sistema de bomberman há uns anos, e usou eventos para criar o raio da explosão. O resultado foi de que a explosão também interagia com o cenário, no entanto, ele teve que sacrificar ao menos uns 5~7 frames do jogo. huaheu'


Enfim, deixando de papo furado, eu tenho algumas dicas para tornar isso um pouco menos doloroso de se fazer:
-Sempre que puder usar um comando de script ao invés de armazenar o valor de determinada coisa em uma variável, o faça. Por exemplo:
$game_player.x e $game_player.y, para as coordenadas x e y do personagem, respectivamente.
Aqui tem uma porrada, então fique a vontade para explorá-las.
-Use Math hypot. Ela calcula a menor distância entre dois pontos (também conhecido como reta xD), vai ser bastante útil para a explosão das bombas:
Spoiler
expurosion = Math.hypot( $game_map.events[ID2].x - $game_map.events[ID].x, $game_map.events[ID2].y - $game_map.events[ID].y)

Ai você teria que fazer uma condição, por exemplo:
if expurosion <= range
  #Dano
end

range é uma variável local que irá armazenar o alcance da bomba, pode ser o valor que tu quiser.
No entanto, como a explosão da bomba só atinge oque está perpendicularmente a ela, será necessário uma condição:
$game_map.events[ID2].x == $game_map.events[ID].x || $game_map.events[ID2].y == $game_map.events[ID].y

No final ficaria:
if expurosion <= range && $game_map.events[ID2].x == $game_map.events[ID].x || expurosion <= range && $game_map.events[ID2].y == $game_map.events[ID].y
  #Dano
end
[close]


E pronto, você já tem uma bomba interagindo com eventos prontinha pra ação. Não testei mas creio que irá funcionar, assim espero. xD
Mas também tem a questão da colisão com o mapa, que muda todo o cenário. Teria que pensar mais um pouco pra ter certeza, mas com algumas variáveis, ciclos e mais algumas condições, essa bagaça deve funciona. Mas ai também tem o gráfico de explosão da bomba, que teria que reagir conforme o mapa, logo, não poderia ser uma simples animação. :batrick: Sinceramente, isso ai eu já não sei muito bem. ahuheauhe'


EDIT: No lugar de range e expurosion use RANGE e EXPUROSION ,ou qualquer outra coisa que você queira, contanto que seja tudo com letras maiúsculas. Da erro usar variáveis com letras minúsculas no Vx Ace. :feelsbatman:


EDIT²:
Spoiler
[close]
Tae, o personagem e outro evento interagindo com um outro evento quando estão no mesmo eixo e em um determinado alcance.
Os códigos ficaram assim:
Esse é o evento que irá interagir com a bomba.

comandos usados, já que o editor do VX Ace corta tudo

EXPUROSION = Math.hypot( $game_map.events[ID2].x - $game_map.events[ID].x, 
$game_map.events[ID2].y - $game_map.events[ID].y)

EXPUROSION <= RANGE && $game_map.events[ID2].x == $game_map.events[ID].x || EXPUROSION <= RANGE && $game_map.events[ID2].y == $game_map.events[ID].y
[close]
Esse evento é a bomba, usei ela pra fazer o sensor entre a própria e o personagem

comandos usados

EXPUROSION = Math.hypot( $game_player.x - $game_map.events[ID].x, $game_player.y - 
$game_map.events[ID].y)

EXPUROSION <= RANGE && $game_player.x == $game_map.events[ID].x || EXPUROSION <= RANGE && $game_player.y == $game_map.events[ID].y
[close]
Lembre-se,  tudo deve estar em processo paralelo e todas as variáveis devem ser definidas, caso contrário dará erro.
Oxe

Se usar as duas explicações acima você ja consegue fazer algo bastante agradável, mas você também pode estudar a engine (Khrono Bomberman System, https://centrorpg.com/index.php?topic=7141.0) ou uma avançada até demais criada pelo RD12 que até pega online, a (Bomberman XP Online http://www.aldeiarpg.com/t8276-bomberman-xp-online-download)

Vlw pelas dicas galera, mas não sei acho que estou noobando. fiz aqui o exemplo do Jorge mas não sei exatamente como por ele pra funcionar como deveria.

Se quiser posso mandar uma demo de como está até agora o sistema.
Hammer Strike

Não precisa mandar demo ainda, pela gif que tu mandou, sei mais ou menos oque tu fez. hauhe'
Tu aparentemente fez a bomba reagir de alguma forma (nesse caso, alterando sua opacidade) quando o personagem estivesse no alcance daquele homenzinho que está parado na gif. Para consertar esse erro, basta trocar o valor da variável ID pela ID correspondente do evento da bomba.
Oxe

Hmm, mudei algumas coisas aqui mas continua bugado a colisão. Talvez eu esteja fazendo merda  :o:.
Vlw pela ajuda de qualquer forma.
Hammer Strike

Não, não, se você ainda tá tendo problema a gente vai resolver. xD
Mande aí uma demo do jogo para que eu possa procurar pela origem do problema.
Oxe

Citação de: Jorge_Maker online 18/03/2019 às 15:21
Não, não, se você ainda tá tendo problema a gente vai resolver. xD
Mande aí uma demo do jogo para que eu possa procurar pela origem do problema.

Ok brow, mandei a demo por PM pra tu dar uma olhada.

Citação de: GODZILLA online 18/03/2019 às 00:43
Se usar as duas explicações acima você ja consegue fazer algo bastante agradável, mas você também pode estudar a engine (Khrono Bomberman System, https://centrorpg.com/index.php?topic=7141.0) ou uma avançada até demais criada pelo RD12 que até pega online, a (Bomberman XP Online http://www.aldeiarpg.com/t8276-bomberman-xp-online-download)


Dei uma olhada em um deles, mas o sistema não me agradou muito. A colisão da explosão é meio bugada.
Hammer Strike

Fiz um sistema de Bomberman basicão procê em cima da demo que me mandou. Baixa la o arquivo que te enviei por PM.
Se achar algum bug ou tiver mais alguma dúvida, só dizer. o/
Oxe

Citação de: Jorge_Maker online 18/03/2019 às 20:36
Fiz um sistema de Bomberman basicão procê em cima da demo que me mandou. Baixa la o arquivo que te enviei por PM.
Se achar algum bug ou tiver mais alguma dúvida, só dizer. o/

XORXI DEUS, ficou muito bom. Muito obrigado pela ajuda, os demais sistemas eu já estou adicionando. Quando estiver pronto o mini game eu te mostro tudo certo.

Gif do teste que fiz:
Hammer Strike

19/03/2019 às 00:07 #11 Última edição: 19/03/2019 às 00:09 por Jorge_Maker
AEEEEE o/
Que bom que você gostou. Mas Hammer, se tu tiver tendo problema com performance quando o mapa estiver cheio de eventos, pode ser por conta do cálculo da hipotenusa que usei (Math.Hypot). Então você testa ai a performance do jogo com o mapa lotado e se tiver muito pesado, diga, porquê tem um jeito diferente de fazer que não usa Math.Hypot e creio que seja mais leve. :math:
Oxe

Citação de: Jorge_Maker online 19/03/2019 às 00:07
AEEEEE o/
Que bom que você gostou. Mas Hammer, se tu tiver tendo problema com performance quando o mapa estiver cheio de eventos, pode ser por conta do cálculo da hipotenusa que usei (Math.Hypot). Então você testa ai a performance do jogo com o mapa lotado e se tiver muito pesado, diga, porquê tem um jeito diferente de fazer que não usa Math.Hypot e creio que seja mais leve. :math:

Fiz o teste como mapa cheio e realmente fica um lag absurdo. Quando passa de uns 7 ou 8 eventos já fica lagado.
Hammer Strike

19/03/2019 às 13:17 #13 Última edição: 19/03/2019 às 13:21 por Jorge_Maker
Certo, eu já fiz o código do sensor "mais leve" ontem, no entanto, tô no cursinho agora e só vou poder te enviar depois das 18 horas. :feelsbatman:
Enquanto isso, poderia me dizer em quanto fica a taxa de fps do jogo quando o mapa ta lotado? É só apertar F2 que aparece na parte superior da janela do game. O novo código não vai fazer muitos milagres, por isso, recomendo usar um anti lag de qualquer forma.
Oxe

19/03/2019 às 17:36 #14 Última edição: 19/03/2019 às 17:37 por HammerStrike
Citação de: Jorge_Maker online 19/03/2019 às 13:17
Certo, eu já fiz o código do sensor "mais leve" ontem, no entanto, tô no cursinho agora e só vou poder te enviar depois das 18 horas. :feelsbatman:
Enquanto isso, poderia me dizer em quanto fica a taxa de fps do jogo quando o mapa ta lotado? É só apertar F2 que aparece na parte superior da janela do game. O novo código não vai fazer muitos milagres, por isso, recomendo usar um anti lag de qualquer forma.

Está oscilando entre 2 e 4 de fps. (Eu uso o Anti Lag do MOG, mas acho que o dele n serve pra esse tipo de mapa)
Hammer Strike