01 - Apresentação
Para a primeira parte do trabalho Revisitando os clássicos, escolhi o jogo Oil Panic. Lançado em 28 de maio de 1982 para a série de vídeo game portátil Game & Watch, desenvolvida e produzida pela Nintendo entre os anos 1980 e 1991. Foi a segunda linha de jogos desenvolvidos pela empresa, sendo a primeira portátil, responsável pelo primeiro grande sucesso da companhia.
Oil Panic foi o primeiro jogo da série Multi Screen que utilizava duas telas, superior e inferior, de cristal líquido. O jogador controla um auxiliar de estações que usa um balde para conter as gotas de óleo de um cano com vazamento. Seu objetivo é juntar as gotas de óleo e despejá-las em um tambor de óleo segurado por outro auxiliar de estações para que ele possa levar aos carros que esperam ao lado da bomba de gasolina desativada.
As gotas de óleo possuem três posições que podem aparecer e que ficam acima de fontes inflamáveis que podem causar um incêndio, por tanto o auxiliar deve evitar o contato do óleo com as fontes.
Além disso, o balde só tem a capacidade para conter três gotas, caso o jogador tente pegar mais uma gota o balde vai transbordar, causando um incêndio.
Ademais, o jogador também pode errar ao derramar o balde no tambor de óleo, atingindo o óleo nos clientes e podendo também perder por isso.
02 - Modelo natural
Jogador
- O jogador pode estar em cinco posições: esquerda(-2), esquerda direita(-1), centro(0), direita esquerda(1) e direita(2).
- Além disso, quando o jogador está nas posições das extremidades, esquerda e direita, é gerado um segundo sprite do jogador que pode estar em duas posições, esquerda e direita, de acordo com o primeiro sprite do jogador.
- Quando o jogador estiver na esquerda(-2), seu movimento fica restrito podendo somente mover-se para esquerda direita(-1). O mesmo ocorre quando a posição do player é na direita(2), seu movimento fica restrito somente para mover-se para direita esquerda(1).
- Além disso, quando o jogador está nas posições das extremidades, esquerda e direita, é gerado um segundo sprite do jogador que pode estar em duas posições, esquerda e direita, de acordo com o primeiro sprite do jogador.
- Quando o jogador estiver na esquerda(-2), seu movimento fica restrito podendo somente mover-se para esquerda direita(-1). O mesmo ocorre quando a posição do player é na direita(2), seu movimento fica restrito somente para mover-se para direita esquerda(1).
- O ajudante auxiliar pode estar em quatro posições. Duas são somente para transitar de uma posição da extremidade direita para a esquerda.
- Quando o npc fica em qualquer uma das duas posições da extremidade, ele fica apto a receber o óleo que o player precisa despejar no seu tambor.
- Nas posições das extremidades ele fica um tempo até mudar de posição e, consequentemente, nas posições transitórias ele apenas transita entre elas sem ficar um tempo nessas posições.
- Cada vez que o npc recebe o óleo do player, a pontuação na tela aumenta dependendo de quanto o balde estiver cheio.
- O óleo é gerado aleatoriamente em três posições distintas: esquerda, centro e direita.
- Após ser gerado, o óleo continua na mesma coluna da origem, mudando apenas sua linha e descendo lentamente até a fonte inflamável.
- O óleo pode ser pego pelo player, enchendo o balde, ou pode cair em uma das fontes inflamáveis causando um incêndio.
- Cada vez que o óleo é pego pelo jogador, a pontuação aumenta.
- Os incêndios só aparecem quando a gota de óleo colide com as fontes inflamáveis.
- Possuem três posições possíveis: esquerda, centro e direita.
- Toda vez que ocorre o incêndio, o jogo pausa e logo depois é reiniciado, apagando quaisquer gotas de óleo remanescentes na tela e esvaziando o balde do player.
- Inicialmente possui apenas uma posição que não muda conforme o tempo.
- Quando o jogador derrama o óleo no NPC Man, sua posição é mudada para esquerda. Quando a animação do NPC acaba, sua posição volta para a de origem e o balde do player é esvaziado.
- Nota-se que na animação do NPC, aparecem elementos gráficos na tela que representam uma fumaça na sua cabeça, o que indica raiva e óleo pingando.
NPC Woman- Quando o jogador derrama o óleo no NPC Man, sua posição é mudada para esquerda. Quando a animação do NPC acaba, sua posição volta para a de origem e o balde do player é esvaziado.
- Nota-se que na animação do NPC, aparecem elementos gráficos na tela que representam uma fumaça na sua cabeça, o que indica raiva e óleo pingando.
- Inicialmente possui apenas uma posição que não muda conforme o tempo.
- Quando o jogador derrama o óleo na NPC Woman, sua posição é mudada para direita e, posteriormente, para direita acima. Durante a animação do NPC, é alternada a sua posição até a animação acabar e o NPC voltar ao seu ponto inicial.
Sistema
- Conforme a pontuação do jogo aumenta, os óleos são gerados com mais rapidez tornando o jogo mais difícil.
- Se o óleo causar um incêndio é marcada uma falha com símbolo de fogo.
- Se o óleo for derramado em qualquer um dos NPCs ou o jogador pegar um óleo quando estiver com o balde cheio(3 óleos) é marcado uma falha com um símbolo de balde.
- Ao atingir três falhas, sejam pelo fogo ou pelo balde, o jogo acaba.
- É possível escolher dois modos: A e B.
- O modo B aumenta apenas a dificuldade, aumentando mais rápido a velocidade de geração das gotas.
03 - Modelo Matemático
Jogador
- O jogador pode assumir cinco posições ao longo do eixo X. Sendo as posições esquerda e direita que podem receber quatro estados com o mesmo eixo X, respectivamente, representados como -3 ou -2 e 2 ou 3. São elas também responsáveis pela geração do segundo sprite do jogador, representando suas posições com os blocos verdes na tela inferior. Essas posições também alteram os estados do segundo sprite do jogador. As outras posições possuem apenas um estado.
- Se o jogador pressionar a seta direita do teclado, é variado positivamente seu eixo X e trocado suas coordenadas para as coordenadas da posição direita da atual. Caso ele se encontre na posição direita, ele pode alternar entre os estados 2 e 3, pressionando as setas direita e esquerda do teclado. O limite é o estado 3, então caso o jogador pressione novamente a seta direita, não surgirá efeito sobre o player.
- Se o jogador pressionar a seta esquerda do teclado, é variado negativamente seu eixo X e trocado suas coordenadas para as coordenadas da posição esquerda da atual. Caso ele se encontre na posição esquerda, ele pode alternar entre os estados -2 e -3, pressionando as setas esquerda e direita do teclado. O limite é o estado -3, então caso o jogador pressione novamente a seta esquerda, não surgirá efeito sobre o player.
NPC Ajudante
- O ajudante auxiliar apresenta um ponto de origem na posição 3. O mesmo possui quatro posições que variam em função de um intervalo de tempo T. Cada posição apresenta apenas variação do seu eixo X.
- Quando o NPC fica em qualquer uma das duas posições, 0 ou 3, e a posição do player equivale ao eixo X dessa posição, o NPC recebe o óleo que o player precisa despejar no seu tambor.
- O intervalo de tempo T para variar as posições 3 e 0 é maior. Já nas posições 2 e 1 é bem menor sendo utilizadas apenas como um trajeto para variar da posição 3 a 0 e 0 a 3.
- Se a verificação de equivalência de posição no eixo X com o jogador e o NPC Ajudante for verdadeira, a pontuação na tela aumenta dependendo da barra do balde do jogador:
• Uma barra: um ponto
• Duas barras: dois pontos
• Três barras: cinco pontos
Óleo
- Após ser gerado, o óleo continua na mesma posição X da origem, mudando apenas sua posição Y e variando-a positivamente até a posição final.
- Ao chegar na posição final, há uma checagem de colisão com o player, de modo a verificar se o seu eixo X é o mesmo do óleo. Caso o eixo X seja o mesmo, o balde do jogador é enchido com uma barra e a pontuação aumentada em uma unidade. Se o eixo X for diferente, é causado um incêndio e o óleo some.
Fogo
- Toda vez que ocorre o incêndio, o jogo é pausado e logo depois é reiniciado, apagando quaisquer instâncias de gotas de óleo remanescentes na tela e esvaziando o balde do player.
NPC Man
• Uma barra: um ponto
• Duas barras: dois pontos
• Três barras: cinco pontos
Óleo
- O óleo é gerado aleatoriamente em três posições distintas: esquerda, centro e direita.
- Após ser gerado, o óleo continua na mesma posição X da origem, mudando apenas sua posição Y e variando-a positivamente até a posição final.
- Ao chegar na posição final, há uma checagem de colisão com o player, de modo a verificar se o seu eixo X é o mesmo do óleo. Caso o eixo X seja o mesmo, o balde do jogador é enchido com uma barra e a pontuação aumentada em uma unidade. Se o eixo X for diferente, é causado um incêndio e o óleo some.
Fogo
- Os incêndios só aparecem quando a gota de óleo atinge sua posição final e não possui o mesmo eixo X do jogador.
- Possuem três posições possíveis: esquerda, centro e direita. Mudando apenas seu eixo X.
- Toda vez que ocorre o incêndio, o jogo é pausado e logo depois é reiniciado, apagando quaisquer instâncias de gotas de óleo remanescentes na tela e esvaziando o balde do player.
NPC Man
- Inicialmente possui apenas uma posição que não muda conforme o tempo.
- Quando o jogador não possui o mesmo eixo X da posição esquerda do NPC Ajudante, é derramado o óleo e o eixo X do NPC Man é variado negativamente, indo para esquerda.
Quando a animação do NPC acaba, seu eixo X é variado positivamente, voltando para o eixo X de origem.
- Nota-se que na animação do NPC, aparecem elementos gráficos na tela que representam uma fumaça na sua cabeça, o que indica raiva e óleo pingando.
- Quando o jogador não possui o mesmo eixo X da posição esquerda do NPC Ajudante, é derramado o óleo e o eixo X do NPC Man é variado negativamente, indo para esquerda.
Quando a animação do NPC acaba, seu eixo X é variado positivamente, voltando para o eixo X de origem.
- Nota-se que na animação do NPC, aparecem elementos gráficos na tela que representam uma fumaça na sua cabeça, o que indica raiva e óleo pingando.
NPC Woman
- Inicialmente possui apenas uma posição de origem que não muda conforme o tempo.
- Quando o jogador não possui o mesmo eixo X da posição direita do NPC Ajudante, é derramado o óleo e a posição da NPC Woman é mudada conforme um intervalo de tempo. Primeiro ela varia seu eixo X positivamente, indo para esquerda, e posteriormente variando somente seu eixo Y negativamente, indo para a cima. Durante a animação da NPC Woman, seu eixo Y é variado até a animação acabar e o NPC voltar ao seu ponto de origem.
Sistema
- Conforme a pontuação do jogo aumenta, o intervalo de tempo T que os óleos são gerados é reduzido.
- Se a verificação de equivalência de posição no eixo X com o jogador e o óleo for falsa, é gerado uma instância do incêndio e o contador de falhas para incêndios é aumentado em um.
- Se a verificação de equivalência de posição no eixo X com o jogador e o NPC Ajudante for falsa, é variado o eixo X positivamente e o eixo Y negativamente ou apenas o eixo X negativamente, respectivamente, para a NPC Woman e o Npc Man e o contador de falhas para derramamento do balse é aumentado em um.
- Se houver a verificação verdadeira do eixo X do jogador e do óleo e o contador de óleos do balde do jogador for três, é gerado uma instância do incêndio e o contador de falhas para incêndios é aumentado em um.
- Se o contador de falhas atingir um valor igual a três, seja o contador de incêndio ou do balde, o jogo acaba.
- É possível escolher dois modos: A e B.
- O modo B aumenta apenas a dificuldade, diminuindo o intervalo de tempo T para a geração das gotas de óleo.
- Inicialmente possui apenas uma posição de origem que não muda conforme o tempo.
- Quando o jogador não possui o mesmo eixo X da posição direita do NPC Ajudante, é derramado o óleo e a posição da NPC Woman é mudada conforme um intervalo de tempo. Primeiro ela varia seu eixo X positivamente, indo para esquerda, e posteriormente variando somente seu eixo Y negativamente, indo para a cima. Durante a animação da NPC Woman, seu eixo Y é variado até a animação acabar e o NPC voltar ao seu ponto de origem.
Sistema
- Conforme a pontuação do jogo aumenta, o intervalo de tempo T que os óleos são gerados é reduzido.
- Se a verificação de equivalência de posição no eixo X com o jogador e o óleo for falsa, é gerado uma instância do incêndio e o contador de falhas para incêndios é aumentado em um.
- Se a verificação de equivalência de posição no eixo X com o jogador e o NPC Ajudante for falsa, é variado o eixo X positivamente e o eixo Y negativamente ou apenas o eixo X negativamente, respectivamente, para a NPC Woman e o Npc Man e o contador de falhas para derramamento do balse é aumentado em um.
- Se houver a verificação verdadeira do eixo X do jogador e do óleo e o contador de óleos do balde do jogador for três, é gerado uma instância do incêndio e o contador de falhas para incêndios é aumentado em um.
- Se o contador de falhas atingir um valor igual a três, seja o contador de incêndio ou do balde, o jogo acaba.
- É possível escolher dois modos: A e B.
- O modo B aumenta apenas a dificuldade, diminuindo o intervalo de tempo T para a geração das gotas de óleo.
04 - Modelo Computacional
Sprites
O spritesheet utilizado para o porte foi esse:
Sprites
O spritesheet utilizado para o porte foi esse:
Com a utilização do Photoshop, criei vários spritesheets para cada objeto que foi criado no GameMaker 1.4.
Desenvolvimento
Primeiro, como foi dito em sala que era necessário fazer apenas um modo para o porte, fiz a escolha por fazer apenas o modo A.
Fiz uma room utilizando de background o cenário do jogo e fui criando objetos de cada elemento. Coloquei cada objeto na room e manuseando manualmente anotei suas posições no eixo X e Y.
Logo após saber todas as posições dos elementos, programei no escopo de cada objeto suas respectivas máquinas de estados finitas com suas devidas posições para cada estado.
Fiz um script que armazena o input da seta direita e esquerda em uma variável e chamei esse script no step(basicamente o draw do GameMaker) do player, criando uma condição que se a variável key_right, para a seta direita, for verdadeira a variável positionPlayer do player vai incrementar em um, e se a variável key_left, para a seta esquerda, for verdadeira a variável positionPlayer do player vai diminuir em um. Dessa forma, essa variável vai estabelecer a interação das teclas para mudar as posições e, consequentemente, o estado do jogador.
Deus
Logo depois criei um objeto invisível: obj_god, que atua como o Deus do nosso jogo. Esse objeto fica responsável por armazenar a quantidade de falhas, pontuação, gerar aleatoriamente os óleos, coordenar os estados de alguns objetos, verificar as colisões dos objetos e administrar o estado do jogo.
OBS: a colisão do player com o óleo foi feita no escopo do objeto do óleo, pois quando era utilizado a função instance_destroy() do GameMaker 1.4 para destruir a instância do óleo quando colidisse com o player, destruía automaticamente todas as gotas de óleo já que todas tinham o mesmo nome. Colocando essa função no escopo do objeto sem referenciar nenhum objeto, ela destrói apenas aquela instância.
Game Over
As variáveis contadorLoserBalde e contadorLoserFogo do objeto Deus são responsáveis por verificar se o jogador perdeu ou não. Caso alguma delas duas atinja o valor de três, o jogo acaba.
Spawn
Para gerar um spawn de gotas, crier duas variáveis no step do objeto Deus com os seguintes valores padrões:
- timerSpawn: 0
- dificuldade: 0
Estabeleci primeiro uma condição para a cada 15 pontos a dificuldade é diminuída em 5. O valor inicial para a dificuldade é 130, sendo um valor padrão para 0 a 14 pontos. A maior dificuldade é 90 que no caso seria de 120 pontos para cima.
Depois programei para o timerSpawn ir aumentando em um a cada frame e estabeleci um if para quando o valor do timerSpawn for igual ou maior que a dificuldade é gerado um valor aleatório, entre 0 e 2, para a variável xRespawn que cria a instância do objeto óleo com base nessa variável para estabelecer uma das três posições que óleo pode aparecer.
OBS: notei que mesmo utilizando a função irandom do GameMaker 1.4, os valores gerados eram sempre os mesmos na mesma ordem, como uma espécie de premonição do GameMaker. Então utilizei a função randomize para literalmente randomizar essa geração de números inteiros.
NPC Ajudante
O NPC Ajudante tem quatro estados e estabeleci que ele fosse passando pelos quatro estados conforme um tempo. Porém, foi necessário criar uma variável volta para definir para os estados de trajeto(1,2) se eles devem prosseguir para direita ou esquerda. Por tanto, inicialmente o valor da volta é 0 e ao chegar na posição da esquerda ele ganha o valor de 1.
Enquanto a volta tiver valor 0, o sentido da mudança de estados é indo para esquerda, e enquanto a volta tiver valor 1,o sentido da mudança de estados é indo para direita. Ao chegar na posição da esquerda o valor é resetado para 0.
Estado do jogo
O jogo possui oito estados:
- gameState0: Jogo rodando
- gameState1: Colisão do óleo com o NPC Man
- gameState2: Colisão do óleo com o NPC Woman
- gameState3: Colisão do óleo esquerdo na fonte inflamável esquerda
- gameState4: Colisão do óleo do meio na fonte inflamável do meio
- gameState5: Colisão do óleo direito na fonte inflamável direita
- gameState6: Colisão do jogador na posição esquerda com o ajudante.
- gameState7: Colisão do jogador na posição direita com o ajudante.
Ao atingir determinado estado pela sua condição, o estado é executado e ao terminar volta para o estado padrão que é o gameState0.
Fonte
Por fim, utilizei a fonte DS-Digital do site dafont.com para escrever na tela, através do draw, a variável pontostr, uma variável do tipo string, que recebe minha variável pontos, do tipo inteiro, responsável por calcular os pontos do jogo. O tamanho setado para a fonte é de 18.
05 - Link do jogo, recursos e Instruções
Para controlar o jogador:
- seta para direita: move o jogador para direita
- seta para esquerda: move o jogador para esquerda
Para fazer o download da fonte clique aqui
Para fazer o download do projeto do GameMaker 1.4 clique aqui
OBS: nota-se que para abrir o projeto é necessário ter instalado o GameMaker 1.4 na sua máquina.
Para fazer o download do executável clique aqui
Para acessar o drive com todos esses arquivos clique aqui
Desenvolvimento
Primeiro, como foi dito em sala que era necessário fazer apenas um modo para o porte, fiz a escolha por fazer apenas o modo A.
Fiz uma room utilizando de background o cenário do jogo e fui criando objetos de cada elemento. Coloquei cada objeto na room e manuseando manualmente anotei suas posições no eixo X e Y.
Logo após saber todas as posições dos elementos, programei no escopo de cada objeto suas respectivas máquinas de estados finitas com suas devidas posições para cada estado.
Fiz um script que armazena o input da seta direita e esquerda em uma variável e chamei esse script no step(basicamente o draw do GameMaker) do player, criando uma condição que se a variável key_right, para a seta direita, for verdadeira a variável positionPlayer do player vai incrementar em um, e se a variável key_left, para a seta esquerda, for verdadeira a variável positionPlayer do player vai diminuir em um. Dessa forma, essa variável vai estabelecer a interação das teclas para mudar as posições e, consequentemente, o estado do jogador.
Deus
Logo depois criei um objeto invisível: obj_god, que atua como o Deus do nosso jogo. Esse objeto fica responsável por armazenar a quantidade de falhas, pontuação, gerar aleatoriamente os óleos, coordenar os estados de alguns objetos, verificar as colisões dos objetos e administrar o estado do jogo.
OBS: a colisão do player com o óleo foi feita no escopo do objeto do óleo, pois quando era utilizado a função instance_destroy() do GameMaker 1.4 para destruir a instância do óleo quando colidisse com o player, destruía automaticamente todas as gotas de óleo já que todas tinham o mesmo nome. Colocando essa função no escopo do objeto sem referenciar nenhum objeto, ela destrói apenas aquela instância.
Game Over
As variáveis contadorLoserBalde e contadorLoserFogo do objeto Deus são responsáveis por verificar se o jogador perdeu ou não. Caso alguma delas duas atinja o valor de três, o jogo acaba.
Spawn
Para gerar um spawn de gotas, crier duas variáveis no step do objeto Deus com os seguintes valores padrões:
- timerSpawn: 0
- dificuldade: 0
Estabeleci primeiro uma condição para a cada 15 pontos a dificuldade é diminuída em 5. O valor inicial para a dificuldade é 130, sendo um valor padrão para 0 a 14 pontos. A maior dificuldade é 90 que no caso seria de 120 pontos para cima.
Depois programei para o timerSpawn ir aumentando em um a cada frame e estabeleci um if para quando o valor do timerSpawn for igual ou maior que a dificuldade é gerado um valor aleatório, entre 0 e 2, para a variável xRespawn que cria a instância do objeto óleo com base nessa variável para estabelecer uma das três posições que óleo pode aparecer.
OBS: notei que mesmo utilizando a função irandom do GameMaker 1.4, os valores gerados eram sempre os mesmos na mesma ordem, como uma espécie de premonição do GameMaker. Então utilizei a função randomize para literalmente randomizar essa geração de números inteiros.
NPC Ajudante
O NPC Ajudante tem quatro estados e estabeleci que ele fosse passando pelos quatro estados conforme um tempo. Porém, foi necessário criar uma variável volta para definir para os estados de trajeto(1,2) se eles devem prosseguir para direita ou esquerda. Por tanto, inicialmente o valor da volta é 0 e ao chegar na posição da esquerda ele ganha o valor de 1.
Enquanto a volta tiver valor 0, o sentido da mudança de estados é indo para esquerda, e enquanto a volta tiver valor 1,o sentido da mudança de estados é indo para direita. Ao chegar na posição da esquerda o valor é resetado para 0.
Estado do jogo
O jogo possui oito estados:
- gameState0: Jogo rodando
- gameState1: Colisão do óleo com o NPC Man
- gameState2: Colisão do óleo com o NPC Woman
- gameState3: Colisão do óleo esquerdo na fonte inflamável esquerda
- gameState4: Colisão do óleo do meio na fonte inflamável do meio
- gameState5: Colisão do óleo direito na fonte inflamável direita
- gameState6: Colisão do jogador na posição esquerda com o ajudante.
- gameState7: Colisão do jogador na posição direita com o ajudante.
Ao atingir determinado estado pela sua condição, o estado é executado e ao terminar volta para o estado padrão que é o gameState0.
Fonte
Por fim, utilizei a fonte DS-Digital do site dafont.com para escrever na tela, através do draw, a variável pontostr, uma variável do tipo string, que recebe minha variável pontos, do tipo inteiro, responsável por calcular os pontos do jogo. O tamanho setado para a fonte é de 18.
05 - Link do jogo, recursos e Instruções
Para controlar o jogador:
- seta para direita: move o jogador para direita
- seta para esquerda: move o jogador para esquerda
Para fazer o download da fonte clique aqui
Para fazer o download do projeto do GameMaker 1.4 clique aqui
OBS: nota-se que para abrir o projeto é necessário ter instalado o GameMaker 1.4 na sua máquina.
Para fazer o download do executável clique aqui
Para acessar o drive com todos esses arquivos clique aqui
Comentários
Postar um comentário