2015年1月18日 星期日

~期末作業~

Pressing:

import processing.serial.*;
Serial myPort;



int mapSizex=480;       //map x >>>
int mapSizey=480;       //map y ↓↓↓
//int posX=mapSizex/2, posY=mapSizey/2;  //player place at mid

int i=0;   //for

int maxWalkSpeed=2;         //move speed
float walkAccelx=0;         //x++ speed
float walkAccelxtmp=0;      //x++ speed tmp
float walkSpeedx=0;         //x start speed
float walkAccely=0;         //y++speed
float walkAccelytmp=0;      //y++speed temp
float walkSpeedy=0;         //y start speed

int maxConnon=5;           //max rock how many
float minConnonSpeed=0.1;   //rock move low speed
float maxConnonSpeed=1;     //rock move fast speed

float[] connonv= new float[maxConnon+1]; //
float[] connonx= new float[maxConnon+1]; //
float[] connonxv= new float[maxConnon+1]; //
float[] connony= new float[maxConnon+1]; //
float[] connonyv= new float[maxConnon+1]; //
float[] connonw= new float[maxConnon+1]; //

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

PImage img, imgBG;
int posX=0;
int posY=0;

void setup()
{
  myPort=new Serial(this,"COM3",9600);
  size(255,200);
 
  size(mapSizex, mapSizey+6);          //+5 or can't see score
  img=loadImage("spaceship.png");        //
  imgBG=loadImage("starworld.jpg");    //picture
  imgBG.resize(mapSizex, mapSizey+6);  //+5 or can't see score
  imageMode(CENTER);                  
  posX=floor(mapSizex/2);         //player place reset
  posY=floor(mapSizey/2);         //same



  for (i=1;i<=maxConnon;i++)
  {
    switch(floor(random(1,5))) // random come out ball
    {  
    case 1: //<< x place -10 y random place
      connonx[i]=-10;                
      connony[i]=random(-10, mapSizey+10);
      break;
    case 2: //↑↑ y place -10 x random place
      connonx[i]=random(-10, mapSizex+10);
      connony[i]=-10;
      break;
    case 3: //>> x place +10 y random place
      connonx[i]=mapSizex+10;
      connony[i]=random(-10, mapSizey+10);
      break;
    case 4://↓↓ y place +10 x random place+10
      connonx[i]=random(-10, mapSizex+10);
      connony[i]=mapSizey+10;
      break;
    }
    connonv[i]=random(minConnonSpeed,maxConnonSpeed); //rock speed
    connonxv[i]=connonv[i]*((posX-connonx[i])/sqrt(sq(connonx[i]-posX)+sq(connony[i]-posY))); //x
    connonyv[i]=connonv[i]*((posY-connony[i])/sqrt(sq(connonx[i]-posX)+sq(connony[i]-posY))); // y
    connonw[i]=5;//ball big small
  }
}

void draw() {

  background(imgBG);
  image (img, posX,posY, 30,30);

  if (gamestart) {
    //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:          //<<
      walkAccelx=-0.2;  //speed  
      walkAccelxtmp=0;  //ship start 0 everytime then -0.15
      break;
     
    case RIGHT:          //>>
      walkAccelx=0.2;  
      walkAccelxtmp=0;
      break;
     
    case UP:             //^^
      walkAccely=-0.2;
      walkAccelytmp=0;
      break;
     
    case DOWN:          //↓↓
      walkAccely=0.2;
      walkAccelytmp=0;
      break;
   }
}


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

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

void update()
{
  if (posY>=10 && posY<=mapSizey-10)
  {
    posY+=walkSpeedy;
    if (walkAccely!=0)
    {
      if (abs(walkSpeedy)<maxWalkSpeed)
      {
        walkSpeedy+=walkAccely;
      }
      else
      {
        if (walkSpeedy>0)
        {
          walkSpeedy=maxWalkSpeed;
        }
        else
        {
          walkSpeedy=-maxWalkSpeed;
        }
      }
    }
    else
    {
      if (abs(walkSpeedy)>0.2)
      {
        walkSpeedy-=walkAccelytmp;
      }
      else
      {
        walkSpeedy=0;
        walkAccelytmp=0;
      }
    }
  }
  else
  {
    if (posY<10)
    {
      walkSpeedy=0;
      posY=10;
      walkAccely=0;
    }
    if (posY>mapSizey-10)
    {
      walkSpeedy=0;
      posY=mapSizey-10;
      walkAccely=0;
    }
  }
  if (posX>=10&&posX<=mapSizex-10)
  {
    posX+=walkSpeedx;
    if (walkAccelx!=0)
    {
      if (abs(walkSpeedx)<maxWalkSpeed)
      {
        walkSpeedx+=walkAccelx;
      }
      else
      {
        if (walkSpeedx>0)
        {
          walkSpeedx=maxWalkSpeed;
        }
        else
        {
          walkSpeedx=-maxWalkSpeed;
        }
      }
    }
    else
    {
      if (abs(walkSpeedx)>0.2)
      {
        walkSpeedx-=walkAccelxtmp;
      }
      else {
        walkSpeedx=0;
        walkAccelxtmp=0;
      }
    }
  }
  else
  {
    if (posX<10)          //dun give aloplant go outside
    {
      walkSpeedx=0;
      posX=10;
      walkAccelx=0;
    }
    if (posX>mapSizex-10)
    {
      walkSpeedx=0;
      posX=mapSizex-10;
      walkAccelx=0;
    }
  }
  int a=0;
 
  if(myPort.available()>0) a =myPort.read();
  if( (a&0x01)==0x01)posY+=10;///{println("up");}else println("no up");
  if( (a&0x02)==0x02)posY-=10;
  if( (a&0x04)==0x04)posX+=10;
  if( (a&0x08)==0x08)posX-=10;

       
 
  noStroke();
  fill(0,255,0,1);
  ellipse(posX,posY, 10, 10);   //mid xiao dian
}



void setConnon() {

  for (i=1;i<=maxConnon;i++) {

    if (abs(connonx[i]-posX)<connonw[i]&&abs(connony[i]-posY)<connonw[i]) {
      gameover=true;
    }
    else {
      if ((connonx[i]>mapSizex+10)||(connonx[i]<-10)||(connony[i]<-10)||(connony[i]>mapSizey+10)||gameover) {

        switch(floor(random(1, 4.99))) {
        case 1: //左
          connonx[i]=-10;
          connony[i]=random(-10, mapSizey+10);
          break;
        case 2: //上
          connonx[i]=random(-10, mapSizex+10);
          connony[i]=-10;
          break;
        case 3: //右
          connonx[i]=mapSizex+10;
          connony[i]=random(-10, mapSizey+10);
          break;
        case 4: //下
          connonx[i]=random(-10, mapSizex+10);
          connony[i]=mapSizey+10;
          break;
        }
        connonv[i]=random(0.1, 5);
        connonxv[i]=connonv[i]*((posX-connonx[i])/sqrt(sq(connonx[i]-posX)+sq(connony[i]-posY)));
        connonyv[i]=connonv[i]*((posY-connony[i])/sqrt(sq(connonx[i]-posX)+sq(connony[i]-posY)));


        if (!gameover) {
          score+=1;
        }

        if (frameCount>=1000&&frameCount<2000) {
          connonw[i]=floor(random(3, 15));
        }
        if (frameCount>=2000&&frameCount<4000) {
          connonw[i]=floor(random(3, 30));
        }
        if (frameCount>=4000) {
          connonw[i]=floor(random(3, 80));
        }
      }


      else {
        connonx[i]+=connonxv[i];
        connony[i]+=connonyv[i];
        noStroke();
        fill(250, 20, 0);
        ellipse(connonx[i], connony[i], connonw[i], connonw[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));
  }
  else
  {
    textSize(10);    
    fill(240, 220, 0);
    text("Your Score: "+score, 10, mapSizey+5); //left botton score
  }
}

arduino:

void setup(){
  Serial.begin(9600);
  pinMode(12, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(0, INPUT_PULLUP);
  pinMode(8,INPUT_PULLUP);

}
void loop(){
  int a=0;
  if(digitalRead(12)==LOW)a|=0x01;//Serial.println("up  ");
  if(digitalRead(5)==LOW) a|=0x02;//Serial.println("down");
  if(digitalRead(3)==LOW) a|=0x04;//Serial.println("left");
  if(digitalRead(0)==LOW) a|=0x08;//Serial.println("right");

  Serial.write(a);

  delay(20);
}

沒有留言:

張貼留言