We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hello everyone! I would really appreciate any help that could be given with this project.
So for my final in a few weeks, I am creating a game in Processing. It is a spin on the snake game where instead of the traditional snake and red square I want to make it where I will have two png images in their place. Specifically, I will be having the Blackhawks logo chasing the Stanley Cup! I began my code with a welcome screen with instructions that I've gotten to work perfectly. My problem is figuring out how to use the reference code (the one I will post below) to adapt it for the two images. Another issue I have is that I'm unsure how to incorporate the game to the welcome screen code. Would I just add it at the end or would I need to use ArrayList?
Thank you again in advance for any help you can give! Below is the reference code that I'm using for the game aspect. (Credit to OpenProcessing - Ian151)
int angle=0;
int snakesize=5;
int time=0;
int[] headx= new int[2500];
int[] heady= new int[2500];
int applex=(round(random(47))+1)*8;
int appley=(round(random(47))+1)*8;
boolean redo=true;
boolean stopgame=false;
void setup()
{
restart();
size(400,400);
textAlign(CENTER);
}
void draw()
{
if (stopgame)
{
//do nothing because of game over (stop playing)
}
else
{
//draw stationary stuff
time+=1;
fill(255,0,0);
stroke(0);
rect(applex,appley,8,8);
fill(0);
stroke(0);
rect(0,0,width,8);
rect(0,height-8,width,8);
rect(0,0,8,height);
rect(width-8,0,8,height);
//my modulating time by 5, we create artificial frames each 5 frames
//(otherwise the game would go WAY too fast!)
if ((time % 5)==0)
{
travel();
display();
checkdead();
}
}
}
//controls:
void keyPressed()
{
if (key == CODED)
{
if (keyCode == UP && angle!=270 && (heady[1]-8)!=heady[2])
{
angle=90;
}
if (keyCode == DOWN && angle!=90 && (heady[1]+8)!=heady[2])
{
angle=270;
}if (keyCode == LEFT && angle!=0 && (headx[1]-8)!=headx[2])
{
angle=180;
}if (keyCode == RIGHT && angle!=180 && (headx[1]+8)!=headx[2])
{
angle=0;
}
if (keyCode == SHIFT)
{
//restart the game by pressing shift
restart();
}
}
}
void travel()
{
for(int i=snakesize;i>0;i--)
{
if (i!=1)
{
//shift all the coordinates back one array
headx[i]=headx[i-1];
heady[i]=heady[i-1];
}
else
{
//move the new spot for the head of the snake, which is
//always at headx[1] and heady[1].
switch(angle)
{
case 0:
headx[1]+=8;
break;
case 90:
heady[1]-=8;
break;
case 180:
headx[1]-=8;
break;
case 270:
heady[1]+=8;
break;
}
}
}
}
void display()
{
//is the head of the snake eating the apple?
if (headx[1]==applex && heady[1]==appley)
{
//grow and spawn the apple somewhere away from the snake
//(currently some of the code below might not be working, but the game still works.)
snakesize+=round(random(3)+1);
redo=true;
while(redo)
{
applex=(round(random(47))+1)*8;
appley=(round(random(47))+1)*8;
for(int i=1;i<snakesize;i++)
{
if (applex==headx[i] && appley==heady[i])
{
redo=true;
}
else
{
redo=false;
i=1000;
}
}
}
}
//draw the new head of the snake...
stroke(sinecolor(1),sinecolor(0),sinecolor(.5));
fill(0);
rect(headx[1],heady[1],8,8);
//...then erase the back end of the snake.
fill(255);
rect(headx[snakesize],heady[snakesize],8,8);
}
void checkdead()
{
for(int i=2;i<=snakesize;i++)
{
//is the head of the snake occupying the same spot as any of the snake chunks?
if (headx[1]==headx[i] && heady[1]==heady[i])
{
fill(255);
rect(125,125,160,100);
fill(0);
text("GAME OVER",200,150);
text("Score: "+str(snakesize-1)+" units long",200,175);
text("To restart, press Shift.",200,200);
stopgame=true;
}
//is the head of the snake hitting the walls?
if (headx[1]>=(width-8) || heady[1]>=(height-8) || headx[1]<=0 || heady[1]<=0)
{
fill(255);
rect(125,125,160,100);
fill(0);
text("GAME OVER",200,150);
text("Score: "+str(snakesize-1)+" units long",200,175);
text("To restart, press Shift.",200,200);
stopgame=true;
}
}
}
void restart()
{
//by pressing shift, all of the main variables reset to their defaults.
background(255);
headx[1]=200;
heady[1]=200;
for(int i=2;i<1000;i++)
{
headx[i]=0;
heady[i]=0;
}
stopgame=false;
applex=(round(random(47))+1)*8;
appley=(round(random(47))+1)*8;
snakesize=5;
time=0;
angle=0;
redo=true;
}
float sinecolor(float percent)
{
float slime=(sin(radians((((time +(255*percent)) % 255)/255)*360)))*255;
return slime;
}
Answers
Hello!
I'd like to comment on the welcome screen.
You can typically use
state
to manage welcome screen versus regular game.The idea is that a a variable
state
tells you whether the program is in state welcome screen or in the gameI show a small sketch to demonstrate this; this sketch has a pause screen instead of a welcome screen but the principle is almost the same.
You start in welcome screen.
state
has the valuestatePause
. Now when a certain time has passed, you setstate
tostateGame
. The functiondraw()
acts accordingly.GAME OVER is a third state you want to have. (This is instead of
if (stopgame)
indraw()
...)Best, Chrisir ;-)
As for the 2nd issue, adapting the code you found (.......) on Openprocessing to your idea:
in line 135 the head of the snake is painted; so load the Blackhawks logo in setup() and display it in line 135.
the apple itself is drawn in line 28, so use
image()
to display Stanley Cup there.Thank you for your help! I'm pretty new to Processing. Below I put the code I have for the welcome screen, if it's alright I would really appreciate your advice on it! Thank you again!
Also, I attempted to play around with the way you explained the adapt the code and I havent been able to get it to work. UPDATE: I see where I went wrong and this comment doesnt matter anymore!
Try to implement the state thing I've shown you
Then there's a line to delete the end of the snake/ old head. Here you need to place a black rect to delete the logo. But as I see it, the code is doing this already