2021年12月20日 星期一

08160741_week11

 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.預計進度:

    關卡平衡、快速落地、重玩切換、階段提高提示、場景變化、空中障礙、場景裝飾




沒有留言:

張貼留言