顯示具有 04160790_陸德宇 標籤的文章。 顯示所有文章
顯示具有 04160790_陸德宇 標籤的文章。 顯示所有文章

2018年1月23日 星期二

18/01/23 德宇的筆記Week19

目標一:期末作品展示


組員:
04160790 陸德宇
04160303 謝紹勳


原遊戲參考:
http://anan.game.tw/ettc/6263.html


遊戲玩法:
本遊戲中間的紅球為主角,可以發射雪球攻擊敵人,敵人則會衝撞主角扣血。
在血歸零前則到100分,則獲勝。若歸零未達到分數則失敗


本遊戲操控方法如下
上鍵: 向前
下鍵: 向後
右鍵: 順時針
左鍵 逆時針
空白鍵: 發射雪球


實體成品:
概念啟發至7、8年級生小時候的紅白機,也意味著遊戲即便簡單,但也能很有趣的發想。




























展示影片:

2018年1月8日 星期一

18/01/08 德宇的筆記Week17

目標一:期末作品製作




















Ardunio端程式碼:

const int SW_pin = 2; 
const int X_pin = 0; 
const int Y_pin = 1; 

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);
}

2017年12月25日 星期一

17/12/25 德宇的筆記Week15

目標一:期末作品製作


已決定與期中作品相同,製作雪球大戰

遊戲方式:
由類比搖桿作為作為上下左右鍵的移動,
而按下鍵則為發射鍵。

透過此方式來操作期中的Processing遊戲


2017年12月18日 星期一

17/12/18 德宇的筆記Week14

目標一:期末作品製作


討論期末作品的呈現方式:
1.雪球大戰
2.電流急急棒實體版

討論後決議以雪球大戰為期末作品

2017年11月20日 星期一

17/11/20 德宇的筆記Week10

目標一:期末作品展示


組員:
04160790 陸德宇
04160303 謝紹勳

原遊戲參考:
http://anan.game.tw/ettc/6263.html

遊戲玩法:
本遊戲中間的紅球為主角,可以發射雪球攻擊敵人,敵人則會衝撞主角扣血。
在血歸零前則到100分,則獲勝。若歸零未達到分數則失敗

本遊戲操控方法如下
上鍵: 向前
下鍵: 向後
右鍵: 順時針
左鍵 逆時針
空白鍵: 發射雪球

遊戲解說&試玩:

2017年11月6日 星期一

17/11/06 德宇的筆記Week08

目標一:製作雪球大戰


製作進度預覽:

















程式碼:

PImage imgBG;
import processing.sound.*;

SoundFile sound;
SoundFile sound1;
SoundFile sound2;
PVector[]enemy=new PVector[5];
PVector[]enemyV=new PVector[5];
int now =0;
int stage=0;
void reborn(int i)
{
  enemy[i]=new PVector(random(500), random(500));
  float angle=random(2*PI);
  enemyV[i]=new PVector(3*cos(angle), 3*sin(angle));
}    
void setup()
{
  imgBG=loadImage("1.jpg");
  fill(0, 0, 0);
  size(500, 500);
  for (int i=0; i<5; i++)
  {
    reborn(i);
  }
  sound = new SoundFile(this,"Battle Theme.mp3");
  sound.play();
}
int kidsize=30;
float kidX=250, kidY=250, dir=0;
float [] ballX=new float[5];
float [] ballY=new float[5];
float [] ballVX=new float[5];
float [] ballVY=new float[5];
boolean ballFly=false;
float [] kid= new float[5];
float [] ball= new float[5];
int score=0;
int heart=5;
void draw()
{
  if (stage==0) 
  {
    fill(255, 0, 0);
    textSize(60);
    text("Click to Start", 20, 100);
  } 
  else if (stage==1) 
  {  
    background(imgBG);
    textSize(30);
    fill(0);
    text("Score:" + score + "   Heart:" + heart, 30, 30);
    for (int i=0; i<5; i++)
    {
      fill(255, 220, 40);
      enemy[i].x +=enemyV[i].x;
      enemyV[i].y+=enemyV[i].y;
      ellipse(enemy[i].x, enemy[i].y, 30, 30);
      if (enemy[i].x<0||enemy[i].x>500
        ||enemy[i].y<30||enemy[i].y>500) reborn(i);
      fill(255, 40, 40);
      ellipse(kidX, kidY, 50, 50);
      beginShape(POLYGON);
      vertex(kidX+kidsize*cos(radians(dir+80)), kidY+kidsize*sin(radians(dir+80)));
      vertex(kidX+kidsize*cos(radians(dir+100)), kidY+kidsize*sin(radians(dir+100)));
      vertex(kidX+kidsize*cos(radians(dir-100)), kidY+kidsize*sin(radians(dir-100)));
      vertex(kidX+kidsize*cos(radians(dir-80)), kidY+kidsize*sin(radians(dir-80)));
      endShape();
      if (ballFly)
      {
        fill(255);
        ellipse(ballX[now], ballY[now], 10, 10);
        ballX[now]+=ballVX[now];
        ballY[now]+=ballVY[now];
        now++;
        if (now>=5)now=0;
      } 
      if(dist (enemy[i].x,enemy[i].y,ballX[now],ballY[now])<40) 
       {
       score+=10;
       reborn(i);
       if(score>=100)stage=3;
       }
       if(dist(enemy[i].x,enemy[i].x,kidX,kidY)<1)
       {
       heart--;
       if(heart<=0)stage=2;
       reborn(i);
       }
    }
  } else if (stage==2) {
    background(0, 0, 0);
    fill(255);
    textSize(80);
    text("You lose =(", 30, 250);
    sound2 = new SoundFile(this, "Game Over.mp3");
  } else if (stage==3) {

    background(255, 255, 255);
    fill(0);
    textSize(80);
    text("You win!!", 80, 250);
    sound1 = new SoundFile(this, "Victory.mp3");
  }
}
void keyPressed()
{
  if (keyCode==RIGHT) dir+=20;
  if (keyCode==LEFT) dir-=20;
  if (keyCode==UP)
  { 
    kidX += 10*cos(radians(dir));
    kidY += 10*sin(radians(dir));
  }
  if (keyCode==DOWN)
  {
    kidX -= 10*cos(radians(dir));
    kidY -= 10*sin(radians(dir));
  }
  if (key==' ')
  {
    ballX[now]=kidX; 
    ballY[now]=kidY; 
    ballVX[now]=10*cos(radians(dir)); 
    ballVY[now]=10*sin(radians(dir)); 
    ballFly=true;
  }

void mousePressed() {
  if (stage==0) {
    stage=1;
  }
  if (stage==2||stage==3) {
    stage=0;
    heart=5;
    score=0;
  }
}

2017年10月30日 星期一

17/10/30 德宇的筆記Week07

目標一:製作雪球大戰


原遊戲參考:
http://anan.game.tw/ettc/6263.html

遊戲玩法:
本遊戲中間的紅球為主角,可以發射雪球攻擊敵人,敵人則會衝撞主角扣血。
在血歸零前則到100分,則獲勝。若歸零未達到分數則失敗

本遊戲操控方法如下:
上鍵: 向前
下鍵: 向後
右鍵: 順時針
左鍵 逆時針
空白鍵: 發射雪球

程式碼:
PImage imgBG;
PVector[]enemy=new PVector[5];
PVector[]enemyV=new PVector[5];
int stage=1;
void reborn(int i)
{
  enemy[i]=new PVector(random(500), random(500));
  float angle=random(2*PI);
  enemyV[i]=new PVector(3*cos(angle), 3*sin(angle));
}    
void setup()
{
  imgBG=loadImage("1.jpg");
  fill(0, 0, 0);
  size(500, 500);
  for (int i=0; i<5; i++)
  {
    reborn(i);
  }
}
int kidsize=30;
float kidX=250, kidY=250, dir=0;
float [] ballX=new float[5];
float [] ballY=new float[5];
float [] ballVX=new float[5];
float [] ballVY=new float[5];
boolean ballFly=false;
float [] kid= new float[5];
float [] ball= new float[5];
void draw()
{
  else if (stage==1) 
  {  
    background(imgBG);
    textSize(30);
    fill(0);
    for (int i=0; i<5; i++)
    {
      fill(255, 220, 40);
      enemy[i].x +=enemyV[i].x;
      enemyV[i].y+=enemyV[i].y;
      ellipse(enemy[i].x, enemy[i].y, 30, 30);
      if (enemy[i].x<0||enemy[i].x>500
        ||enemy[i].y<30||enemy[i].y>500) reborn(i);
      fill(255, 40, 40);
      ellipse(kidX, kidY, 50, 50);
      beginShape(POLYGON);
      vertex(kidX+kidsize*cos(radians(dir+80)), kidY+kidsize*sin(radians(dir+80)));
      vertex(kidX+kidsize*cos(radians(dir+100)), kidY+kidsize*sin(radians(dir+100)));
      vertex(kidX+kidsize*cos(radians(dir-100)), kidY+kidsize*sin(radians(dir-100)));
      vertex(kidX+kidsize*cos(radians(dir-80)), kidY+kidsize*sin(radians(dir-80)));
      endShape();
      if (ballFly)
      {
        fill(255);
        ellipse(ballX[now], ballY[now], 10, 10);
        ballX[now]+=ballVX[now];
        ballY[now]+=ballVY[now];
      } 
      if(dist (enemy[i].x,enemy[i].y,ballX[now],ballY[now])<40) 
       {
       score+=10;
       reborn(i);
       if(score>=100)stage=3;
       }
       if(dist(enemy[i].x,enemy[i].x,kidX,kidY)<1)
       {
       heart--;
       if(heart<=0)stage=2;
       reborn(i);
       }
    }
  } 
}
void keyPressed()
{
  if (keyCode==RIGHT) dir+=20;
  if (keyCode==LEFT) dir-=20;
  if (keyCode==UP)
  { 
    kidX += 10*cos(radians(dir));
    kidY += 10*sin(radians(dir));
  }
  if (keyCode==DOWN)
  {
    kidX -= 10*cos(radians(dir));
    kidY -= 10*sin(radians(dir));
  }
  if (key==' ')
  {
    ballX[now]=kidX; 
    ballY[now]=kidY; 
    ballVX[now]=10*cos(radians(dir)); 
    ballVY[now]=10*sin(radians(dir)); 
    ballFly=true;
  }

2017年10月23日 星期一

17/10/23 德宇的筆記Week06

目標一:做出爆爆王



1.製作遊戲場地
程式碼:

void setup()
{
  size(850,500); 
}
void draw()
{
  background(#92AD28);  
  noStroke();   //背景無線條
  for(int x=0;x<17;x++)  //X軸座標
  {   
    for(int y=0;y<10;y++)  //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(#93E1E7);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++;}  //按空白鍵發射水球
}

2017年10月16日 星期一

17/10/16 德宇的筆記Week05

目標一:做出眼睛動動



1.讓眼睛跟著滑鼠移動(有輔助線)

程式碼:
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);  //畫一條線連接左眼
}




2.讓眼睛跟著滑鼠移動,用tan寫法

程式碼:
void setup()
{
  size(400,400);
}
void draw()
{
  background(128);
  strokeWeight(20);
  ellipse(100,200,180,360);
  ellipse(300,200,180,360);
  
  float angle1=atan2((mouseY-200)/2,mouseX-300); //角度=atan2(分子/分母)
  float newX1=300+100*cos(angle1)/2;  //右眼珠的X移動半徑大小
  float newY1=200+200*sin(angle1)/2;  //右眼珠的Y移動半徑大小
  ellipse(newX1,newY1,10,10);

  float angle2=atan2((mouseY-200)/2,mouseX-100);  
  float newX2=100+100*cos(angle2)/2;   //左眼珠的X移動半徑大小
  float newY2=200+200*sin(angle2)/2;   //左眼珠的Y移動半徑大小 
  ellipse(newX2,newY2,10,10);
}




目標一:做出泡泡龍射擊



1.射擊泡泡的概念
1.1線可隨滑鼠增長,球黏滑鼠移動
1.2自由移動,滑鼠移動球會自動歸回
1.3自由發射,滑鼠移動球會自動歸回
程式碼:
void setup()
{
  size (400,600);
}
float ballX=200 ,ballY=600;
float ballVX=0 ,ballVY=0;
float angle=0;
void draw()
{
  background(0,128,26);
  fill(#FCC557); ellipse(200,600,100,100);
  line(mouseX, mouseY,200,600);
  fill(#D2FF21); 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);
}

2017年10月2日 星期一

17/10/02 德宇的筆記Week04

目標一:做出angry bird遊戲(進階)




1.利用(Week03-1.3)的概念再做延伸




程式碼:

PImage imgBird, imgPig;
float birdX=100,birdY=500;
float birdVX=0 , birdVY=0;
float birdAX=0 , birdAY=0;
float [][]pigx=new float[5][4];  //透過陣列方式增加Pig
float [][]pigy=new float[5][4];
boolean [][]pigAlive=new boolean[5][4];
void setup()
{
  size (800,700);
  imgBird=loadImage("bird.png");
  imgPig=loadImage("pig.png");
  imageMode(CENTER);
    for(int i=0;i<5;i++)//將陣列新增的pig,貼入指定的位置上
  {
      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++)    //碰到豬就消失的程式碼,因為float被改成boolean函數

    {
      for(int j=0;j<4;j++)
      {
        if(dist(pigx[i][j],pigy[i][j],birdX,birdY)<100)
        {
          pigAlive[i][j]=false;
        }
       if(pigAlive[i][j])
          image(imgPig,pigx[i][j],pigy[i][j],100,100);
     }
   }
  image(imgBird, birdX,birdY,100,100);
  birdX += birdVX;
  birdY +=birdVY;
  if(birdX<50) {birdX=50; birdVX =-birdVX;}
  if(birdX>width-50) {birdX=width-50; birdVX=-birdVX;}
  if(birdY<50) {birdY=50; birdVY =-birdVY;}
  if(birdY>width-50) {birdY=width-50; birdVY=-birdVY;}

  birdVX += birdAX;
  birdVY += birdAY;
  birdVX *=0.997;
  birdVY *=0.997;
}

void mouseDragged()  //直線運動
{
  birdX=mouseX; birdY=mouseY;
  birdVX=birdVY=birdAX=birdAY=0;
}

void mouseReleased()  //拋物線
{
  birdVX = (100-mouseX)/ 10.0;
  birdVY = (400-mouseY)/ 10.0;
  birdAY = 0.98;
}


2.新增音效



步驟一:按以下路徑點開:速寫本->引用庫文件->添加庫文件






步驟二:下載 "Minim" + " Sound "






步驟三:將音樂檔案拖入程式內




程式碼:

import processing.sound.*;
SoundFile sound;
void setup()
{
  size (800,600);
  sound = new SoundFile(this,"Battle Theme.mp3");
  sound.play();
  sound.loop();
}

2017年9月30日 星期六

17/09/30 德宇的筆記Week03

目標一:做出angry bird遊戲



1.拖曳滑鼠使產生物理慣性(繪圖模擬)



程式碼:
void setup()
{
  size(800,600);  
}
float HookX=400,HookY=300;   //Hook的初始位子
float HookVX=0,HookVY=0;     //Hook的初始速度
void draw()
{
  background(255);    
  ellipse(HookX,HookY, 50,50);  //畫一個半徑50的圓
  line(HookX,HookY,400,300);  //畫一條線
  HookX+=HookVX;
  HookY+=HookVY;
}
void mouseDragged()  //拖曳滑鼠
  HookX=mouseX;
  HookY=mouseY;
}
void mouseReleased()  //放開滑鼠
  HookVX=(400-mouseX)/100.0;  //X軸位移方向
  HookVY=(300-mouseY)/100.0;  //Y軸位移方向
}






2拖曳滑鼠射擊讓豬豬消失






程式碼:
PImage imgbird,imgpig; 
void setup()
{
  size(800,600);
  imgbird=loadImage("bird.png");        
  imgpig=loadImage("pig.png");   
  imageMode(CENTER);  
}
float BirdX=400,BirdY=300;
float BirdVX=0,BirdVY=0;
float BirdAX=0,BirdAY=0;
float PigX=700,PigY=100;
boolean PigAlive=true;
void draw()
{
  background(255);
  if(PigAlive)image(imgpig,PigX,PigY,100,100);     
  image(imgbird,BirdX,BirdY,100,100);
  if(dist(PigX,PigY,BirdX,BirdY)<100)
  {
    PigAlive=false;
  } 
  line(BirdX,BirdY,400,300);
  BirdX+=BirdVX;
  BirdY+=BirdVY;
  BirdVX+=BirdAX;
  BirdVY+=BirdAY;
}
void mouseDragged()
{
  BirdX=mouseX;
  BirdY=mouseY;
  BirdVX=BirdVY=BirdAX=BirdAY=0;  //速度等於加速度
}
void mouseReleased()
{
  BirdVX=(400-mouseX)/10.0;
  BirdVY=(300-mouseY)/10.0;
  BirdAY=0.98;  //加速度9.8
}



3.設定邊界,讓憤怒鳥不會視窗外




程式碼:
PImage imgbird,imgpig; 
void setup()
{
  size(800,600);
  imgbird=loadImage("bird.png");        
  imgpig=loadImage("pig.png");   
  imageMode(CENTER);  
}
float BirdX=400,BirdY=300;
float BirdVX=0,BirdVY=0;
float BirdAX=0,BirdAY=0;
float PigX=700,PigY=100;
boolean PigAlive=true;
void draw()
{
  background(255);
  if(PigAlive)image(imgpig,PigX,PigY,100,100);     
  image(imgbird,BirdX,BirdY,100,100);
  if(dist(PigX,PigY,BirdX,BirdY)<100)
  {
    PigAlive=false;
  } 
  line(BirdX,BirdY,400,300);
  
  BirdX+=BirdVX;
  BirdY+=BirdVY;
  if(BirdX<50)  //設定邊界
  {
    BirdX=50;BirdVX=-BirdVX;
  }
  if(BirdX>width-50)
  {
    BirdX=width-50;BirdVX=-BirdVX;
  }
  if(BirdY<50)
  {
    BirdY=50;BirdVY=-BirdVY;
  }
  if(BirdY>height-50)
  {
    BirdY=height-50;BirdVY=-BirdVY;
  }
  
  BirdVX+=BirdAX;
  BirdVY+=BirdAY;
  BirdVX*=0.997;
  BirdVY*=0.997; 
}

void mouseDragged()
{
  BirdX=mouseX;
  BirdY=mouseY;
  BirdVX=BirdVY=BirdAX=BirdAY=0;
}

void mouseReleased()
{
  BirdVX=(400-mouseX)/10.0;
  BirdVY=(300-mouseY)/10.0;
  BirdAY=0.98;
}




目標二:做出小朋友下樓梯遊戲




程式碼:
void setup()
{
  size(600,500);
}
int boardX=227,boardY=400;
int kidX=300,kidY=250;
void draw()
{
  background(0);
  rect(boardX,boardY,200,50);
  rect(kidX,kidY,50,50);
  if(kidX>boardX-50&&kidX<boardX+200&&kidY>boardY-50)
  {
  }
  else kidY++;
  kidX=mouseX;
}