1.場景階段、遊戲結束畫面、debug介面、碰撞處理、不同仙人掌(共3個)
PImage[] Dino_idle = new PImage[2];
PImage[] Saboten = new PImage[3];
PImage Game_Over;
int DinoAnim_Timer = 0,PlayerFrame = 2,currentFrame = 0,bad_cooldown = 0,score = 0,distance = 0,stage_lv = 0;
int failednumber = 0;
float randomX,randomY,random;
float jump_force,gravity;
float playerX,playerY;
float c_playerX,c_playerY;
int[] saboten_if = new int[10];
int[] saboten_pos = new int[10];
float[] m_CollisionX = new float[10];
float[] m_CollisionY = new float[10];
float[] s_CollisionX = new float[10];
float[] s_CollisionY = new float[10];
boolean isDebug = false;
boolean jumping = false,Onground = true;
boolean isgameover = false;
void setup()
{
size(1200,700);
frameRate(24);
//基本屬性
jump_force = 40;
gravity = 0;
//恐龍的預設動畫圖片
Dino_idle[0] = loadImage("dino_idle_0.png");
Dino_idle[1] = loadImage("dino_idle_1.png");
//仙人掌
Saboten[0] = loadImage("bad_0.png"); //65x100
Saboten[1] = loadImage("bad_1.png"); //75x110
Saboten[2] = loadImage("bad_2.png"); //35x120
//遊戲結束
Game_Over = loadImage("game_over_0.png");
//玩家初始位置
playerX = 100;
playerY = 580;
}
void draw()
{
if(isgameover == false)
{
background(255);
display();
ObjectMove();
//跳躍處理
if(jumping == true)
{
playerY -= jump_force;
if(jump_force > 0) jump_force -= 3;
Onground = false;
if(playerY <= 300) jumping = false;
}
if(jumping == false && Onground == false)
{
playerY += gravity;
gravity += 8;
if(playerY >= 580)
{
playerY = 580;
Onground = true;
jump_force = 40;
gravity = 0;
}
}
}
else image(Game_Over,600,350);
//分數增加
distance++;
score = distance/3;
//根據分數進行階段提升
if(score > 100) stage_lv = 1;
if(score > 500) stage_lv = 2;
//判定產生仙人掌
random = random(0,50/(stage_lv + 1));
random = int(random);
if(random == 5 && bad_cooldown == 0)
{
for(int i = 0;i < 10;i++)
{
if(saboten_if[i] == 0)
{
random = random(0,3);
random = int(random);
if(random == 0)
saboten_if[i] = 1;
if(random == 1)
saboten_if[i] = 2;
if(random == 2)
saboten_if[i] = 3;
saboten_pos[i] = 1300;
if(stage_lv == 0) bad_cooldown = 30;
if(stage_lv == 1) bad_cooldown = 18;
if(stage_lv == 2) bad_cooldown = 12;
break;
}
}
}
else failednumber++;
}
void display()
{
//debug
if(isDebug == true) debug();
//分數顯示
textSize(80);
fill(0);
String m_score = nf(score, 4);
text(m_score,950,100);
//恐龍動畫
DinoAnim_Timer++;
imageMode(CENTER);
if(DinoAnim_Timer % PlayerFrame == 0)
{
currentFrame++;
if(currentFrame == PlayerFrame) currentFrame = 0;
DinoAnim_Timer = 0;
}
image(Dino_idle[currentFrame],playerX,playerY);
//地面
stroke(0);
line(0,600,1200,600);
//仙人掌
for(int i = 0;i < 10;i++)
{
if(saboten_if[i] != 0)
{
if(saboten_if[i] == 1) image(Saboten[0],saboten_pos[i],580);
if(saboten_if[i] == 2) image(Saboten[1],saboten_pos[i],580);
if(saboten_if[i] == 3) image(Saboten[2],saboten_pos[i],580);
}
}
}
void ObjectMove()
{
//根據階段有不同的移動速度
//仙人掌移動
for(int i =0;i < 10;i++)
{
if(saboten_pos[i] < -50) saboten_if[i] = 0;
saboten_pos[i] -= 20 * ((stage_lv/1.8) + 1);
}
if(bad_cooldown > 0) bad_cooldown--;
CollisionDet();
}
void keyPressed()
{
if(key == 32)
{
if(Onground)
{
jumping = true;
Onground = false;
}
if(isgameover == true)
{
restart();
}
}
if(key == 'a')
{
isDebug = true;
}
/*if(key == 's')
{
stop();
}*/
}
void CollisionDet()
{
c_playerX = playerX;
c_playerY = playerY;
for(int i = 0;i < 10;i++)
{
if(saboten_if[i] == 1)
{
s_CollisionX[i] = saboten_pos[i] - 32.5 + 5;
s_CollisionY[i] = 580 - 50;
m_CollisionX[i] = saboten_pos[i] + 32.5 - 5;
m_CollisionY[i] = 580 + 50;
}
if(saboten_if[i] == 2)
{
s_CollisionX[i] = saboten_pos[i] - 37.5 + 8;
s_CollisionY[i] = 580 - 55;
m_CollisionX[i] = saboten_pos[i] + 37.5 - 8;
m_CollisionY[i] = 580 + 55;
}
if(saboten_if[i] == 3)
{
s_CollisionX[i] = saboten_pos[i] - 17.5 + 3;
s_CollisionY[i] = 580 - 60;
m_CollisionX[i] = saboten_pos[i] + 17.5 - 3;
m_CollisionY[i] = 580 + 60;
}
if(saboten_if[i] != 0 && c_playerX + 30 >= s_CollisionX[i] && c_playerX + 30 <= m_CollisionX[i] && c_playerY + 40 >= s_CollisionY[i] && c_playerY + 40 <= m_CollisionY[i])
{
//撞到了
isgameover = true;
textSize(40);
text(c_playerX,0,100);
text(c_playerY,0,200);
text(s_CollisionX[i],200,100);
text(m_CollisionX[i],200,200);
text(s_CollisionY[i],200,300);
text(m_CollisionY[i],200,400);
}
else if(saboten_if[i] != 0 && c_playerX - 30 >= s_CollisionX[i] && c_playerX - 30 <= m_CollisionX[i] && c_playerY + 40 >= s_CollisionY[i] && c_playerY + 40 <= m_CollisionY[i])
{
//撞到了
isgameover = true;
textSize(40);
text(c_playerX,0,100);
text(c_playerY,0,200);
text(s_CollisionX[i],200,100);
text(m_CollisionX[i],200,200);
text(s_CollisionY[i],200,300);
text(m_CollisionY[i],200,400);
}
}
}
void restart()
{
for(int i = 0;i < 10;i++)
{
saboten_if[i] = 0;
saboten_pos[i] = 0;
}
distance = 0;
stage_lv = 0;
isgameover = false;
}
void debug()
{
textSize(40);
text(c_playerX,0,100);
text(c_playerY,0,200);
text(failednumber,400,100);
}
2.預計進度:
關卡平衡、快速落地、重玩切換、階段提高提示、場景變化、空中障礙、場景裝飾
沒有留言:
張貼留言