[INTERMEDIÁRIO] Record e pontuação por fase...

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

[INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por vitorfernandes13 em Dom 16 Fev 2014, 18:57

Estou criando um jogo, e nele estou pensando em colocar uma seleção de fases, cada fase terá 3 estrelas, e o jogador irá ganhar pontos, que serão usados na loja, e estou criando um modelo de seleção de fases, semelhante ao Angry Birds, mas, tem um problema, alguns jogadores malas, irão quer jogar a primeira fase umas 400 vezes por ser mais facil, para ganhar muitos pontos e muitas estrelas  Twisted Evil e eu não quero isso, quero que o jogador só ganhe MAIS PONTOS se ele QUEBRAR seu record, e quero que as estrelas que ele pegue sejam definitivamente destruidas. Irei mostrar um exemplo:

Como está no meu jogo:

Fulano joga fase 1: Ganha 1000 pontos e pega 2 das 3 estrelas
Fulano joga fase 1 de novo: Ganha mais 1200 pontos e pega mais 2 estrelas
Fulano é muito sacana, e joga a fase 1 de novo: Ganha mais 1000 pontos e mais 2 estrelas ¬¬...
TOTAL: 3200 pontos e 6 estrelas na fase 1 ¬¬

O que gostaria de fazer:

Fulano joga fase 1: Ganha 1000 pontos e pega 2 das 3 estrelas
Fulano joga fase 1 de novo: Ganha 800 pontos, como o seu record é 1000, sua pontuação CONTINUA com 1000, e agora só há 1 estrela na fase, ele pegou as outras
Fulano joga fase 1 de novo: Consegue 1200 pontos, e ganha mais 200 pontos na pontuação geral, pois seu antigo record era 1000...
TOTAL: 1200 pontos e 2 estrelas na fase 1

Tenho um objeto exclusivo para variaveis e lá declarei uma variavel de pontuação geral e outra de estrelas geral

Código:

//Armazenamento de variaveis

//Pontos
global.pontos = 0

//Estrela
global.estrelas = 0

Estou pensando em fazer assim, se o jogador passar de fase pela primeira vez, a sua pontuação obviamente já sera o record (exemplo: 1000 pontos), se ele passar de fase com menos pontuação (exemplo: 800 pontos) sua pontuação continua sendo a mesma do record (1000 pontos) e se ele passar a fase de novo com uma pontuação MAIOR que o seu record, ela será acrescentada a sua pontuação (exemplo: 1200 pontos, record antigo: 1000 pontos, então irei fazer novo record - record antigo (1200 - 1000) e então a pontuação dele sobe de 1000 para 1200 (1000+200))

Eu preciso criar uma variavel record para cada fase? Ou não? E há como destruir definitivamente a estrela, fazendo com que o jogador não a pegue novamente, se jogar a fase de novo?
--
Sei que isso é dificil pelo menos para mim U-U, mas, acho que é bom, tentarmos fazer coisas novas no Game Maker, pq senao eu nao estaria aprendendo nada, fazendo jogos com modelos parecido ne?  bounce 

vitorfernandes13

Ranking : Nota C
Número de Mensagens : 284
Data de inscrição : 11/01/2014
Notas recebidas : C
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por Eudes - Hyo em Dom 16 Fev 2014, 21:10

Fala Vitor, blz?
@EDITADO
Vc já tentou deixar o Objeto da Estrela Persistente? Não sei exatamente se isso resolveria, porque a Room é criada novamente cada vez que o jogo acessa ela. Caso não seja isso, dá uma olhada aqui embaixo.

Vou ti passar a Ideia de como eu faria, aí vc vê se serve.
Minha é ideia é criar uma variável Global, que é um Vetor, e de acordo com os valores desse vetor vc saberá qual Estrela o Player já pegou e qual Estrela deve ser criada em cada fase. Tranquilo né?
Ideia para ESTRELAS:

Primeiro, no início do jogo vc cria 2 variáveis globais e popula o vetor.
Vou supor que vc tem 10 Fases, e cada Fase vai ter apenas 3 Estrelas.
Código:
globalvar fase_atual;// serve para saber qual a fase atual
fase_atual = 0;
globalvar estrelas_fases;// vai guardar quais estrelas o Player pegou
    for(i=1; i<=10; i+=1;){ // esse '10' é pq vc tem 10 fases
        estrelas_fases[i, 1] = 0;
        estrelas_fases[i, 2] = 0;
        estrelas_fases[i, 3] = 0;
    }
Acima eu populei o Vetor 'estrelas_fases' com valores '0' para cada Estrela de cada Fase. A Estrutura dele é assim:
estrelas_fases[1][1]
estrelas_fases[1][2]
estrelas_fases[1][3]
estrelas_fases[2][1]
estrelas_fases[2][2] ... E assim vai até o estrelas_fases[10][3] .
A variável 'fase_atual' terá o número da Fase atual, quando o Player clicar pra jogar a Fase 1, vc seta o valor dela pra 1, e assim de acordo com cada Fase.
Essa parte tá pronta.

Agora, em cada Fase vc terá que por 1 Objeto que irá criar as Estrelas dinamicamente, pode ser 1 objeto diferente para cada Fase, pq as Estrelas estarão em locais diferentes, ou vc pode usar um Objeto só e verificar qual Fase está para mudar o 'x' e 'y' das Estrelas, certo?

OBS: Como cada Estrela irá saber se ela é a Estrela 1, a 2 ou a 3 da Fase?
Bom, no CREATE desse objeto que irá criar as Estrelas vc cria uma variável para por os Ids delas e cria elas na Room. É simples:
Código:
var estrelas;
//criar Estrelas
If(estrelas_fases[fase_atual, 1] = 0) {
  in = instance_create(50,400, obj_estrela);
  estrelas[1] = in.id; }
If(estrelas_fases[fase_atual, 2] = 0) {
  in = instance_create(150,400, obj_estrela);
  estrelas[2] = in.id; }
If(estrelas_fases[fase_atual, 3] = 0) {
  in = instance_create(200,400, obj_estrela);
  estrelas[3] = in.id; }
Acima, o código cria a Estrela na Posição X Y que vc colocar. Se o valor dentro do Vetor 'estrelas_fases' for '0'(zero). E nesse vetor 'estrelas' vc salva os Ids das 3 Estrelas. Agora vou mostrar onde vc vai usar isso.

No obj_Estrela, no evento CREATE, vc irá criar uma variável nela pra dizer se ela é a Estrela 1, estrela 2 ou se é a 3 comparando o Id dela com os Ids do vetor 'estrelas'. Fácil.
Código:
var numero;
for(i=1; i<=3; i+=1;){
  if(estrelas[i] = self.id)
    self.numero = i;
}
Assim, cada uma das 3 Instâncias de Estrela terá uma variável numero com os valores 1,2 ou 3.
Assim, quando o Player "pegar" essa Estrela, vc irá mudar o valor dentro do vetor 'estrelas_fases' para 1, e isso irá impedir que ela seja criada na próxima vez que entrar na Fase.
Então, no Evento que o Player pega a Estrela, pode ser um evento COLLISION do obj_estrela com o obj_Player, vc coloca assim:
Código:
estrelas_fases[fase_atual, self.numero] = 1; //'self.numero' é pra caso o Evento esteja no próprio obj_estrela
Assim, Por exemplo, quando o Player pegar a Estrela nº2 da Fase 1, o GameMaker fará isso:  estrelas_fases[1][2] = 1 .
Como o Objeto que cria as Estrelas só cria se o valor for '0', as que forem pegas não serão criadas.


Última edição por Eudes - Hyo em Seg 17 Fev 2014, 22:07, editado 1 vez(es)

Eudes - Hyo

Ranking : Nota B
Número de Mensagens : 513
Idade : 32
Data de inscrição : 02/06/2009
Notas recebidas : E + B+B
Reputação : 27
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por vitorfernandes13 em Seg 17 Fev 2014, 13:03

Eudes - Hyo escreveu:Fala Vitor, blz?
@EDITADO
Vc já tentou deixar o Objeto da Estrela Persistente? Não sei exatamente se isso resolveria, porque a Room é criada novamente cada vez que o jogo acessa ela. Caso não seja isso, dá uma olhada aqui embaixo.

Vou ti passar a Ideia de como eu faria, aí vc vê se serve.
Minha é ideia é criar uma variável Global, que é um Vetor, e de acordo com os valores desse vetor vc saberá qual Estrela o Player já pegou e qual Estrela deve ser criada em cada fase. Tranquilo né?
Ideia para ESTRELAS:

Primeiro, no início do jogo vc cria 2 variáveis globais e popula o vetor.
Vou supor que vc tem 10 Fases, e cada Fase vai ter apenas 3 Estrelas.
Código:
globalvar fase_atual;// serve para saber qual a fase atual
fase_atual = 0;
globalvar estrelas_fases;// vai guardar quais estrelas o Player pegou
for(i=1; i<=10; i+=1){ // esse '10' é pq vc tem 10 fases
  for(j=1; j<=3; i+=1){ // esse '3' é das 3 Estrelas
    estrelas_fases[i][j] = 0;
  }
}
Acima eu populei o Vetor 'estrelas_fases' com valores '0' para cada Estrela de cada Fase. A Estrutura dele é assim:
estrelas_fases[1][1]
estrelas_fases[1][2]
estrelas_fases[1][3]
estrelas_fases[2][1]
estrelas_fases[2][2] ... E assim vai até o estrelas_fases[10][3] .
A variável 'fase_atual' terá o número da Fase atual, quando o Player clicar pra jogar a Fase 1, vc seta o valor dela pra 1, e assim de acordo com cada Fase.
Essa parte tá pronta.

Agora, em cada Fase vc terá que por 1 Objeto que irá criar as Estrelas dinamicamente, pode ser 1 objeto diferente para cada Fase, pq as Estrelas estarão em locais diferentes, ou vc pode usar um Objeto só e verificar qual Fase está para mudar o 'x' e 'y' das Estrelas, certo?

OBS: Como cada Estrela irá saber se ela é a Estrela 1, a 2 ou a 3 da Fase?
Bom, no CREATE desse objeto que irá criar as Estrelas vc cria uma variável para por os Ids delas e cria elas na Room. É simples:
Código:
var estrelas;
//criar Estrelas
If(estrelas_fases[fase_atual][1] = 0) {
  in = instance_create(50,400, obj_estrela);
  estrelas[1] = in.id; }
If(estrelas_fases[fase_atual][2] = 0) {
  in = instance_create(150,400, obj_estrela);
  estrelas[2] = in.id; }
If(estrelas_fases[fase_atual][3] = 0) {
  in = instance_create(200,400, obj_estrela);
  estrelas[3] = in.id; }
Acima, o código cria a Estrela na Posição X Y que vc colocar. Se o valor dentro do Vetor 'estrelas_fases' for '0'(zero). E nesse vetor 'estrelas' vc salva os Ids das 3 Estrelas. Agora vou mostrar onde vc vai usar isso.

No obj_Estrela, no evento CREATE, vc irá criar uma variável nela pra dizer se ela é a Estrela 1, estrela 2 ou se é a 3 comparando o Id dela com os Ids do vetor 'estrelas'. Fácil.
Código:
var numero;
for(i=1; i<=3; i+=1){
  if(estrelas[i] = self.id)
    self.numero = i;
}
Assim, cada uma das 3 Instâncias de Estrela terá uma variável numero com os valores 1,2 ou 3.
Assim, quando o Player "pegar" essa Estrela, vc irá mudar o valor dentro do vetor 'estrelas_fases' para 1, e isso irá impedir que ela seja criada na próxima vez que entrar na Fase.
Então, no Evento que o Player pega a Estrela, pode ser um evento COLLISION do obj_estrela com o obj_Player, vc coloca assim:
Código:
estrelas_fases[fase_atual][self.numero] = 1; //'self.numero' é pra caso o Evento esteja no próprio obj_estrela
Assim, Por exemplo, quando o Player pegar a Estrela nº2 da Fase 1, o GameMaker fará isso:  estrelas_fases[1][2] = 1 .
Como o Objeto que cria as Estrelas só cria se o valor for '0', as que forem pegas não serão criadas.
Eu achei um pouco complicado rs... mas, eu vou reler de novo, obrigado por me ajudar, de verdade  cheers eu até estava sem animo de continuar o projeto, mas, agora, acho que ele vai valer a pena Very Happy

vitorfernandes13

Ranking : Nota C
Número de Mensagens : 284
Data de inscrição : 11/01/2014
Notas recebidas : C
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por Eudes - Hyo em Seg 17 Fev 2014, 19:19

Vc tentou marcar o Objeto Estrela como Persistent ? Talvez isso resolva.

Eudes - Hyo

Ranking : Nota B
Número de Mensagens : 513
Idade : 32
Data de inscrição : 02/06/2009
Notas recebidas : E + B+B
Reputação : 27
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por vitorfernandes13 em Seg 17 Fev 2014, 19:22

Eudes - Hyo escreveu:Vc tentou marcar o Objeto Estrela como Persistent ? Talvez isso resolva.

Vou tentar aqui :Dse der certo te envio MP. Obrigado
--
Acho que nao vai dar certo, isso funciona no GM Lite?
Eu coloco a matriz. Ex.:

Código:

if(estrela_fase[fase][1] = 0) {
  in = instance_create(50,400, obj_estrela);
  estrelas[1] = in.id;
}
mas, entre os dois colchetes aparece "Symbol ) expected"
---
Ahhhhhh, ja sei o problema, na verdade deveria colocar:

Código:

if(estrela_fase[fase,1] = 0) {

Espero que dê certo Very Happy

vitorfernandes13

Ranking : Nota C
Número de Mensagens : 284
Data de inscrição : 11/01/2014
Notas recebidas : C
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por Eudes - Hyo em Seg 17 Fev 2014, 21:10

Fala Vitor. Realmente tem esse Erro no meu código.
Essa estrutura está errada: estrela_fase[fase][1]

O certo seria: estrela_fase[fase,1]
Então, em toda parte que aparecer 'vetor[nº][nº]', vc muda pra
'vetor[nº, nº]'

Mas mesmo assim, está acontecendo algo errado no momento que o GM tenta Popular essa matriz. Tô dando uma olhada aqui pra ver o que é.
************* @EDITADO *************
Estava dando erro na hora de popula a Matriz usando 2 laços For. Então eu mudei, e o erro parou.
Essa parte do código:
Código:
for(i=1; i<=10; i+=1){ // esse '10' é pq vc tem 10 fases
  for(j=1; j<=3; i+=1){ // esse '3' é das 3 Estrelas
    estrelas_fases[i][j] = 0;
  }
}
Vc troca por isso aqui:
Código:
for(i=1; i<=10; i+=1;){ // esse '10' é pq vc tem 10 fases
    estrelas_fases[i, 1] = 0;
    estrelas_fases[i, 2] = 0;
    estrelas_fases[i, 3] = 0;
}
A ideia continua a mesma, só a Mecânica de usar um For dentro do Outro é que não funciona.
Vou alterar o código lá na minha 1a resposta , blz?

Eudes - Hyo

Ranking : Nota B
Número de Mensagens : 513
Idade : 32
Data de inscrição : 02/06/2009
Notas recebidas : E + B+B
Reputação : 27
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [INTERMEDIÁRIO] Record e pontuação por fase...

Mensagem por Conteúdo patrocinado Hoje à(s) 20:24


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