Conectar-se
Quem está conectado
22 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 22 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Nota C
Notas recebidas : B+C
Data de inscrição : 15/05/2012
Número de Mensagens : 666
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 49

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuário

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

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)
avatar
Data de inscrição : 28/08/2010
Número de Mensagens : 599
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 52

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Qui 23 Jan 2014, 00:01
ao inves de usar:
Código:
nome = "inimigo002"
nome.vida += 20
use
Código:
inimigo002.vida += 20
avatar
Data de inscrição : 21/10/2009
Número de Mensagens : 645
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 11

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://shatterhand.beatthegame.net

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

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....
avatar
Ranking : Nota A
Notas recebidas : A+A
Data de inscrição : 20/03/2010
Número de Mensagens : 1134
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 108

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuáriohttps://www.facebook.com/seito.washiro.7

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

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.
avatar
Data de inscrição : 21/10/2009
Número de Mensagens : 645
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 11

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://shatterhand.beatthegame.net

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

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
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 121

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

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

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;
avatar
Ranking : Sem avaliações
Data de inscrição : 08/06/2008
Número de Mensagens : 2314
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 100

Prêmios
   : 3
   : 0
   : 1
Ver perfil do usuáriohttp://blackcapapps.blogspot.com.br/

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

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.
avatar
Ranking : Nota A
Notas recebidas : A+A
Data de inscrição : 20/03/2010
Número de Mensagens : 1134
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 108

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuáriohttps://www.facebook.com/seito.washiro.7

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

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...
avatar
Data de inscrição : 21/10/2009
Número de Mensagens : 645
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 11

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://shatterhand.beatthegame.net

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

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
avatar
Ranking : Nota C
Notas recebidas : B+C
Data de inscrição : 15/05/2012
Número de Mensagens : 666
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 49

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuário

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

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!
avatar
Data de inscrição : 21/10/2009
Número de Mensagens : 645
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 11

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuáriohttp://shatterhand.beatthegame.net

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

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
avatar
Ranking : Nota A
Notas recebidas : A+A
Data de inscrição : 20/03/2010
Número de Mensagens : 1134
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 108

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuáriohttps://www.facebook.com/seito.washiro.7

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

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..
avatar
Ranking : Sem avaliações
Notas recebidas : B
Data de inscrição : 28/02/2012
Número de Mensagens : 1908
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 1
Reputação : 80

Prêmios
   : 2
   : 2
   : 1
Ver perfil do usuáriohttp://guitarmester.no.comunidades.net/index.php?pagina=19362978

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

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.
avatar
Ranking : Nota C
Notas recebidas : B+C
Data de inscrição : 15/05/2012
Número de Mensagens : 666
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 49

Prêmios
   : 1
   : 0
   : 0
Ver perfil do usuário

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

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.
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum