Vim aqui compartilhar uma série de tutoriais que eu fiz explicando como fazer um sistema de tiro.
Nele eu inicio com alguns elementos bem simples e progressivamente vou aumentando a complexidade.
Você vai aprender a cirar o sistema básico que a maioria das pessoas usa, o de instanciar o tiro e ele se mover até o alvo, mas também vou mostrar como criar um sistema de Raycast para o tiro, fazendo com que ele apareça no alvo caso o mesmo esteja no caminho do tiro.
Segue os links para os vídeos.
Parte 1:
Parte 2
Parte 3
Parte 4
Re: [Vídeo] Sistema de Tiro com o Game Maker Studio 2
Enviado: Seg Mai 13, 2019 9:35 pm
por All-x
Assisti aos vídeos. Ótima dinâmica, é fácil acompanhar teu raciocínio.
Talvez o algoritmo do Ray Cast precise de alguma otimização, mas ficou muito bom e funcional.
Parabéns! o/
Re: [Vídeo] Sistema de Tiro com o Game Maker Studio 2
Enviado: Seg Mai 13, 2019 10:11 pm
por None
Hahahahah
Eu tento simplificar tudo ao máximo, aí o código acaba tendo inconsistências (basta ver o horror que ficou o código de virar para os lados no final).
Sobre o raycast em si, eu não consigo ver muitas formas de deixar ele melhor, um DDA no game Maker iria exigir mais por causa do ponto flutuante e Bresenham é excessivamente complexo para passar em um tutorial de tiro kkkk
Re: [Vídeo] Sistema de Tiro com o Game Maker Studio 2
Enviado: Ter Mai 14, 2019 1:43 pm
por All-x
Não digo em relação a implementação, mas sim do uso mais otimizado dos recursos.
Ex: Teu script tem objetivo de dar um tiro certeiro no inimigo, mesmo sendo muito rápido (instantâneo, na verdade). Correto? Basta um calculo rápido pra perceber que escolhendo tamanho máximo de 400, haverá na maior parte do tempo 400 chamadas à função collision_line por step (que já percorre os inimigos e piora quando checa precisamente). Fora o draw_line que é sobreposto 400 vezes por step também (Você desenha 399 linhas a toa)[Sei que é pra debug, tanto que tu remove no final]. Tudo isso só vai ser menor se algum inimigo colidir com a linha.
Se o objetivo é acertar primeiro inimigo à colidir com a linha, basta fazer um loop nos inimigos e pegar o mais próximo. No algoritmo que fiz otimizando isso, o collision_line é chamado apenas para os inimigos ativos. A linha não é desenhada com precisão, já que é apenas um debug. Mas se fosse pra ter a linha bastava adicionar um while pra que enquanto houvesse colisão ela ficasse menor.
Achei o método interessante, e é sempre bom discutir as várias formas de fazer algo. Afinal eu só consegui fazer este, vendo o seu primeiro. E certamente usarei nos meus projetos.
Segue o script scr_raycast(obj, distância, direção, desenha linha[true,false]):
var _obj = argument0; // Objeto selecionado
var _dist = argument1; // Distância
var _dir = argument2; // Direção
var _draw = argument3; // Desenha ou não a linha
var _inst = noone; // Instância que colidiu com a linha
var _near = noone; // Instância mais próxima
var _first = noone; // Se encontrou a 1º instância
// Percorre todos as instâncias de '_obj'
for (var i = 0; i < instance_number(_obj); i++)
{
var ii = instance_find(_obj, i); // Instância atual no loop
var x2 = x + lengthdir_x(_dist, _dir); // Posição X final da linha
var y2 = y + lengthdir_y(_dist, _dir); // Posição Y final da linha
// Pega instância que colidiu com a linha
_inst = collision_line(x, y, x2, y2, ii, false, true);
// Se a instância atual colidiu com a linha
if _inst
{
// Já define a primeira instância como a mais próxima
if !_first {_near = _inst; _first = true;}
var d1 = point_distance(x, y, _inst.x, _inst.y); // Distância para a instância atual
var d2 = point_distance(x, y, _near.x, _near.y); // Distância para a instância mais próxima
// Se a instância atual está mais próxima, define '_near'
if d1 < d2 _near = _inst;
}
}
// Desenha linha
if _draw
{
draw_line_color(x, y, x2, y2, c_green, c_green);
}
// Retorna a instância mais próxima, que colidiu com a linha
return _near;
Re: [Vídeo] Sistema de Tiro com o Game Maker Studio 2
Enviado: Ter Mai 14, 2019 3:17 pm
por None
Então... Eu não sei se seu script está realmente otimizado, fazendo uma análise assintótica dele aqui de cabeça, ele parece bem mais pesado que o outro script...
Se tu quiser otimizar ele mesmo, te aconselho a dar uma olhada no algoritmo de bresenham para linhas retas, ele é a forma mais eficiente de criar linhas.