Lockpicking já é um recurso batante conhecido e amplamente utilizado em diversos jogos. Quem já jogou Splinter Cell, Oblivion ,Fallout (sim, usamos os gráficos de fallout neste demo) e etc. , já se deparou com essa forma de ganhar acesso a uma área, ou item protegido por uma tranca.
LockpickComponent é um componente XNA (Duh!) e pode ser integrado em qualquer jogo facilmente.
A mecânica é bem conhecida. Deve-se encontrar um ponto na circunferência que permita girar a tranca até o fim (45graus) para destrancá-la.
Ao forçar a tranca entretanto, dependendo de quão longe da posição de abrir estiver o pino, mais ou menos dano é aplicado sobre este. O pino pode quebrar se receber muito dano. Caso hajam mais pinos disponíveis, o componente automaticamente posiciona um pino novo para que o jogador possa tentar novamente.
Baseado na dificuldade escolhida, o componente gera um intervalo aleatório onde o pino deve ser posicionado que a tranca possa ser aberta. Quanto mais próximo o pino estiver deste intervalo, mais a chave de fenda conseguirá girar a tranca. Assim, é possível girar a tranca até bem próximo do fim e perceber que o pino apesar de próximo, ainda não está na posição ideal.
O construtor recebe além da referência ao game, a dificuldade e o total de pinos disponíveis para abrir a tranca.
A assinatura do construtor é a seguinte:
public LockpickComponent(Game pGame, Difficulty pDificulty, int pPinCount)
Logo, uma tranca com dificuldade normal, tendo 3 pinos disponíveis ficaria assim:
LockpickComponent _lpc;
…
// Uma tranca de dificuldade Normal. O jogador terá 3 pinos para tentar abri-la
_lpc = new LockpickComponent(this, _Difficulty.NORMAL, 3);
Ao criar uma instância do componente, pode-se configurar alguns handlers para os 3 eventos gerados pelo componente:
// Evento ao abrir a tranca
_lpc.OnUnlock += onLockEvent;
// Evento ao desistir de abrir a tranca
_lpc.OnCancelPickinLock += onLockEvent;
// Evento ao quebrar todos os pinos disponíveis
_lpc.onBreakAllPins += onLockEvent;
Ao iniciar, o componente faz uma pequena animação, aproximando a “câmera”. O zoom máximo pode ser customizado através da propriedade Scale, sendo 1.0 o tamanho original. No demo o valor padrão (1.5) foi utilizado.
this.Components.Remove(_lpc);
No demo, associei todos os eventos ao mesmo método, que simplesmente habilita o menu e remove o componente deixando a tela principal visível novamente. Em um jogo real, provavelmente você queira associar o eventos a rotinas que atualizem o inventário do personagem para debitar o numero de pinos usados, , abra uma porta em caso de sucesso e obviamente, remova o componente no final.
O demo pode ser baixado aqui Lembrando que é preciso o xna runtime 3.1 para que o demo execute corretamente.
:)
caraca, nos meros mortais podemos criar jogos!
ResponderExcluircara super interessante continue criando seus jogos vc tem talento, e um dia entrarei para esse grupo forte de programção e darei minha humilde contribuição!
abraço e programação sempre!
is beatifull! RS