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
Dúvida com uso de ds_list
3 participantes
Página 1 de 1
Dúvida com uso de ds_list
Oi pessoal, eu estou ainda fazendo meu tower defense aqui, e queria fazer uma I.A. para os turrets, que seguissem o inimigo com mais vida, ou o mais próximo do fim do path, etc. Dei uma procurada na net e vi um pessoal falando pra usar listas(ds_list_create), mas não entendi absolutamente nada desse recurso, e queria saber se alguém consegue me explicar direitinho como usar, e como colocar na I.A. dos meus turrets.
Agradecido desde já!
Agradecido desde já!
Re: Dúvida com uso de ds_list
ds_lists são como arrays turbinadas. Pense na list como uma longa longa linha de caixinhas onde você coloca alguma coisa em cada uma. Depois, você pode pegar alguma coisa de uma das caixinhas.
No caso, você coloca o valor a ser considerado dos inimigos e pega um deles pra turret mirar.
O que te vai ser útil é o comando ds_list_sort, que organiza a list em ordem crescente ou decrescente. Daí, você pode pegar o maior/menor e associar o resultado com o inimigo. O inimigo que estiver no raio de tiro e o valor da variável coincidir com o maior/menor da list é o que vai ser mirado.
Um pouco de código? Em geral eu deixaria você quebrar a cabeça, mas tenho entrado tão pouco no fórum que o código só apareceria ano que vem, então vamos de uma vez.
No caso, você coloca o valor a ser considerado dos inimigos e pega um deles pra turret mirar.
O que te vai ser útil é o comando ds_list_sort, que organiza a list em ordem crescente ou decrescente. Daí, você pode pegar o maior/menor e associar o resultado com o inimigo. O inimigo que estiver no raio de tiro e o valor da variável coincidir com o maior/menor da list é o que vai ser mirado.
Um pouco de código? Em geral eu deixaria você quebrar a cabeça, mas tenho entrado tão pouco no fórum que o código só apareceria ano que vem, então vamos de uma vez.
- Código:
/// scr_escolhe_mais_forte(raio, parent_dos_inimigos);
// escolhe o inimigo (entre os childs daquele dado como argumento) cuja variavel "forza" é a maior
// considera apenas aqueles que estiverem ao alcance do raio, que também entra como argumento
// o script deve ser chamado do pela turret, porque usa variáveis dela (x e y).
var raio, inimigo, ds_list_inimigos, ds_list_forza, maior_forza, i, inimigo_checa, inimigo_return;
raio := argument0; // raio de alcance do turret
inimigo := argument2; // nome do parent ou do objeto que corresponde aos inimigos
ds_list_forza := ds_list_create(); // cria a lista, vazia por enquanto, pra colocar as forças
ds_list_inimigos := ds_list_create(); // cria a lista, vazia por enquanto, pra colocar os inimigos
with(inimigo){ // todos os inimigos childs daquele dado como argumento entram no loop
if (point_distance(x, y, other . x, other . y) <= raio){ // se está perto o suficiente
ds_list_add(ds_list_forza, forza); // coloca o valor da variável "forza" na list
ds_list_add(ds_list_inimigos, id); // coloca o valor da id na list
}
}
// agora tem uma list cheia de valores de "forza" e outra cheia de ids. Note que a list não associa, ainda, os valores de "forza" aos objetos de onde eles vieram. Isso não vai ter problema em breve, porque nós não eliminamos nem alteramos o valor NO OBJETO, então podemos usar a comparação pra saber qual objeto corresponde àquele valor.
// a lista com as ids não era realmente necessária, mas vai economizar um segundo loop por TODOS os inimigos. Nós vamos verificar só os que estiverem na lista, ou seja, só os que estiverem dentro do raio de alcance.
ds_list_sort(ds_list_forza, false); // organiza a lista em ordem decrescente. Assim, o maior valor será o primeiro valor.
maior_forza := ds_list_find_value(ds_list_forza, 0); // pega o primeiro valor da lista e joga numa variável
// agora, escolhe o primeiro inimigo cuja "forza" for igual àquela que escolhemos
for(i := 0; i < ds_list_size(ds_list_inimigos); i += 1){ // do começo ao final da lista
inimigo_checa := ds_list_find_value(ds_list_inimigos, i); // coloca o valor da list numa variável (puramente didático, dá pra eliminar essa parte)
if (inimigo_checa . forza == maior_forza){ // se é quem estávamos procurando (se a forza dele é igual à maior das forzas)
inimigo_return := inimigo_checa; // agora sim, é importante colocar o bicho numa variável
break; // já achou, não tem motivo pra continuar o loop
}
}
// já temos a resposta, eliminamos as ds_lists
ds_list_destroy(ds_list_forza);
ds_list_destroy(ds_list_inimigos);
return(inimigo_return); // retorna a id do inimigo
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: Dúvida com uso de ds_list
Desculpa estar revivendo este post, mas Saim, eu tentei aqui no meu jogo e o turret simplesmente ignora todos os inimigos. Se você puder, peço que faça outro código, mas dessa vez, utilizando as vars do meu jogo, só pra eu entender melhor, por favor:
obj_enemy - nome do inimigo;
range - raio do turret; (já estabelecido no turret)
Ao invés de usar "forza", peço que faça um script com path_position;
list_path - lista com os 'path_position's;
list_id - lista com id's.
obj_enemy - nome do inimigo;
range - raio do turret; (já estabelecido no turret)
Ao invés de usar "forza", peço que faça um script com path_position;
list_path - lista com os 'path_position's;
list_id - lista com id's.
Re: Dúvida com uso de ds_list
Se não deu erro de variável inexistente, é porque você já substituiu todas (acho que fez corretamente).
Crie o script feito pelo saim. Depois coloque no evento Create:
Se ele mostrar o nome do objeto inimigo, é porque o código funciona.
Crie o script feito pelo saim. Depois coloque no evento Create:
- Código:
show_message(object_get_name(scr_escolhe_mais_forte(800, objeto_inimigo).object_index));
Se ele mostrar o nome do objeto inimigo, é porque o código funciona.
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: Dúvida com uso de ds_list
Uma dúvida que eu tive no final do script do Saim:
Esse "return" que ele usa, ele vai retornar aonde, em uma var? Então eu tenho que chamar o script assim:
Esse "return" que ele usa, ele vai retornar aonde, em uma var? Então eu tenho que chamar o script assim:
- Código:
alvo = script(script_do_Saim);
Re: Dúvida com uso de ds_list
Sim. Daí, por exemplo, você pode usar:
- Código:
move_towards_point(alvo.x, alvo.y, 5);
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: Dúvida com uso de ds_list
Olha Pedro, eu fiz assim:
Script do turret:
Script (script_target2_enemy)
Script do turret:
- Código:
if mode=1 {
if instance_exists(obj_enemy) {
if target<=range*32 {
target=instance_nearest(x,y,obj_enemy);
}
else {
target=noone;
}
}
else {
target=noone;
}
}
if mode=2 {
target=script_target2_enemy();
}
Script (script_target2_enemy)
- Código:
var range, list_enemy, list_path, last_path, i, enemy_check, enemy_return;
list_path := ds_list_create();
list_enemy := ds_list_create();
with(obj_enemy){
if (point_distance(x, y, other . x, other . y) <= range*32){
ds_list_add(list_path, path_position);
ds_list_add(list_enemy, id);
}
}
ds_list_sort(list_path, false);
last_path := ds_list_find_value(list_path, 0);
for(i := 0; i < ds_list_size(list_enemy); i += 1){
enemy_check := ds_list_find_value(list_enemy, i);
if (enemy_check . path_position == last_path){
obj_enemy_return := enemy_check;
break;
}
}
ds_list_destroy(list_path);
ds_list_destroy(list_enemy);
return(enemy_return);
Re: Dúvida com uso de ds_list
Você criou a variável mas não definiu o valor dela. Você colocou "obj_" antes... Sempre use o mesmo nome.
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: Dúvida com uso de ds_list
Certo, tirei o "obj_" antes da var. Engraçado que o script roda tranquilo em um turret, mas nos outros ele dá o mesmo erro de não ter definido a var 'enemy_return', mesmo que todos os turrets usem o mesmo script! #buguei
-EDIT-
Parece que quando eu coloco o turret depois da wave, ele funciona o script perfeitamente, mas se eu coloco antes de aparecer algum inimigo, ele dá o erro da variável, e continua dando mesmo depois do inimigo aparecer! o.o
-EDIT-
Parece que quando eu coloco o turret depois da wave, ele funciona o script perfeitamente, mas se eu coloco antes de aparecer algum inimigo, ele dá o erro da variável, e continua dando mesmo depois do inimigo aparecer! o.o
Re: Dúvida com uso de ds_list
Coloque uma condição:
- Código:
if (instance_exists(alvo)){
move_towards_point(alvo.x, alvo.y, 1000);
}
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: Dúvida com uso de ds_list
Então Pedro, eu testei algumas coisas, coloquei também o código, mas parece que dá o erro da variável quando não há monstros no raio do turret, então estava pensando nesse código:
PS: Obrigado por estar sendo super paciente comigo e ainda estar tentando me ajudar!
-EDIT-
Aí Pedro, eu tentei fazer uma coisinha aqui, e parece que funcionou... o.o
- Código:
with(obj_enemy) {
if (point_distance(x, y, other . x, other . y) <= other.range*32){
ds_list_add(list_path, path_position);
ds_list_add(list_enemy, id);
}
else {
///o que fazer?
}
}
PS: Obrigado por estar sendo super paciente comigo e ainda estar tentando me ajudar!
-EDIT-
Aí Pedro, eu tentei fazer uma coisinha aqui, e parece que funcionou... o.o
- Código:
with(obj_enemy) {
if (point_distance(x, y, other . x, other . y) <= other.range*32){
ds_list_add(list_path, path_position);
ds_list_add(list_enemy, id);
}
}
if ds_list_empty(list_path) {
exit;
}
Tópicos semelhantes
» Duvida com colisao...sempre tive essa duvida...
» duvida barra de força(duvida diferente das outras)
» Jogo 3D, Aminha duvida pode ser a voça duvida.
» [Duvida]to com duvida de sprite aki
» duvida em 3d
» duvida barra de força(duvida diferente das outras)
» Jogo 3D, Aminha duvida pode ser a voça duvida.
» [Duvida]to com duvida de sprite aki
» duvida em 3d
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|