2014年10月27日 星期一

midterm 期中作品

int mapSizex=480;       //map x >>>
int mapSizey=480;       //map y ↓↓↓

int playerx=mapSizex/2, playery=mapSizey/2;  //player place at mid

int i=0;   //use for

int maxWalkSpeed=2;         //move speed

float WalkX=0;             //x++ speed
float WalkXtmp=0;          //x++ speed tmp
float walkSpeedx=0;         //x start speed

float WalkY=0;             //y++speed
float WalkYtmp=0;          //y++speed temp
float walkSpeedy=0;         //y start speed

int MaxRock=100;           //max rock how many
float LowRockSpeed=0.1;   //rock move low speed
float MaxRockSpeed=1;     //rock move fast speed

float[] RockV= new float[MaxRock+1]; // x and y speed
float[] RockX= new float[MaxRock+1]; //x
float[] RockXv= new float[MaxRock+1]; //x speed
float[] RockY= new float[MaxRock+1]; //y
float[] RockYv= new float[MaxRock+1];//y speed
float[] RockBS= new float[MaxRock+1]; // big small

boolean gamestart=false; //pan duan start or not
boolean gameover=false;  //pan duan die or not

int score=0;             //score

PImage img, imgBG,imgr;

void setup()
{
  size(mapSizex, mapSizey+6);          //+5 or can't see score
  img=loadImage("spaceship.png");    
  imgBG=loadImage("starworld.jpg");   //picture
  imgr=loadImage("1.png");
  imgBG.resize(mapSizex, mapSizey+6);  //+5 or can't see score
  imageMode(CENTER);                
  playerx=floor(mapSizex/2);         //player place reset
  playery=floor(mapSizey/2);         //same

  for (i=1;i<=MaxRock;i++)
  {
    switch(floor(random(1,5))) // random come out ball
    {
    case 1: //<< x place -10 y random place
      RockX[i]=-10;                
      RockY[i]=random(-10, mapSizey+10);
      break;
    case 2: //↑↑ y place -10 x random place
      RockX[i]=random(-10, mapSizex+10);
      RockY[i]=-10;
      break;
    case 3: //>> x place +10 y random place
      RockX[i]=mapSizex+10;
      RockY[i]=random(-10, mapSizey+10);
      break;
    case 4://↓↓ y place +10 x random place
      RockX[i]=random(-10, mapSizex+10);
      RockY[i]=mapSizey+10;
      break;
    }
    RockV[i]=random(LowRockSpeed,MaxRockSpeed); //rock speed
    RockXv[i]=RockV[i]*((playerx-RockX[i])/sqrt(sq(RockX[i]-playerx)+sq(RockY[i]-playery))); //x function
    RockYv[i]=RockV[i]*((playery-RockY[i])/sqrt(sq(RockX[i]-playerx)+sq(RockY[i]-playery))); //y function
    RockBS[i]=5;//ball big small
  }
}

void draw()
{
  background(imgBG);
  image (img, playerx, playery, 15,15); // mid picture
  if (gamestart)
  {
    update();
    setConnon();
    scoreShow();
  }
  else
  {
    textSize(40);                        //big small
    fill(255,255,255);                   //colour
    text("PRESS HERE TO START", 30,100); //title
  }
}




void keyPressed()  //keyboard up down left right
{
  switch(keyCode)
  {
    case LEFT:          //<<
      WalkX=-0.2;  //speed
      WalkXtmp=0;  //ship start 0 everytime then -0.2
      break;
   
    case RIGHT:          //>>
      WalkX=0.2;
      WalkXtmp=0;
      break;
   
    case UP:             //^^
      WalkY=-0.2;
      WalkYtmp=0;
      break;
   
    case DOWN:          //↓↓
      WalkY=0.2;
      WalkYtmp=0;
      break;
   }
}

void keyReleased() //put out
{
  switch(keyCode)
  {
    case LEFT:                    
      WalkXtmp=WalkX;      //orginal speed switch
      WalkX=0;             //restar 0
      break;
   
    case RIGHT:
      WalkXtmp=WalkX;
      WalkX=0;
      break;
   
    case UP:
      WalkYtmp=WalkY;
      WalkY=0;
      break;
   
    case DOWN:
      WalkYtmp=WalkY;
      WalkY=0;
      break;
   
    case ' ':                 //space bar
      if (gameover==true)
      {
         score=0;
         gameover=false;
         frameCount=0;
         WalkYtmp=0;
         setup();
        //redraw();        
       }
       break;
    }
}

void mouseClicked()
{
  if (gameover==true)
  {
    score=0;
    gameover=false;
    frameCount=0;
    setup();
    //redraw();
  }
  if (gamestart==false)
  {
    gamestart=true;
  }
}    

void update()
{
  if (playery>=10 && playery<=mapSizey-10) //renew y place
  {
    playery+=walkSpeedy;
    if (WalkY!=0)
    {
      if (abs(walkSpeedy)<maxWalkSpeed)
      {
        walkSpeedy+=WalkY;
      }
      else
      {
        if (walkSpeedy>0)
        {
          walkSpeedy=maxWalkSpeed;
        }
        else
        {
          walkSpeedy=-maxWalkSpeed;
        }
      }
    }
    else //player up down
    {
      if (walkSpeedy>0.2)
      {
        walkSpeedy-=WalkYtmp;
      }
      else
      {
        walkSpeedy=0;
        WalkYtmp=0;
      }
    }
  }
  else
  {
    if (playery<10)
    {
      walkSpeedy=0;
      playery=10;
      WalkY=0;
    }
    if (playery>mapSizey-10)
    {
      walkSpeedy=0;
      playery=mapSizey-10;
      WalkY=0;
    }
  }
  if (playerx>=10&&playerx<=mapSizex-10)
  {
    playerx+=walkSpeedx;
    if (WalkX!=0)
    {
      if (abs(walkSpeedx)<maxWalkSpeed)
      {
        walkSpeedx+=WalkX;
      }
      else
      {
        if (walkSpeedx>0)
        {
          walkSpeedx=maxWalkSpeed;
        }
        else
        {
          walkSpeedx=-maxWalkSpeed;
        }
      }
    }
    else
    {
      if (abs(walkSpeedx)>0.2)
      {
        walkSpeedx-=WalkXtmp;
      }
      else {
        walkSpeedx=0;
        WalkXtmp=0;
      }
    }
  }
  else
  {
    if (playerx<10)          //dun give aloplant go outside
    {
      walkSpeedx=0;
      playerx=10;
      WalkX=0;
    }
    if (playerx>mapSizex-10)
    {
      walkSpeedx=0;
      playerx=mapSizex-10;
      WalkX=0;
    }
  }
  noStroke();
  fill(255,255,0,1);
  image(img,playerx, playery, 15, 15);   //mid xiao dian
}

void setConnon()
{
  for (i=1;i<=MaxRock;i++) // use for to keep like rock
  {
    if (abs(RockX[i]-playerx)<RockBS[i]&&abs(RockY[i]-playery)<RockBS[i]) {
      gameover=true;
    }
    else
    {
      if ((RockX[i]>mapSizex+10)||(RockX[i]<-10)||(RockY[i]<-10)||(RockY[i]>mapSizey+10)||gameover)
      {
        switch(floor(random(1,5))) //if rock fly out then renew one more rock then score+1
        {
        case 1: //<<
          RockX[i]=-10;
          RockY[i]=random(-10, mapSizey+10);
          break;
        case 2: //^^
          RockX[i]=random(-10, mapSizex+10);
          RockY[i]=-10;
          break;
        case 3: //>>
          RockX[i]=mapSizex+10;
          RockY[i]=random(-10, mapSizey+10);
          break;
        case 4: //↓↓
          RockX[i]=random(-10, mapSizex+10);
          RockY[i]=mapSizey+10;
          break;
        }
        RockV[i]=random(LowRockSpeed,MaxRockSpeed);
        RockXv[i]=RockV[i]*((playerx-RockX[i])/sqrt(sq(RockX[i]-playerx)+sq(RockY[i]-playery))); //function
        RockYv[i]=RockV[i]*((playery-RockY[i])/sqrt(sq(RockX[i]-playerx)+sq(RockY[i]-playery))); //function

        if (!gameover)
        {
          score+=1;
       
          if(score>=10)
          {
            MaxRockSpeed+=0.01;
          }
        }
      }
      else // if rock at screen inside then continue fly
      {
        RockX[i]+=RockXv[i];
        RockY[i]+=RockYv[i];
        image(imgr ,RockX[i], RockY[i], RockBS[i], RockBS[i]);
      }
    }
  }
}

void scoreShow() //show score
{
  if (gameover)
  {
    textSize(15);
    fill(255, 255, 255);
    text("Game Over\nYour Score: "+score+"\nPress space bar to continue", floor(mapSizex/4), floor(mapSizey/2));
    MaxRockSpeed=1;
  }
  else
  {
    textSize(10);  
    fill(255, 255, 255);
    text("Your Score: "+score, 10, mapSizey+5); //left botton score
  }
}


沒有留言:

張貼留言