Mantendo o frame-rate a 60 fps, explicar o problema e mostrar uma solução para a questão do controle do personagem
Primeiramente foi preciso criar novos estados, é preciso ter dois tipos de andando (esquerda e direita) e também dois tipos de parado (para cada um dos lados) e acertar de que toda vez que o personagem vá virar para o outro lado primeiro apareça o parado para local que irá ir e só depois dos sprites de enfim andando. Para isso foi criados IF's, que estavam dentro do draw mas como ficaram vários resolvi organizar dentro da função move() e chamá-la no draw.
Para garantir que o frameRate funcione, precisamos criar outra variável para armazenamento que possa ser inicializada, para evitar problemas do personagem avançar espaço mas não mudar de imagem!
final int PARADO=0;
final int PARADO2=1;
final int ANDANDO=2;
final int ANDANDO2=3;
final int FORATELAESQ=4;
final int FORATELADIR=5;
int valorframerate=0;
int posicaoMario=250;
PImage imgParado, imgAndando, imgParado2, imgAndando2;
int estadoMario=PARADO;
void setup ()
{
size(800,600);
frameRate(60);
imgParado=loadImage("marioparado.png"); //esq
imgAndando=loadImage("marioandando.png"); //esq
imgParado2=loadImage("marioparado2.png"); //dir
imgAndando2=loadImage("marioandando2.png"); //dir
}
void draw ()
{
background(255);
move ();
mostraMario(estadoMario);
}
void move()
{
if((keyPressed==true)&&(keyCode==LEFT)&&(estadoMario==PARADO)){
estadoMario=ANDANDO;
}
if((keyPressed==true)&&(keyCode==RIGHT)&&(estadoMario==PARADO2)){
estadoMario=ANDANDO2;
}
if((keyPressed==true)&&(keyCode==LEFT)&&(estadoMario==PARADO2)){
estadoMario=PARADO;
}
if((keyPressed==true)&&(keyCode==RIGHT)&&(estadoMario==PARADO)){
estadoMario=PARADO2;
}
if ((posicaoMario==0-30)&&(keyPressed==true)&&(keyCode==LEFT)){
estadoMario=FORATELAESQ;
}
if ((posicaoMario==800-30)&&(keyPressed==true)&&(keyCode==RIGHT))
{
estadoMario=FORATELADIR;
}
}
void mostraMario(int estado)
{
switch(estado) {
case PARADO:
image(imgParado,posicaoMario,150);
break;
case PARADO2:
image(imgParado2,posicaoMario,150);
break;
case ANDANDO:
incrementa();
if (valorframerate%30<15) {
image(imgAndando,posicaoMario,155);
}
else
{
image(imgParado,posicaoMario,150);
posicaoMario-=5;
estadoMario=PARADO;
}
break;
case ANDANDO2:
incrementa();
if (valorframerate%30<15)
{
image(imgAndando2,posicaoMario,155);
}
else
{
image(imgParado2,posicaoMario,150);
posicaoMario+=5;
estadoMario=PARADO2;
}
break;
case FORATELAESQ:
incrementa();
if(valorframerate%30<15)
image(imgAndando,posicaoMario,155);
else
image(imgParado,posicaoMario,150);
estadoMario=PARADO;
break;
case FORATELADIR:
incrementa();
if(valorframerate%30<15)
image(imgAndando2,posicaoMario,155);
else
image(imgParado2,posicaoMario,150);
estadoMario=PARADO2;
break;
}
}
void incrementa() {
if(valorframerate < 60) {
valorframerate++;
} else {
valorframerate = 0;
}
}
void keyReleased() {
valorframerate= 0;
}
Primeiramente foi preciso criar novos estados, é preciso ter dois tipos de andando (esquerda e direita) e também dois tipos de parado (para cada um dos lados) e acertar de que toda vez que o personagem vá virar para o outro lado primeiro apareça o parado para local que irá ir e só depois dos sprites de enfim andando. Para isso foi criados IF's, que estavam dentro do draw mas como ficaram vários resolvi organizar dentro da função move() e chamá-la no draw.
Para garantir que o frameRate funcione, precisamos criar outra variável para armazenamento que possa ser inicializada, para evitar problemas do personagem avançar espaço mas não mudar de imagem!
final int PARADO=0;
final int PARADO2=1;
final int ANDANDO=2;
final int ANDANDO2=3;
final int FORATELAESQ=4;
final int FORATELADIR=5;
int valorframerate=0;
int posicaoMario=250;
PImage imgParado, imgAndando, imgParado2, imgAndando2;
int estadoMario=PARADO;
void setup ()
{
size(800,600);
frameRate(60);
imgParado=loadImage("marioparado.png"); //esq
imgAndando=loadImage("marioandando.png"); //esq
imgParado2=loadImage("marioparado2.png"); //dir
imgAndando2=loadImage("marioandando2.png"); //dir
}
void draw ()
{
background(255);
move ();
mostraMario(estadoMario);
}
void move()
{
if((keyPressed==true)&&(keyCode==LEFT)&&(estadoMario==PARADO)){
estadoMario=ANDANDO;
}
if((keyPressed==true)&&(keyCode==RIGHT)&&(estadoMario==PARADO2)){
estadoMario=ANDANDO2;
}
if((keyPressed==true)&&(keyCode==LEFT)&&(estadoMario==PARADO2)){
estadoMario=PARADO;
}
if((keyPressed==true)&&(keyCode==RIGHT)&&(estadoMario==PARADO)){
estadoMario=PARADO2;
}
if ((posicaoMario==0-30)&&(keyPressed==true)&&(keyCode==LEFT)){
estadoMario=FORATELAESQ;
}
if ((posicaoMario==800-30)&&(keyPressed==true)&&(keyCode==RIGHT))
{
estadoMario=FORATELADIR;
}
}
void mostraMario(int estado)
{
switch(estado) {
case PARADO:
image(imgParado,posicaoMario,150);
break;
case PARADO2:
image(imgParado2,posicaoMario,150);
break;
case ANDANDO:
incrementa();
if (valorframerate%30<15) {
image(imgAndando,posicaoMario,155);
}
else
{
image(imgParado,posicaoMario,150);
posicaoMario-=5;
estadoMario=PARADO;
}
break;
case ANDANDO2:
incrementa();
if (valorframerate%30<15)
{
image(imgAndando2,posicaoMario,155);
}
else
{
image(imgParado2,posicaoMario,150);
posicaoMario+=5;
estadoMario=PARADO2;
}
break;
case FORATELAESQ:
incrementa();
if(valorframerate%30<15)
image(imgAndando,posicaoMario,155);
else
image(imgParado,posicaoMario,150);
estadoMario=PARADO;
break;
case FORATELADIR:
incrementa();
if(valorframerate%30<15)
image(imgAndando2,posicaoMario,155);
else
image(imgParado2,posicaoMario,150);
estadoMario=PARADO2;
break;
}
}
void incrementa() {
if(valorframerate < 60) {
valorframerate++;
} else {
valorframerate = 0;
}
}
void keyReleased() {
valorframerate= 0;
}
