顯示具有 04160241_卓佾柔 標籤的文章。 顯示所有文章
顯示具有 04160241_卓佾柔 標籤的文章。 顯示所有文章

2018年1月8日 星期一

week17-期末作品展示

期末作品展示:

皮卡丘打排球



作品說明:
遊戲為兩隻皮卡丘在打排球,分別為P1、P2,玩家可透過遊戲裝置(如上圖)操控皮卡丘,按鈕分別為向左(黃色按鈕)、跳(紅色按鈕)、向右(黃色按鈕)。最後先得15分者獲勝。

裝置內部:


展示影片:
https://www.youtube.com/watch?v=6JNwfsUDVpk&feature=youtu.be

2017年12月11日 星期一

week13-卓佾柔的上課筆記

一、安裝驅動

二、旋轉編碼器

接法如下:
程式碼:
 #define SERIAL_BAUDRATE 115200
 #define CLK_PIN 2 // 定義連接腳位
#define DT_PIN 3
 #define SW_PIN 4
 #define interruptA 0 // UNO腳位2是interrupt 0,其他板子請見官方網頁
volatile long count = 0;
 unsigned long t = 0;
 void setup() {
   Serial.begin(SERIAL_BAUDRATE);
   // 當狀態下降時,代表旋轉編碼器被轉動了
  attachInterrupt(interruptA, rotaryEncoderChanged, FALLING);
   pinMode(CLK_PIN, INPUT_PULLUP); // 輸入模式並啟用內建上拉電阻
  pinMode(DT_PIN, INPUT_PULLUP);
   pinMode(SW_PIN, INPUT_PULLUP);
 }
 void loop() {
   if(digitalRead(SW_PIN) == LOW){ // 按下開關,歸零
     count = 0; 
      Serial.println("count reset to 0");
      delay(300);
   }
 }
 void rotaryEncoderChanged(){ // when CLK_PIN is FALLING
   unsigned long temp = millis();
   if(temp - t < 200) // 去彈跳
    return;
   t = temp;
  
   // DT_PIN的狀態代表正轉或逆轉
  count += digitalRead(DT_PIN) == HIGH ? 1 : -1;
   Serial.println(count);
 }
結果:





import processing.serial.*;
Serial myPort;
void setup()
{
  size(500, 500);
  myPort = new Serial(this,"COM7", 115200);
}
int x=0;
int lf=10;//new line,line feed
void draw()
{
  background(0);
  if (myPort.available() >0) {
    String now =myPort.readStringUntil(lf);
    x=int(split(now,'\r')[0]);
    println(now);
  }
  ellipse(width/2+x*20,height/2,100,100);
}




2017年12月4日 星期一

week12-卓佾柔的上課筆記

一、安裝驅動

二、搖桿

// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(115200);
}

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
  delay(50);
}


switch:1表示有按下搖桿 0表示沒按
X-axis:X軸
Y-axis:Y軸

在processing打開範例"SimpleRead"

  myPort = new Serial(this, portName, 115200);

import processing.serial.*;
Serial myPort;

void setup() 
{
  size(400, 400);
   myPort = new Serial(this,"COM5", 115200);
}

void draw()
{
  if ( myPort.available() > 0) {  
    //int now = myPort.read();
    String now =myPort.readString();
    println(now);
  }
}

按下搖桿背景會變綠色,沒按的時候背景是紅色

import processing.serial.*;
Serial myPort;

void setup() 
{
  size(400, 400);
   myPort = new Serial(this,"COM5", 115200);
}

void draw()
{
  if ( myPort.available() > 0) {  
    //int now = myPort.read();
    //String now =myPort.readString();
    int pin2=myPort.read();
    println(pin2);
    if(pin2==1)background(255,0,0);
    else background(0,255,0);
  }
}

processing:
import processing.serial.*;
Serial myPort;

void setup()
{
  size(400, 400);
   myPort = new Serial(this,"COM5", 115200);
}

void draw()
{
  if ( myPort.available() > 0) {
    int pin2=myPort.read();
    int x=myPort.read();
    int y=myPort.read();
    println(pin2);
    if(pin2==1)background(255,0,0);
    else background(0,255,0);
    ellipse(x,y,20,20);
  }
}

Arduino:
// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(115200);
}

void loop() {
  Serial.write(digitalRead(2));
  Serial.write(analogRead(A0)/4);
  Serial.write(analogRead(A1)/4);
  delay(50);
}


2017年11月27日 星期一

week11-卓佾柔的上課筆記


一、安裝驅動

1.到控制台點選裝置管理員,更新驅動程式軟體

2.選擇手動更新,並點選路徑

3.安裝完成
4.選擇開發粄、序列

二、跑範例程式



電路板操作如下
成功後按下按鈕燈會亮
開啟序列埠監控視窗,如果沒按按鈕會顯示1,有按會顯示0








更改程式碼,讓監控視窗顯示出是否有按下按鈕
  if(sensorVal==0)   Serial.println(" I Press it");
  else   Serial.println("I didn't Press it");


三、按下按鈕改視窗顏色

processing:

import processing.serial.*;
Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port
void setup(){
  size(600,400);
  myPort = new Serial(this, "COM8", 9600);
}
void draw(){
  if ( myPort.available() > 0) {
    val = myPort.read();
    println(val);
    if(val=='0') background(255,0,0);
    else background(0,255,0);
  }
}





四、旋鈕

旋鈕接法:接地、A0、5V

 int sensorPin=A0;
 int ledPin=13;
 int sensorValue=0;
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  sensorValue=analogRead(sensorPin);
  Serial.write(sensorValue/4);
  delay(33);
}




import processing.serial.*;
Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port
void setup(){
  size(600,400);
  myPort = new Serial(this, "COM8", 9600);
}
int x=0;
void draw(){
  background(255);
  if ( myPort.available() > 0) {
    val = myPort.read();
    println(val);
    x=val;
  }
  ellipse(x*3,200,100,100);
}


2017年11月20日 星期一

Week 10 期中作品展示

#第10週
-------------------------------------------------------------------------------------------------------------------------

04160241 卓佾柔
04160683 邱繼儀

作品名稱:
皮卡丘打排球
作品說明:
有兩隻皮卡丘分別為P1、P2在打排球,並利用上下左右鍵、WASD鍵來移動及跳躍。
球碰到牆、地及中間的柱子會反彈,而當球掉到地上對手沒接到則得分。
上方會顯示雙方的分數,先獲得15分者獲勝。
獲勝畫面會顯示誰是贏家。


2017年11月6日 星期一

week08-卓佾柔的上課筆記

期末作品實作


目前進度:兩隻皮卡丘能跳動

PImage imgBall,imgP1,imgP2;
void setup(){
   size(800,600);
   imgBall=loadImage("Ball.png");
   imgP1=loadImage("P1.png");
   imgP2=loadImage("P2.png");
   imageMode(CENTER);
}
float ballX=120,ballY=300,ballVX=0,ballVY=0;
float p1X=100,p1Y=430,p1VX=0,p1VY=0;
float p2X=700,p2Y=430,p2VX=0,p2VY=0;
Boolean bGG=false;
void draw(){
   background(#BFEAFF); ///sky
   noStroke();fill(#D1C0A6);rect(0,500,800,100); ///floor
   fill(#A6ACAF);rect(400,320,10,240); ///cylider
   image(imgP1,p1X,p1Y,200,200);
   image(imgP2,p2X,p2Y,200,200);
   image(imgBall,ballX,ballY,80,80);
  
   if(bGG)return;
   ballX += ballVX; ballY += ballVY;
   ballVY += 0.98;
   p1X+=p1VX; p1Y += p1VY; p1VY+=0.98;
   p2X+=p2VX; p2Y += p2VY; p2VY+=0.98;
   if(ballY>=500-40)bGG=true; ///if ball touch the floor : GameOver
   if(p1Y>=500-50) {p1VY=0; p1Y=500-50;}
   if(p2Y>=500-50) {p2VY=0; p2Y=500-50;}
   if(dist(p1X,p1Y,ballX,ballY)<=80)ballVY=-ballVY;
   if(dist(p2X,p2Y,ballX,ballY)<=80)ballVY=-ballVY;
}
void keyPressed(){
  if(key=='a') p1VX=-3;
  if(key=='s') p1VY=0;
  if(key=='d') p1VX=3;
  if(key=='w') p1VY=-20;
 
  if(keyCode==LEFT) p2VX=-3;
  if(keyCode==DOWN) p2VY=0;
  if(keyCode==RIGHT) p2VX=3;
  if(keyCode==UP) p2VY=-20;
}
void keyReleased(){
  if(key=='a') p1VX=0;
  if(key=='s') p1VY=0;
  if(key=='d') p1VX=0;
  if(key=='w') p1VY=0;
 
  if(keyCode==LEFT) p2VX=0;
  if(keyCode==DOWN) p2VY=0;
  if(keyCode==RIGHT) p2VX=0;
  if(keyCode==UP) p2VY=0;
}




目前進度:有分數計算、球碰到邊界會反彈、皮卡丘不會走超過邊界
PImage imgBall,imgP1,imgP2;
void setup(){
   size(800,600);
   textSize(50);
   imgBall=loadImage("Ball.png");
   imgP1=loadImage("P1.png");
   imgP2=loadImage("P2.png");
   imageMode(CENTER);
}
float ballX=120,ballY=150,ballVX=0,ballVY=0;
float p1X=100,p1Y=430,p1VX=0,p1VY=0;
float p2X=700,p2Y=430,p2VX=0,p2VY=0;
Boolean bGG=false;
int p1S=0,p2S=0; ///Score
void draw(){
   background(#BFEAFF); ///sky
   noStroke();fill(#D1C0A6);rect(0,500,800,100); ///floor
   fill(#A6ACAF);rect(400,320,10,240); ///cylider
   image(imgP1,p1X,p1Y,200,200);
   image(imgP2,p2X,p2Y,200,200);
   image(imgBall,ballX,ballY,80,80);
   fill(#484646);
   text(p1S,100,70);
   text(p2S,700,70);
   if(ballX<=360 && ballY>=500-40){
       bGG=true; ///if ball touch the floor : GameOver
       if(bGG)
       {
         p2S++;
         ballX=680;ballY=150;
         p1X=100;p1Y=450;
         p2X=700;p2Y=450;
         ballVX=0;ballVY=0;
         p1VX=0;p1VY=0;
         p2VX=0;p2VY=0;
         bGG=false;
       }
   }
   if(ballX>=450 && ballY>=500-40){
      bGG=true; ///if ball touch the floor : GameOver
      if(bGG)
       {
         p1S++;
         ballX=120;ballY=150;
         p1X=100;p1Y=450;
         p2X=700;p2Y=450;
         ballVX=0;ballVY=0;
         p1VX=0;p1VY=0;
         p2VX=0;p2VY=0;
         bGG=false;
       }
   }
  
   if(bGG)return;
   ballX += ballVX; ballY += ballVY;
   ballVY += 0.98;
  
   p1X+=p1VX;
   if(p1X<80) p1X=80;
   if(p1X>300) p1X=300;
   p1Y += p1VY; p1VY+=0.98;
  
   p2X+=p2VX;
   if(p2X<500) p2X=500;
   if(p2X>720) p2X=720;
   p2Y += p2VY; p2VY+=0.98;
   if(ballX<50){ballX=50;ballVX=-ballVX;}
   if(ballX>800-50){ballX=800-50;ballVX=-ballVX;}
   if(ballY<50){ballY=50;ballVY=-ballVY;}
   if(ballY>800-50){ballY=800-50;ballVY=-ballVY;}
 
   if(p1Y>=500-50) {p1VY=0; p1Y=500-50;}
   if(p2Y>=500-50) {p2VY=0; p2Y=500-50;}
   if(dist(p1X,p1Y,ballX,ballY)<=80)ballVY=-ballVY;
   if(dist(p2X,p2Y,ballX,ballY)<=80)ballVY=-ballVY;
   if(dist(p1X,p1Y,ballX,ballY)<=80) ballVX=(80-ballVY)/5.0;
   if(dist(p2X,p2Y,ballX,ballY)<=80) ballVX=-(80-ballVY)/5.0;
}
void keyPressed(){
  if(key=='a') p1VX=-3;
  if(key=='s') p1VY=0;
  if(key=='d') p1VX=3;
  if(key=='w') p1VY=-20;
  if(keyCode==LEFT) p2VX=-3;
  if(keyCode==DOWN) p2VY=0;
  if(keyCode==RIGHT) p2VX=3;
  if(keyCode==UP) p2VY=-20;
}
void keyReleased(){
  if(key=='a') p1VX=0;
  if(key=='s') p1VY=0;
  if(key=='d') p1VX=0;
  if(key=='w') p1VY=0;
 
  if(keyCode==LEFT) p2VX=0;
  if(keyCode==DOWN) p2VY=0;
  if(keyCode==RIGHT) p2VX=0;
  if(keyCode==UP) p2VY=0;
}





2017年10月30日 星期一

week07-卓佾柔的上課筆記

一、皮卡丘打排球


void setup(){
  size(800,600);
}
float ballX=200,ballY=200,ballVX=0,ballVY=3;
float pika1X=200,pika1Y=420,pika1VX=0,pika1VY=0;
float pika2X=600,pika2Y=420,pika2VX=0,pika2VY=0;
boolean bGameOver=false;
void draw(){
  background(#2085D6);
  noStroke(); fill(#FAC105); rect(0,500,800,100);
  fill(255,0,0); ellipse(ballX,ballY,60,60);
  rect(400,340,10,260);
 
  fill(#F5FA05); ellipse(pika1X,pika1Y,60,100);  //皮卡丘起始位置
  fill(#F5FA05); ellipse(pika2X,pika2Y,60,100);
 
  if(bGameOver) return;   //如果球掉落遊戲結束(皮卡丘跟球不能再移動)
 
  ballX += ballVX; ballY += ballVY;
  ballVY += 0.98;  //重力加速度
  pika1X+=pika1VX; pika1Y += pika1VY; pika1VY+=0.98;
  if(ballY>=500-30) bGameOver=true; //球落地,GAMEOVER
  if(pika1Y>=500-50) {pika1VY=0; pika1Y=500-50;}
  if(dist(pika1X,pika1Y,ballX,ballY)<=80) ballVY=-ballVY;
}
void keyPressed(){
  if(key=='a') pika1VX=-3;
  if(key=='s') pika1VY=0;
  if(key=='d') pika1VX=3;
  if(key=='w') pika1VY=-20;
}
void keyReleased(){  //放開鍵盤的速度為0
  if(key=='a') pika1VX=0;
  if(key=='s') pika1VY=0;
  if(key=='d') pika1VX=0;
  if(key=='w') pika1VY=0;
}

二、雪球大戰







2017年10月23日 星期一

week06-卓佾柔的上課筆記

一、爆爆王

1.畫出背景
void setup(){
  size(850,500);
}
void draw(){
  background(#92AD28);
  noStroke();
  for(int x=0;x<17;x++){
    for(int y=0;y<10;y++){
      if((x-y)%2 ==0) fill(#7E9819);
      else fill(#92AD28);
      rect(x*50,y*50,50,50);
    }
  }
}





2.讓玩家可以動(鍵盤)
void setup(){
  size(850,500);
}
int userJ=9,userI=5;
float userX,userY;

void draw(){
  background(#92AD28);
  noStroke();
  for(int x=0;x<17;x++){
    for(int y=0;y<10;y++){
      if((x-y)%2 ==0) fill(#7E9819);
      else fill(#92AD28);
      rect(x*50,y*50,50,50);
    }
  }
  fill(255,0,0); ellipse(userJ*50+25,userI*50+25,50,50);
}
void keyPressed(){        //鍵盤控制  if(keyCode==LEFT) userJ--;
  if(keyCode==RIGHT) userJ++;
  if(keyCode==UP) userI--;
  if(keyCode==DOWN) userI++;

}


3.放水球

void setup(){
  size(850,500);
}
int userJ=9,userI=5;
float userX,userY;
int waterN=0;
int []waterJ=new int[100];
int []waterI=new int[100];

void draw(){
  background(#92AD28);
  noStroke();
  for(int x=0;x<17;x++){
    for(int y=0;y<10;y++){
      if((x-y)%2 ==0) fill(#7E9819);
      else fill(#92AD28);
      rect(x*50,y*50,50,50);
    }
  }
  fill(255,0,0); ellipse(userJ*50+25,userI*50+25,50,50);
  for(int i=0;i<waterN;i++){
     fill(#93E1F7); ellipse(waterJ[i]*50+25,waterI[i]*50+25,30,30);

  }
}
void keyPressed(){
  if(keyCode==LEFT) userJ--;
  if(keyCode==RIGHT) userJ++;
  if(keyCode==UP) userI--;
  if(keyCode==DOWN) userI++;
  if(key==' '){ waterI[waterN]=userI; waterJ[waterN]=userJ; waterN++;}
}

二、鱷魚咬咬

1.畫出鱷魚嘴巴

int bad=0;
void setup(){
  size(500,500);
  bad= int(random(18));
  println(bad);
}
void draw(){
  background(255);
  fill(0,155,0); ellipse(250,250,300,300);
  for(int i=0;i<9;i++){
    fill(255); rect(110+i*30,200,30,30);
    if(110+i*30<mouseX && mouseX<110+i*30+30 &&
        200<mouseY && mouseY <200+30){
          fill(0); rect(110+i*30,200,30,30);
        }
        if(bad==i){fill(255,0,0); rect(110+i*30,200,30,30);}
  }
  for(int i=0;i<9;i++){
    fill(255); rect(110+i*30,300,30,30);
    if(110+i*30 <mouseX && mouseX <10+i*30+30 &&
        300 < mouseY && mouseY <300+30){
          fill(0); rect(110+i*30,300,30,30);
        }
        if(bad==i+9){fill(255,0,0); rect(110+i*30,300,30,30);}
  }
}
2.被咬到後掛掉


int bad=0;
int [] all=new int[18]; //{0,-1,0,0,0,0,0,0,1,0,0,...}
void setup(){
  size(500,500);
  bad= int(random(18)); all[bad]=1;
  println(bad);
}
boolean bGameOver=false;
void draw(){
  if(bGameOver){
    background(255,0,0);
    return;

  }
  background(255);
  fill(0,155,0); ellipse(250,250,300,300);
  for(int i=0;i<9;i++){
    if(all[i]==-1) continue;
    fill(255); rect(110+i*30,200,30,30);
    if(110+i*30<mouseX && mouseX<110+i*30+30 &&
        200<mouseY && mouseY <200+30){
          fill(0); rect(110+i*30,200,30,30);
          if(mousePressed && all[i]!=1) all[i]=-1;
          if(mousePressed && all[i]==1) bGameOver=true;

        }
        //if(bad==i){fill(255,0,0); rect(110+i*30,200,30,30);}
  }
  for(int i=0;i<9;i++){
    if(all[i+9]==-1) continue;
    fill(255); rect(110+i*30,300,30,30);
    if(110+i*30 <mouseX && mouseX <10+i*30+30 &&
        300 < mouseY && mouseY <300+30){
          fill(0); rect(110+i*30,300,30,30);
          if(mousePressed && all[i+9]!=1) all[i+9]=-1;
          if(mousePressed && all[i+9]==1) bGameOver=true;

        }
        //if(bad==i+9){fill(255,0,0); rect(110+i*30,300,30,30);}
  }
}

    三、貪食蛇

1.製作出貪食蛇,並且讓他的頭能跟著滑鼠方向轉動
void setup(){
  size(600,400);
}
float userX=300,userY=200;
void draw(){
  background(#44B220);
  stroke(#356C23); noFill();
  for(int i=0;i<16;i++){
    for(int j=0;j<24;j++){
      rect(j*25,i*25,25,25);
    }
  }
  stroke(0); fill(#FC9E38);
  float angle=atan2(mouseY-userY,mouseX-userX);
  triangle( userX+40*cos(angle), userY+40*sin(angle),
            userX+15*cos(angle+PI/2),userY+15*sin(angle+PI/2),
            userX+15*cos(angle-PI/2),userY+15*sin(angle-PI/2));
  ellipse(userX,userY,30,30);
}
2.讓貪食蛇能動(鍵盤)

void setup(){
  size(600,400);
}
float userX=300,userY=200;
float mapX=0,mapY=0;
void draw(){
  background(#44B220);
  stroke(#356C23); noFill();
  for(int i=0;i<16;i++){
    for(int j=0;j<24;j++){
      rect(mapX+j*25,mapY+i*25,25,25);
    }
  }
  stroke(0); fill(#FC9E38);
  float angle=atan2(mouseY-userY,mouseX-userX);
  triangle( userX+40*cos(angle), userY+40*sin(angle),
            userX+15*cos(angle+PI/2),userY+15*sin(angle+PI/2),
            userX+15*cos(angle-PI/2),userY+15*sin(angle-PI/2));
  ellipse(userX,userY,30,30);
  mapX-=dirX; //userX+=dirX;
  mapY-=dirY; //userY+=dirY;
}
int dirX=0, dirY=0;
void keyPressed(){
  if(key=='a' || key=='A') dirX=-1;
  if(key=='s' || key=='S') dirY=1;
  if(key=='d' || key=='D') dirX=1;
  if(key=='w' || key=='W') dirY=-1;
}
void keyReleased(){
  if(key=='a' || key=='A') dirX=0;
  if(key=='s' || key=='S') dirY=0;
  if(key=='d' || key=='D') dirX=0;
  if(key=='w' || key=='W') dirY=0;
}


四、小精靈


1.畫出小精靈(嘴巴大小可用滑鼠拉動調整)

void setup(){
  size(600,400);
}
float open=1;
void draw(){
  background(0);
  fill(255,255,0);
  arc(300,200,100,100,0+open,PI*2-open);
}
void mouseDragged(){
  open=(mouseX/600.0);
}

2.小精靈嘴巴會自動開合
void setup(){
  size(600,400);
}
float open=1;
int now=0;
void draw(){
  background(0);
  fill(255,255,0);
  arc(300,200,100,100,0+open,PI*2-open);
  now++;
  open=abs((now%60)/60.0-0.5);

}

2017年10月16日 星期一

week05-卓佾柔的上課筆記

一、會跟著滑鼠動的眼睛

void setup(){
  size(400,400);
}
void draw(){
   background(128);
   strokeWeight(20);
   ellipse(100,200,180,360); //眼球
   ellipse(300,200,180,360); //眼球
  
   ellipse(100,200,10,10);
   ellipse(300,200,10,10);
   line(mouseX,mouseY,100,200); //線會跟著滑鼠動
   line(mouseX,mouseY,300,200);
}


void setup(){
  size(800,800);
}
void draw(){
   background(128);
   strokeWeight(20);
   ellipse(100,200,180,360);
   ellipse(300,200,180,360);

   float angle1=atan2((mouseY-200)/2,mouseX-300); //三角函數
   float newX1=300+100*cos(angle1)/2;
   float newY1=200+200*sin(angle1)/2;
   ellipse(newX1,newY1,10,10);
   float angle2=atan2((mouseY-200)/2,mouseX-100);
   float newX2=100+100*cos(angle2)/2;
   float newY2=200+200*sin(angle2)/2;
   ellipse(newX2,newY2,10,10);
}

二、射泡泡



void setup(){
  size(400,800);
}
void draw(){
  background(0,128,0);
  fill(#FA9703);ellipse(200,600,100,100);
  line(mouseX,mouseY,200,600);
  float angle=atan2(mouseY-600,mouseX-200);  //子彈跟著滑鼠動
  fill(#F9FA03); ellipse(200+50*cos(angle),600+50*sin(angle),30,30);
}



void setup(){
  size(400,800);
}
float ballX=200,ballY=600;
float ballVX=0,ballVY=0;
float angle=0;
void draw(){
  background(0,128,0);
  fill(#FA9703);ellipse(200,600,100,100);
  line(mouseX,mouseY,200,600);
  //float angle=atan2(mouseY-600,mouseX-200);
  fill(#F9FA03); ellipse(ballX,ballY,30,30);
  angle=atan2(mouseY-600,mouseX-200);
 
  ballX+=ballVX;
  ballY+=ballVY;
}
void mouseMoved(){
  ballX=200+50*cos(angle);
  ballY=600+50*sin(angle);
}
void mousePressed(){
  ballVX=cos(angle);
  ballVY=sin(angle);
}

void setup(){
  size(400,800);
}
float [] ballX=new float[10];  //改成陣列讓球可以發射很多顆
float [] ballY=new float[10];
float [] ballVX=new float[10];
float [] ballVY=new float[10];
float [] angle=new float[10];
int now=0; //now which ball is it

void draw(){
  background(0,128,0);
  fill(#FA9703);ellipse(200,600,100,100);
  for(int i=0;i<10;i++){
    fill(#F9FA03); ellipse(ballX[i],ballY[i],30,30);
    ballX[i]+=ballVX[i];
    ballY[i]+=ballVY[i];
  }

  angle[now]=atan2(mouseY-600,mouseX-200);
}
void mouseMoved(){
  ballX[now]=200+50*cos(angle[now]);
  ballY[now]=600+50*sin(angle[now]);

  ballVX[now]=0;
  ballVY[now]=0;

}
void mousePressed(){
  ballVX[now]=cos(angle[now]);
  ballVY[now]=sin(angle[now]);
  now++;

  if(now>=10) now=0; //準備陣列讓球可以發射很多顆不會當機
}






















2017年10月2日 星期一

week04-卓佾柔的上課筆記

一、射擊遊戲

1.陣列宣告(畫圖)

float [][]pigx=new float[5][4];
float [][]pigy=new float[5][4];
boolean [][]pigAlive=new boolean[5][4];
void setup(){
   size(800,600);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       pigx[i][j]=700-i*100; pigy[i][j]=100+j*100; pigAlive[i][j]=true;
     }
   }
}
void draw(){
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
        fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100); //上色
     }
   }
   fill(#DE0719); ellipse(400,300,100,100); //上色
}


2.碰到怪物後怪物消失

寫好牛頓第一運動定律和牛頓第二運動定律。然後讓pig 碰到 bird時, 給它死。沒死的才畫出來
float birdX=100,birdY=400;
float birdVX=0,birdVY=0;
float birdAX=0,birdAY=0;
float [][]pigx=new float[5][4];
float [][]pigy=new float[5][4];
boolean [][]pigAlive=new boolean[5][4];
void setup(){
   size(800,600);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       pigx[i][j]=700-i*100; pigy[i][j]=100+j*100; pigAlive[i][j]=true;
     }
   }
}
void draw(){
  background(255); //背景顏色
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       if( dist(birdX,birdY,pigx[i][j],pigy[i][j])<100) pigAlive[i][j]=false;
        //fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);
        if(pigAlive[i][j]) {fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);}
     }
   }
   //fill(#DE0719); ellipse(400,300,100,100);
   fill(#DE0719); ellipse(birdX,birdY,100,100);//draw the angry bird
   
   birdX+=birdVX;birdY+=birdVY;//update the angry bird
   birdVX+=birdAX;birdVY+=birdAY;
}
void mouseDragged(){
  birdX=mouseX;birdY=mouseY;
}

3.發射子彈

做出 (1) 直線運動, (2) 拋物線

float birdX=100,birdY=400;
float birdVX=0,birdVY=0;
float birdAX=0,birdAY=0;
float [][]pigx=new float[5][4];
float [][]pigy=new float[5][4];
boolean [][]pigAlive=new boolean[5][4];
void setup(){
   size(800,600);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       pigx[i][j]=700-i*100; pigy[i][j]=100+j*100; pigAlive[i][j]=true;
     }
   }
}
void draw(){
  background(255);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       if( dist(birdX,birdY,pigx[i][j],pigy[i][j])<100) pigAlive[i][j]=false;
        //fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);
        if(pigAlive[i][j]) {fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);}
     }
   }
   //fill(#DE0719); ellipse(400,300,100,100);
   fill(#DE0719); ellipse(birdX,birdY,100,100);//draw the angry bird
 
   birdX+=birdVX;birdY+=birdVY;//update the angry bird
   birdVX+=birdAX;birdVY+=birdAY;
}
void mouseDragged(){
  birdX=mouseX;birdY=mouseY;
  birdVX=0;birdVY=0;
}
void mouseReleased(){
  //birdVX=(100-mouseX)/20.0; birdVY=(400-mouseY)/20.0; //線性運動
  birdVX=(100-mouseX)/5.0; birdVY=(400-mouseY)/5.0; birdAY=0.98; //拋物線
}

4.忘了清 birdAY 加速度,可能會造成 自由落體, 所以 mouseDragged時要清空birdAY


float birdX=100,birdY=400;
float birdVX=0,birdVY=0;
float birdAX=0,birdAY=0;
float [][]pigx=new float[5][4];
float [][]pigy=new float[5][4];
boolean [][]pigAlive=new boolean[5][4];
void setup(){
   size(800,600);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       pigx[i][j]=700-i*100; pigy[i][j]=100+j*100; pigAlive[i][j]=true;
     }
   }
}
void draw(){
  background(255);
   for(int i=0;i<5;i++){
     for(int j=0;j<4;j++){
       if( dist(birdX,birdY,pigx[i][j],pigy[i][j])<100) pigAlive[i][j]=false;
        //fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);
        if(pigAlive[i][j]) {fill(#07DE0F); ellipse(pigx[i][j],pigy[i][j],100,100);}
     }
   }
   //fill(#DE0719); ellipse(400,300,100,100);
   fill(#DE0719); ellipse(birdX,birdY,100,100);//draw the angry bird
 
   birdX+=birdVX;birdY+=birdVY;//update the angry bird
   birdVX+=birdAX;birdVY+=birdAY;
}
void mouseDragged(){
  birdX=mouseX;birdY=mouseY;
  birdVX=0;birdVY=0;
  birdAY=0;
}
void mouseReleased(){
  //birdVX=(100-mouseX)/20.0; birdVY=(400-mouseY)/20.0; //shi-hsien-yun-dong
  birdVX=(100-mouseX)/5.0; birdVY=(400-mouseY)/5.0; birdAY=0.98; //pao-wu-hsien
}

二、放音樂

sound文件庫

import processing.sound.*;
SoundFile sound;
void setup(){
  size(800,600);
  sound=new SoundFile(this,"fish.mp3");
  sound.play();
  sound.loop();
}
minim文件庫

import ddf.minim.*;

Minim minim;
AudioPlayer player;

void setup(){
  size(800,600);
  minim=new Minim(this);
  player=minim.loadFile("fish.mp3",2048);
  player.play();
  //player.loop();
}
void draw(){

}