期末作品展示:
皮卡丘打排球
作品說明:
遊戲為兩隻皮卡丘在打排球,分別為P1、P2,玩家可透過遊戲裝置(如上圖)操控皮卡丘,按鈕分別為向左(黃色按鈕)、跳(紅色按鈕)、向右(黃色按鈕)。最後先得15分者獲勝。
裝置內部:
展示影片:
https://www.youtube.com/watch?v=6JNwfsUDVpk&feature=youtu.be
#第15週
期末作品:皮卡丘打排球-------------------------------------------------------------------------------------------------------------------------
◎接上搖桿
程式碼:
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(500); }
◎數值簡單化
程式碼:
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() {
int s=digitalRead(SW_pin);
int x=analogRead(X_pin);
int y=analogRead(Y_pin);
Serial.print("w");
Serial.print(s);
Serial.print("x");
if(x/4=='w' || x/4=='x' || x/4=='y' ) Serial.write('v');
else Serial.write(x/4);
Serial.print("y");
if(y/4=='w' || y/4=='x' || y/4=='y' ) Serial.write('v');
else Serial.write(y/4);
delay(50);
// 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(500);
}
◎連到Processing
程式碼:
import processing.serial.*; Serial myPort; void setup(){ size(300,300); myPort = new Serial(this, "COM7", 115200); } int t=0, s=48, x=128, y=128; void draw(){ background(255); while(myPort.available() > 0){ t = myPort.read(); if(t=='w') s = myPort.read(); else if(t=='x') x=myPort.read(); else if(t=='y') y=myPort.read(); } if(s==49)fill(255,0,0); else fill(0,255,0); ellipse(x, y, 30,30); }
◎代入之前期中的程式碼
程式碼:
import processing.serial.*;
Serial myPort;
//import ddf.minim.*;
//Minim minim;
//AudioPlayer bgm;
PImage imgBall,imgP1,imgP2;
void setup(){
size(800,600);
textSize(50);
myPort = new Serial(this, "COM7", 115200);
imgBall=loadImage("Ball.png");
imgP1=loadImage("P1.png");
imgP2=loadImage("P2.png");
imageMode(CENTER);
//minim=new Minim(this);
//bgm=minim.loadFile("pika.mp3",2048);
//bgm.play();
//bgm.loop();
}
int t=0, s=48, x=128, y=128;
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
while(myPort.available() > 0){
t = myPort.read();
if(t=='w') s = myPort.read();
else if(t=='x') x=myPort.read();
else if(t=='y') y=myPort.read();
}
//if(s==49)fill(255,0,0);
//else fill(0,255,0);
//ellipse(x, y, 30,30);
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(p1S==15){
bGG=true;
String p1win = "p1 is winner !!";
fill(#E85050);
text(p1win, 230, 150, 500, 200);
}
if(p2S==15){
bGG=true;
String p2win = "p2 is winner !!";
fill(#E85050);
text(p2win, 230, 150, 500, 200);
}
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(330<ballX && ballX<470 && 270<ballY &&ballY<560)
{ballVX=-ballVX;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-ballVX)/6.0;
if(dist(p2X,p2Y,ballX,ballY)<=80) ballVX=-(80-ballVX)/6.0;
}
#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; // The serial port void setup() { // List all the available serial ports: printArray(Serial.list()); // Open the port you are using at the rate you want: myPort = new Serial(this, Serial.list()[0], 9600); } void draw() { while (myPort.available() > 0) { String inBuffer = myPort.readString(); if (inBuffer != null) { println(inBuffer); } } }