顯示具有 05160806_陳怡瑄 標籤的文章。 顯示所有文章
顯示具有 05160806_陳怡瑄 標籤的文章。 顯示所有文章

2019年1月3日 星期四

QAQ筆記 WEEK17

期末展示

我們覺得最大的困難點是要把PROCESSING跟ARDUINO做結合,因為需要花很多的耐心跟時間
要先搞懂如何接板子,再來搞懂要如何把正確的Arduino程式碼上傳到板子,最後是將Arduino連接上Processing
分別要把玩家一跟玩家二的炸彈還有移動方式分開寫,有點困難,我們摸索很久雖然有做出來但不完整,之後還是請教老師了

如何操作:玩家一使用Player1搖桿箱,玩家二使用Player2搖桿箱的搖桿來操作上下左右,遙桿按下則放出炸彈

賣點是很適合兩人玩,增進感情。


實際玩遊戲的樣子(用搖桿操控上下左右,按下搖桿的按鈕即可放出炸彈)


總結:
雖然最後操控部分還是有請教老師,但看到結果蠻成功而且還有被同學票選加到分
真的很有成就感很開心~~~~~~
不過按鈕的部分沒有弄到理想中的樣子有點可惜,可能之後再自己完成吧哈哈

2018年12月27日 星期四

QAQ筆記 WEEK16

期末作品

Processing :
import ddf.minim.*;
Minim minim;
AudioPlayer player;
import processing.serial.*;
Serial myPort1;
Serial myPort2;
PImage imgA, imgB, imgBG ,imgOPBG;
PImage imgBomb, imgRock, imgBombBG;
int [][]grid=new int[100][100];
int state=0;
int remainTime=0;
void setup(){
  size(800, 640);
  minim = new Minim(this);
  player = minim.loadFile("sd.mp3");
  player.loop();
  myPort1 = new Serial(this,"COM5",9600);
  myPort2 = new Serial(this,"COM4",9600);
  imgBG = loadImage("bg.jpg");
  imgA = loadImage("player22.png");
  imgB = loadImage("player1.png");
  imgBomb = loadImage("bomb.png");
  imgRock = loadImage("rock.png");
  imgBombBG = loadImage("bombbg.jpg");
  imgOPBG = loadImage("OPBG.jpg");
  grid[0][0]=3; grid[9][7]=4;
  grid[1][0]=3; grid[9][6]=4;
  grid[0][1]=3; grid[8][7]=4;
  for(int i=0;i<35;i++){
    int a=int(random(10)), b=int(random(10));
    while(grid[a][b]!=0){
      a=int(random(10)); b=int(random(10));
    }
     grid[a][b]=2;
     if(a==bombA[i] && b==bombB[i] || a==bombA[i]+1 && b==bombB[i] || a==bombA[i]-1 && b==bombB[i] || a==bombA[i] && b==bombB[i]+1 || a==bombA[i] && b==bombB[i]-1){
       grid[a][b]=0;
     }
  }
  grid[0][0]=0; grid[9][7]=0;
  grid[1][0]=0; grid[9][6]=0;
  grid[0][1]=0; grid[8][7]=0;
  delay(100);
}

boolean boom=false;
int userA=9, userB=7;
int userC=0, userD=0;
int bombN=0;
int []bombA=new int[100];
int []bombB=new int[100];
int []bombS=new int[100];
int []bombT=new int[100];
//int Button=0;

//int XL, XR, YU, YD, Button;
int XXL, XXR, YYU, YYD;
void draw(){
  println(frameRate);
  getData();//put data in XX,YY,Button
  if(state==0){
    drawOP();
    if(keyCode== ENTER) state=1;
  }else if(state==1){
    drawPlayer();
  }
}
void drawPlayer(){

  noStroke();
  image(imgBG,0,0,width,height);
  image(imgA,userA*80-20,userB*80-10,120,100);
  image(imgB,userC*80-5,userD*80-5,90,90);


  for(int i=0;i<bombN;i++){
    int a=bombA[i] , b=bombB[i];
    if(bombT[i]>0){
      grid[a][b]=1;
      image(imgBomb,bombA[i]*80+5, bombB[i]*80, 80, 80);
      bombT[i]--;
      if(bombT[i]==0)  bombT[i]=-13;
    
    
    }
    if(bombT[i]<0){
      for(int k=-bombS[i];k<=bombS[i];k++){
        image(imgBombBG,(bombA[i]+k)*80, (bombB[i])*80, 80, 80);
        image(imgBombBG,(bombA[i])*80, (bombB[i]+k)*80, 80, 80);
        grid[a][b]=0;
        if(grid[a+1][b]!=0){grid[a+1][b]=0;}
        if(a-1>=0){if(grid[a-1][b]!=0)grid[a-1][b]=0;}
        if(grid[a][b+1]!=0){grid[a][b+1]=0;}
        if(b-1>=0){if(grid[a][b-1]!=0)grid[a][b-1]=0;}

      
        if(userA==bombA[i] && userB==bombB[i] || userA==bombA[i]+1 && userB==bombB[i] || userA==bombA[i]-1 && userB==bombB[i] || userA==bombA[i] && userB==bombB[i]+1 || userA==bombA[i] && userB==bombB[i]-1)
        {boom=true;}
        if(userC==bombA[i] && userD==bombB[i] || userC==bombA[i]+1 && userD==bombB[i] || userC==bombA[i]-1 && userD==bombB[i] || userC==bombA[i] && userD==bombB[i]+1 || userC==bombA[i] && userD==bombB[i]-1)
        {boom=true;}
        if(userA==bombA[i] && userB==bombB[i] || userA==bombA[i]+1 && userB==bombB[i] || userA==bombA[i]-1 && userB==bombB[i] || userA==bombA[i] && userB==bombB[i]+1 || userA==bombA[i] && userB==bombB[i]-1){ userA=-3; userB=-3;}
        if(userC==bombA[i] && userD==bombB[i] || userC==bombA[i]+1 && userD==bombB[i] || userC==bombA[i]-1 && userD==bombB[i] || userC==bombA[i] && userD==bombB[i]+1 || userC==bombA[i] && userD==bombB[i]-1){ userC=-3; userD=-3;}
      
      }
      bombT[i]++;
    }
    
  }

  for(int x=0;x<10;x++){
    for(int y=0;y<8;y++){
      if(grid[x][y]==2) image(imgRock,x*80, y*80, 80, 80);
    }
  }

  if(boom){
    textSize(100);
    fill(#FF4800); text("GameOver", 150,200);
  }
}

void drawOP(){
  image(imgOPBG,0,0,width,height);
  fill(#FF0000);
  textSize(50); text("PRESS ENTER TO START",120,450);
}

byte [] data1 = new byte[3];
byte [] data2 = new byte[3];
byte oldButton1=1, oldButton2=1;
void getData(){
  if(myPort1.available()>0)
  {
    myPort1.readBytes(data1);
    if(data1[0]<30){
      if(userA-1>=0 && grid[userA-1][userB]==0)
        userA--;
    }
    if(data1[0]>100){
      if(userA+1<=9 && grid[userA+1][userB]==0)
      userA++;
    }
    if(data1[1]<30){
      if(userB-1>=0 && grid[userA][userB-1]==0)
      userB--;
    }
    if(data1[1]>100){
      if(userB+1<=7 && grid[userA][userB+1]==0)
        userB++;
    }
  
    if(data1[2]==0 && oldButton1==1 ){
      putBomb1();
    }
    oldButton1=data1[2];
  }


  if(myPort2.available()>0)
  {
    println(data1);
    myPort2.readBytes(data2);
    if(data2[0]<30){
      if(userC-1>=0 && grid[userC-1][userD]==0)
        userC--;
    }
    if(data2[0]>100){
      if(userC+1<=9 && grid[userC+1][userD]==0)
      userC++;
    }
    if(data2[1]<30){
      if(userD-1>=0 && grid[userC][userD-1]==0)
      userD--;
    }
    if(data2[1]>100){
      if(userD+1<=7 && grid[userC][userD+1]==0)
        userD++;
    }
    if(data2[2]==0 && oldButton2==1){
      putBomb2();
    }
    oldButton2=data2[2];
  }
}

void putBomb1(){
  bombA[bombN]=userA;  bombB[bombN]=userB;
  bombS[bombN]=1;  bombT[bombN]=25;
  bombN++;
}
void putBomb2(){
  bombA[bombN]=userC;  bombB[bombN]=userD;
  bombS[bombN]=1;  bombT[bombN]=25;
  bombN++;
}

Arduino :
void setup()
{
  Serial.begin(9600); // 設置串口波特率
  pinMode(2, INPUT_PULLUP);
  //digitalWrite(2,HIGH);

}
byte data[3];
void loop()
{
  int valX = analogRead(A0);
  int valY = analogRead(A1);// 在針腳2讀取的邏輯狀態的值
  int valButton = digitalRead(2);// 向串口發送數據,以逗號分隔
  data[0]=valX/8;
  data[1]=valY/8;
  data[2]=valButton;
  Serial.write(data, 3);
  delay(50);// 下一次測量之前稍微延遲
}

2018年12月20日 星期四

QAQ筆記 WEEK15

今天來測試搖桿~

我參考此網站的程式碼:https://kknews.cc/zh-tw/other/46y82b3.html

Arduino程式碼如下:

int xValue = 0; // 初始化X軸的值

int yValue = 0; // 初始化Y軸的值

int bValue = 0; // 初始化開關的值

void setup()

{

Serial.begin(9600); // 設置串口波特率

pinMode(2, INPUT); // 配置引腳2作為輸入

}

void loop()

{

// 讀模擬埠A0和A1的值賦值給XY軸數據

xValue = analogRead(A1);

yValue = analogRead(A0);

// 在針腳2讀取的邏輯狀態的值

bValue = digitalRead(2);

// 向串口發送數據,以逗號分隔

Serial.print(xValue,DEC);

Serial.print(",");

Serial.print(yValue,DEC);

Serial.print(",");

Serial.print(!bValue,DEC);

Serial.print(",");

// 以換行符結束沒組數據

Serial.print("\n");

// 下一次測量之前稍微延遲

delay(2);

}



--------------------------------------------------------------------------------------------------------------------

Processing程式碼如下:

import processing.serial.*; // 導入processing串口通信庫
Serial myPort; // 創建一個串口變量
int x; // X軸全局變量
int y; // Y軸全局變量
int b; // 搖杆按下變量
PFont f; // 顯示字體
String portName; //串口號
void setup()
{
size(512, 512); // 畫布尺寸
portName = "COM6"; // Arduino連接的串口號
// 註冊通信串口
myPort = new Serial(this, portName, 9600);
f = createFont("Arial", 16, true); // 定義字體字號
textFont(f, 16); // 文字顯示占16個像素,16px
}
// 循環畫圖
void draw()
{
fill(0); // 設置小圓填充顏色為黑色
clear(); // 清楚螢幕
fill(255); // 設置畫布填充顏色為白色
if (b == 1) // 如果搖杆按鈕被按下
{
//小圓直徑為50,大一點
ellipse(512-(x/2), 512-(y/2), 50, 50);
} else
{
// 按鈕沒有被按下的話設置為小圓
ellipse(512-(x/2), 512-(y/2), 25, 25);
}
// 顯示數據
text("AnalogX="+(1023-x)+" AnalogY="+(1023-y),10,20);
}
// 接收串口的數據
void serialEvent(Serial port)
{
// 讀取一行的數據
String input = port.readStringUntil(10);
println(input);//測試用,把數據打出來看看
if (input != null)
{
// 根據,分割這一行的數據
int[] vals = int(splitTokens(input, ","));
// 為xyb變量賦值
x = vals[0];
y = vals[1];
b = vals[2];
}
}


裝置接法:

搖桿 - 板子

GND - GND
5V     -   5V
VRx  - A1
VRy  - A0
SW   - RX(0)


成功執行後搖桿就可以操控小白點上下左右的移動了~~~

2018年12月13日 星期四

QAQ筆記 WEEK14

*老師的教學:

裝好Arduino的驅動程式後,開啟Arduino

開啟Analog類別的範例程式AnalogInput














































範例程式如下:


int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // turn the ledPin on
  digitalWrite(ledPin, HIGH);
  // stop the program for <sensorValue> milliseconds:
  delay(sensorValue);
  // turn the ledPin off:
  digitalWrite(ledPin, LOW);
  // stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);
}


旋鈕的接法如下:




















成功執行後,往右旋燈閃爍的速度會變慢,往左旋燈閃爍的速度會變快
閃爍的燈為第13個燈


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

*測試按鈕:


到此網址下載Bounce程式庫https://github.com/justjoheinz/Bounce

匯入程式庫如下圖



執行程式碼:

#include <Bounce.h>

Bounce bouncer = Bounce(2, 50);
static int ledStatus = LOW;

void setup(){
  Serial.begin(115200);
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, ledStatus);
}

void loop(){
  bouncer.update();
  if(bouncer.read() == HIGH) {
    ledStatus = bouncer.duration() >= 5000 ? LOW : HIGH;
  }
  else{
    ledStatus = LOW;
  }

  digitalWrite(13, ledStatus);
}



成功執行後按下按鈕就會亮TX燈(紅色),持續按著燈會亮著,放開就會熄掉

如果快速的按下按鈕並放開數次,燈就會如預期的閃爍 ~ 測試大成功!!!

2018年12月6日 星期四

QAQ筆記 WEEK13

期末作品

一開始想先從可以成功將搖桿與角色接上
再來調其他有的沒的

後來使用老師教的概念
最後終於可以成功使用搖桿讓角色上下左右的移動~

移動程式碼如下:

byte [] data1 = new byte[3];
byte [] data2 = new byte[3];
byte oldButton1=1, oldButton2=1;
void getData(){
  if(myPort1.available()>0)
  {
    myPort1.readBytes(data1);
    if(data1[0]<30){
      if(userA-1>=0 && grid[userA-1][userB]==0)
        userA--;
    }
    if(data1[0]>100){
      if(userA+1<=9 && grid[userA+1][userB]==0)
      userA++;
    }
    if(data1[1]<30){
      if(userB-1>=0 && grid[userA][userB-1]==0)
      userB--;
    }
    if(data1[1]>100){
      if(userB+1<=7 && grid[userA][userB+1]==0)
        userB++;
    }
    
    if(data1[2]==0 && oldButton1==1 ){
      putBomb1();
      //if(a==bombA[i] && b==bombB[i] || a==bombA[i]+1 && b==bombB[i] || a==bombA[i]-1 && b==bombB[i] || a==bombA[i] && b==bombB[i]+1 || a==bombA[i] && b==bombB[i]-1)
      //bombA[bombN]=userA;  bombB[bombN]=userB;
      //bombS[bombN]=1;  bombT[bombN]=25;
      //bombN++;
    }
    oldButton1=data1[2];
  }
  
  
  if(myPort2.available()>0)
  {
    println(data1);
    myPort2.readBytes(data2);
    if(data2[0]<30){
      if(userC-1>=0 && grid[userC-1][userD]==0)
        userC--;
    }
    if(data2[0]>100){
      if(userC+1<=9 && grid[userC+1][userD]==0)
      userC++;
    }
    if(data2[1]<30){
      if(userD-1>=0 && grid[userC][userD-1]==0)
      userD--;
    }
    if(data2[1]>100){
      if(userD+1<=7 && grid[userC][userD+1]==0)
        userD++;
    }
    if(data2[2]==0 && oldButton2==1){
      putBomb2();
    }
    oldButton2=data2[2];
  }
  
}

2018年11月29日 星期四

QAQ筆記 WEEK12

校外教學~

謝謝老師帶我們去位於台北的HackerSpace做光劍~
真的是個很好玩的體驗!
一開始要把110顆LED燈全部焊接在一起
真的需要非常集中精神,有一點大意就有可能會燙到或是接不好









後來我們這組還有另一個自己一組的朋友弄最久
焊接一直斷掉,我整個做到很爆氣
但好險我們都有堅持到最後,也謝謝老師一直陪我們到那麼晚都還沒吃飯哈哈
最後終於成功做出屬於我們自己的光劍了!!!
還收到一些3D列印出來的小禮物~
真的是一個很難忘的回憶~~~~~