Cartas na mão organizadas [Sistema de Cadeados]

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

Idéia Cartas na mão organizadas [Sistema de Cadeados]

Mensagem por Felipe Reis Magno 2 em Sex 27 Mar 2015, 11:17

Sistema de Cadeados
Olá galera do gmbr!!!
Hoje não estou aqui para fazer perguntas, mas pela pela primeira vez para ajudar!
Happy
Arrumei uma dor de cabeça enquanto estava tentando organizar as cartas na mão do player de modo parecido com o Yu-Gi-Oh!!! Meu objetivo era concentrar as cartas em ordem de chegada na mão do jogador!

Como estava difícil, prefiri fazer testes com uma engine particular para poder fazer as alterações necessárias até chegar a uma solução e finalmente consegui, criando um sistema simples que eu nomeei de Sistema de Cadeados!
Aviso, isso não é um Tutorial completo

Eu não sei se já existe algo do tipo, mas gostaria de compartilhar com vocês, pois pra mim foi muito difícil criar algo assim, tive que rachar o crânio para criar algo simples.
Por isso resolvi abri os códigos e a estrutura que eu criei para aqueles que desejam criar um jogo de cartas e estão meio perdidos.
É uma lógica simples de se interpretar, por isso espero que estudem e a consigam transforma-lá para criar outras espécies de listas:



Vamos então aos códigos:
Na estrutura que eu criei existem 4 objetos:

obj_cartas
obj_mao
obj}_baralho
obj_controle_mao


No obj_cartas tenho um sprite de 7 subimagens.
Em seu Create:
Código:

///Controle inicial da carta

//imagem de índice e sua respectiva velocidade em frames por segundo
image_speed=0;
randomize();
image_index=random(7);

//Variáveis principais
posicao=0;//declara a variável "posicao"
cadeado_interno="trancado";//o Sistema de Cadeados interno começa trancado
global.cartas_na_mao+=1;//aumenta uma carta na mão
//Estas variáveis servem para confirmar a variável "posicao"

//Este código condicional abaixo define a "posicao" do objeto carta na mão do jogador quando a carta é criada na room
if global.cartas_na_mao==1
{
posicao=1;
}

if global.cartas_na_mao==2
{
posicao=2;
}

if global.cartas_na_mao==3
{
posicao=3;
}

if global.cartas_na_mao==4
{
posicao=4;
}

if global.cartas_na_mao==5
{
posicao=5;
}

if global.cartas_na_mao==6
{
posicao=6;
}

Como está comentado, eu não me aprofundarei rs

No Step do obj_cartas:
Código:

///Controle constante de sua posição na mão [Sistema de Cadeados]

//Controle primário:
if posicao==1
{
x = obj_controle_mao.x+32;
y = obj_controle_mao.y;
}

if posicao==2
{
x = obj_controle_mao.x+174;
y = obj_controle_mao.y;
}

if posicao==3
{
x = obj_controle_mao.x+316;
y = obj_controle_mao.y;
}

if posicao==4
{
x = obj_controle_mao.x+458;
y = obj_controle_mao.y;
}

if posicao==5
{
x = obj_controle_mao.x+600;
y = obj_controle_mao.y;
}

if posicao==6
{
x = obj_controle_mao.x+742;
y = obj_controle_mao.y;
}
//(o controle primário irá verificar constantemente se a carta mudou de posição na mão do jogador)

//Controle secundário:
//(usando cadeados)
if posicao==2
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=1;
cadeado_interno="trancado";
}

if posicao==3
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=2;
cadeado_interno="trancado";
}

if posicao==3
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=2;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==4
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=5
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==4
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==5
if cadeado_interno=="aberto"
{
posicao=5;
cadeano_interno="trancado";
}
//O sistema de cadeados internos servirá unicamente para evitar que sua posiçõa se altere várias vezes num mesmo loop
//Assim que a variável "posicao" e "global.carta_atual" forem verificadas com o cadeado aberto, a carta avançará uma posição na mão do jogador e o cadeado será fechado para que os outros condicionais do objeto não se acionem
//Fim do Sistema de Cadeado

No Event de clicar com o mouse no obj_cartas:
Código:

alarm[0]=30;

No Alarm1 do obj_cartas:
Código:

///Controle de morte da carta [Ativando Sistema de Cadeados]
//Se por exemplo, a carta destruida for a primeira da mão (posicao==1):
if posicao==1
{
global.cartas_na_mao-=1;//diminui uma carta da mão do jogador
global.carta_atual=1;//a carta destruída atualmente que será alterada somente na próxima carta destruída
obj_cartas.cadeado_interno="aberto";//a variável interna "cadeado_interno" é acionado, abrindo o Sistema de Cadeados em todas as cartas da room
instance_destroy();//Esta instância será destruída
}

if posicao==2
{
global.cartas_na_mao-=1;
global.carta_atual=2
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==3
{
global.cartas_na_mao-=1;
global.carta_atual=3;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==4
{
global.cartas_na_mao-=1;
global.carta_atual=4;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==5
{
global.cartas_na_mao-=1;
global.carta_atual=5;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==6
{
global.cartas_na_mao-=1;
global.carta_atual=6;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

Agora vamos tratar do obj_mao

No Create do obj_mao coloque:
Código:

///Mão do jogador

//Variável principal do game:
global.cartas_na_mao=0;
global.carta_atual=0;

instance_create(x+468,y-180,obj_controle_mao);

No Draw do obj_mao:
Código:

draw_sprite(spr_mao,0,x,y);
draw_set_color(c_black);
draw_text(32,32,"Voce tem "+string(global.cartas_na_mao)+" carta(s) em sua mao.");

Agora vamos tratar do obj_baralho:

No press do obj_baralho:
Código:

//O jogador só pode ter seis cartas na mão
if global.cartas_na_mao<6
instance_create(x,y,obj_cartas);
//Após isso este objeto irá parar de criar cartas

Agora vamos tratar do último objeto, o obj_controle_mao:

No Step do obj_controle_mao
Código:

///Controlar posição visual das cartas na mão de acordo com a quantidade de cartas
if global.cartas_na_mao==0
{
x = obj_mao.x+468;
}

if global.cartas_na_mao==1
{
x = obj_mao.x+468;
}

if global.cartas_na_mao==2
{
x = obj_mao.x+350;
}

if global.cartas_na_mao==3
{
x = obj_mao.x+288;
}

if global.cartas_na_mao==4
{
x = obj_mao.x+226;
}

if global.cartas_na_mao==5
{
x = obj_mao.x+167;
}

if global.cartas_na_mao==6
{
x = obj_mao.x+103;
}

Bem gente, este foi o código que eu usei para organizar as cartas na mão do player sem usar ds_list, ds_grid ou arrays, apenas controlando as variáveis internas através de variáveis globais!

Razz Happy Happy

Bem, se vocês acharam que esta postagem foi útil, comentem e me deem joinha.
Testem e depois deem sua opinião!
Obrigado!!!

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Idéia Re: Cartas na mão organizadas [Sistema de Cadeados]

Mensagem por Kapoty em Sex 27 Mar 2015, 11:47

Vamos lá,

Spoiler:
if global.cartas_na_mao==1
{
posicao=1;
}

if global.cartas_na_mao==2
{
posicao=2;
}

if global.cartas_na_mao==3
{
posicao=3;
}

if global.cartas_na_mao==4
{
posicao=4;
}

if global.cartas_na_mao==5
{
posicao=5;
}

if global.cartas_na_mao==6
{
posicao=6;
}
Se resume em:
Código:
posicao=global.cartas_na_mao;

Spoiler:
if posicao==1
{
x = obj_controle_mao.x+32;
y = obj_controle_mao.y;
}

if posicao==2
{
x = obj_controle_mao.x+174;
y = obj_controle_mao.y;
}

if posicao==3
{
x = obj_controle_mao.x+316;
y = obj_controle_mao.y;
}

if posicao==4
{
x = obj_controle_mao.x+458;
y = obj_controle_mao.y;
}

if posicao==5
{
x = obj_controle_mao.x+600;
y = obj_controle_mao.y;
}

if posicao==6
{
x = obj_controle_mao.x+742;
y = obj_controle_mao.y;
}
Se resume em:
Código:
x = obj_controle_mao.x+32+(posicao-1)*142;
y = obj_controle_mao.y;

Spoiler:
if posicao==2
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=1;
cadeado_interno="trancado";
}

if posicao==3
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=2;
cadeado_interno="trancado";
}

if posicao==3
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=2;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==4
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=3;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==5
if global.carta_atual==4
if cadeado_interno=="aberto"
{
posicao=4;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==1
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==2
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==3
if cadeado_interno=="aberto"
{
posicao=5
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==4
if cadeado_interno=="aberto"
{
posicao=5;
cadeado_interno="trancado";
}

if posicao==6
if global.carta_atual==5
if cadeado_interno=="aberto"
{
posicao=5;
cadeano_interno="trancado";
}
Se resume em:
Código:
if (global.carta_atual<posicao and cadeado_interno=="aberto")
{
posicao-=1;
cadeado_interno="trancado";
}

Spoiler:
if posicao==1
{
global.cartas_na_mao-=1;//diminui uma carta da mão do jogador
global.carta_atual=1;//a carta destruída atualmente que será alterada somente na próxima carta destruída
obj_cartas.cadeado_interno="aberto";//a variável interna "cadeado_interno" é acionado, abrindo o Sistema de Cadeados em todas as cartas da room
instance_destroy();//Esta instância será destruída
}

if posicao==2
{
global.cartas_na_mao-=1;
global.carta_atual=2
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==3
{
global.cartas_na_mao-=1;
global.carta_atual=3;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==4
{
global.cartas_na_mao-=1;
global.carta_atual=4;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==5
{
global.cartas_na_mao-=1;
global.carta_atual=5;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}

if posicao==6
{
global.cartas_na_mao-=1;
global.carta_atual=6;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
}
Se resume em:
Código:
global.cartas_na_mao-=1;
global.carta_atual=posicao;
obj_cartas.cadeado_interno="aberto";
instance_destroy();
Entre outros...
A intenção do tutorial foi boa, mas o código está bastante 'poluído'.

Kapoty

Ranking : Nota B
Número de Mensagens : 635
Data de inscrição : 05/11/2011
Notas recebidas : E + D + C + B + D +B + A
Reputação : 22
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Idéia Re: Cartas na mão organizadas [Sistema de Cadeados]

Mensagem por theguitarmester em Sex 27 Mar 2015, 12:01

É como o Kapoty mostrou, é sempre bom automatizar os códigos usando voltas/loops(e nesse nem precisou de loops/voltas), até para ficar mais fácil de editar e de expandir o sistema.


Mas a engine e o código são válidos, e sua ideia em compartilhar é boa.

Não sei se tem muito sistemas desses mesmo, enfim, não entendi bem o cadeado, mas, é para enquanto as cartas não foram redistribuídas, elas se permanecerem no mesmo lugar, certo?

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 20
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

Idéia Re: Cartas na mão organizadas [Sistema de Cadeados]

Mensagem por Willy em Sex 27 Mar 2015, 12:04

Rapaz, tu fez uma senhora gambiarra ai. Suspect
Meu objetivo era concentrar as cartas em ordem de chegada na mão do jogador!
Você poderia ter feito usando um sistema de stack ou de queue (não me lembro ao certo qual dos dois é correto para sua situação). Esse estruturador de dados serve justamente para respeitar uma ordem de chegada e saída.
A partir da stack/queue, você pode manipular o conteúdo e organizar a posição x das cartas simplesmente usando a posição da carta na stack/queue multiplicando pela largura da sua carta (142, certo?).
Se bem que, você poderia usar ds_list também, já que ela também respeita a ordem de chegada.

Bom, não me aprofundei no seu código, portanto realmente pode não servir para você, mas, de acordo com meu pensamento lógico, easa é a forma mais simples e fácil de fazer manutenções futuras.

No mais, parabéns por solucionar seu problema, é gratificante quebrar a cabeça por horas e por um fim no problema.

Flws... blz

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 22
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Idéia Re: Cartas na mão organizadas [Sistema de Cadeados]

Mensagem por Felipe Reis Magno 2 em Sex 27 Mar 2015, 22:53

Gambiarra kkkkkkkkkkkkkkkkkk
Gostei desse comentário! rs

Bem gente, eu tentei né, mas eu gostei das simplificações aplicadas, reduziu os códigos em 80% deixando mais leve de se rodar e inserir outras utilidades! Muito obrigado Kapoty! Happy

Theguitarmester, o sistema é para organizar centralizado na room as cartas seja qual for a quantidade delas pra ficar bonito e organizado. No instance_destroy ou antes, o programador inseri qualquer código para que a carta seja lançada no campo, dai vai do critério do programador.

Fiz este código pois eu si que muita gente também é fascinado por jogos de cartas! Obrigado por cada comentário gente!

Felipe Reis Magno 2

Ranking : Nota E
Número de Mensagens : 43
Data de inscrição : 08/08/2014
Notas recebidas : E
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Idéia Re: Cartas na mão organizadas [Sistema de Cadeados]

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


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