[Resolvido] Referência à instância por string

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Resolvido [Resolvido] Referência à instância por string

Mensagem por chicoweb em Qua 22 Jan 2014, 16:04

Boa Tarde galera,

Como que eu posso me referir a uma determinada instância pelo nome dela, mas tem que ser por string, por exemplo:

Objetos:

Código:
obj_inimigo

Objetos que crio via código:

Código:
inimigo001 = instance_create(100,100,"obj_inimigo")
inimigo001.vida = 2000
inimigo002 = instance_create(100,200,"obj_inimigo")
inimigo002.vida = 500
inimigo003 = instance_create(100,300,"obj_inimigo")
inimigo003.vida = 90000

Ai em determinada situação eu preciso ler o atributo vida do inimigo, mas partindo de uma string, exemplo:

Código:
nome = "inimigo002"
nome.vida += 20

Esse ultimo código não funciona como eu substituo ai pra que ele funcione a partir de uma string?


Última edição por chicoweb em Sex 24 Jan 2014, 11:33, editado 1 vez(es)

chicoweb

Ranking : Nota C
Número de Mensagens : 666
Idade : 40
Data de inscrição : 15/05/2012
Notas recebidas : B+C
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por itarodrigo em Qui 23 Jan 2014, 00:01

ao inves de usar:
Código:
nome = "inimigo002"
nome.vida += 20
use
Código:
inimigo002.vida += 20

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por shatterhand2 em Qui 23 Jan 2014, 00:06

Não tem como fazer funcionar por uma string. A ID da instância é sempre um número.

Mas você declarar a variável que guarda a referência da instância como global.

Tipo:

global.inimigo001 = instance_create(100,100,"obj_inimigo")

global.inimigo001.vida += 20

Eu acho isso uma das maiores bolas fora da linguagem GML... eu realmente gostaria que eu pudesse declarar variáveis do tipo de objetos/classes, como em qualquer linguagem orientada a objetos que existe. Eu entendo que existir apenas os tipos STRING e REAL é pra facilitar a vida de quem não tem contato com programação, mas ainda assim....

shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por Jiraya em Qui 23 Jan 2014, 01:19

crie um script e nomeie de 'L' de Literal String

coloque o seguinte codigo nesse script

Código:

//L(string)
return execute_string("return "+argument0);

Código:


inimigo001 = instance_create (100 ,100 ,L("obj_inimigo" ))
inimigo001.vida = 2000

nome=L("inimigo001");
nome.vida+=10



nota, nao deve funcionar no gms, pq a funcao execute_string foi removida.

Jiraya

Ranking : Nota A
Número de Mensagens : 1134
Data de inscrição : 20/03/2010
Notas recebidas : A+A
Reputação : 108
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

https://www.facebook.com/seito.washiro.7

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por shatterhand2 em Qui 23 Jan 2014, 01:26

Realmente não vai funcionar no GMS Smile

Eu entendo pq Execute String foi removido, mas já foi uma mão na roda várias vezes Smile

shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por saim em Qui 23 Jan 2014, 11:25

Por que você precisa lidar com strings?
Estou perguntando porque já tive situações em que acreditei ser mais fácil agir assim, usando strings, e acabei caindo em arrays. Talvez seja o seu caso.

Por exemplo, se você está fazendo um contador de instâncias e quer jogar o número no nome, é mais fácil usar arrays.
Por exemplo:
Código:
inimigo[001] = instance_create(100, 100, obj_inimigo);
inimigo[001].vida = 2000;
inimigo[002] = instance_create(100, 200, obj_inimigo);
inimigo[002].vida = 500;
inimigo[003] = instance_create(100, 300, obj_inimigo);
inimigo[003].vida = 90000;
Aí, quando for ler o atributo, use o índice ao invés da string:
Código:
indice := 2;
inimigo[indice] . vida += 20;

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por Kabeção em Qui 23 Jan 2014, 13:55

No GMS use asset_get_index(name) para retornar a id de qualquer recurso no jogo.

Mas não há nem uma vantagem em fazer isso!
Código:
// Porque fazer isso:
inimigo001 = instance_create(100,100,asset_get_index("obj_inimigo"));
inimigo001.vida = 2000;
inimigo002 = instance_create(100,200,asset_get_index("obj_inimigo"));

// Se assim é muito mais fácil e com melhor performance
var oid = obj_inimigo;

inimigo001 = instance_create(100,100,oid);
inimigo001.vida = 2000;
inimigo002 = instance_create(100,200,oid);

Esse tipo de coisa de coisa só é útil quando o próprio usuário precisa digitar o nome em tempo de execução, em um editor de mapas para o próprio desenvolvedor por exemplo.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por Jiraya em Qui 23 Jan 2014, 14:04

mais uma, sinceramente nem eu conhecia esse comando.

de fato nao e uma boa ideia usar esse metodo.

n sei como funciona internamente.

mas eu costumo usar nomes super curtos nas minhas variaveis e recursos, imagino que isso diminua o tempo de execuçao.

tipo
sprites eu uso
S0
S1
S2

para audio eu uso
A0
A1
...

o problema e que se torna confuso e trabalhoso saber o que e o que quando estou programando...

Jiraya

Ranking : Nota A
Número de Mensagens : 1134
Data de inscrição : 20/03/2010
Notas recebidas : A+A
Reputação : 108
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

https://www.facebook.com/seito.washiro.7

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por shatterhand2 em Qui 23 Jan 2014, 14:28

Isso normalmente é considerado uma má prática de programação. Use nomes de variáveis que tenham algum sentido com o que você está fazendo.

E sempre é bom deixar comentado, na declaração da variável, pra que ela serve dentro do programa Smile

shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por chicoweb em Qui 23 Jan 2014, 17:34

Eu pensei que havia algo simples, quem ai já programou em flash sabe do que eu to falando ele tem um recurso assim:

_root["nomeobj"].vida

Simplesmente se refere ao objeto pela string seria o mesmo que:

nomeobj.vida

Em todas as outras linguagens de programação que eu estudei tem esse recurso, não é má prática.

A má pratica e sim usa isso ao invés de vetor (tá confesso fiz essa eme ):

inimigo001, inimigo002, inimigo003

Vendo que isso é mais complicado que pensei, eu decidi usar vetor mesmo o maior problema e que eu fiz essa eme no meu primeiro jogo e ficou umas gambiarras no meio do código confuso hehe.
Mas preguiça de lado tá errado vou futucar tudo e organizar o código dele, e transformar em vetor mesmo.

As soluções de vocês ia servir? sim
Então seu agora vem falando que não vai usar é brincadeira.

Desculpa ae, mas acho que valeu a discussão, troca de informação é sempre ótimo neh!

Obrigado a todos!

chicoweb

Ranking : Nota C
Número de Mensagens : 666
Idade : 40
Data de inscrição : 15/05/2012
Notas recebidas : B+C
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por shatterhand2 em Sex 24 Jan 2014, 03:12

Má prática é dar nomes curtos a variáveis e recursos.

Na maioria das linguagens, você faria algo assim:

Obj_inimigo inimigo001 = new Obj_inimigo();

e você criaria uma instância de Obj_inimigo e guardaria a referência a essa instância na variável inimigo001, que seria do tipo Obj_inimigo. Esse é o mundo ideal, mas o GameMaker não dá essa possibilidade Smile

shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por Jiraya em Sex 24 Jan 2014, 10:20

nao é má pratica, quando se trata de uma linguagem interpretada, quanto menor o codigo, mais rapido é o processo para a execuçao, mas quando a linguagem é compilada, o tamanho da variavel nao faz a menor diferença, achei q soubesse disso..

Jiraya

Ranking : Nota A
Número de Mensagens : 1134
Data de inscrição : 20/03/2010
Notas recebidas : A+A
Reputação : 108
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

https://www.facebook.com/seito.washiro.7

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por theguitarmester em Sex 24 Jan 2014, 11:22

-mensagem pelo celular.


ainda não entendi para que servirá, mas tenho uma solução simples para ele, mas só lembre de fazer um ponto final caso não ache o obj que procura:

crie um script que vai chegando o nome dos objeto por objeto, assim:
var i:i=0
while i<500
{
if argument0 = object_get_name(i){return i;break}
}

então na hora de criar a instância, é só chamar o script dentro do campo obj:
ins_create(x,y,n("obj_inimigo001"))

n é o nome do script no exemplo.

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por chicoweb em Sex 24 Jan 2014, 11:31

Valeu ai mas pelas opiniões dadas aqui da galera, cheguei a conclusão que é melhor fazer pelo método de vetor mesmo.
Pode finalizar o post.

chicoweb

Ranking : Nota C
Número de Mensagens : 666
Idade : 40
Data de inscrição : 15/05/2012
Notas recebidas : B+C
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Referência à instância por string

Mensagem por Conteúdo patrocinado Hoje à(s) 12:29


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum