本周進度為成功時做了兩個按鈕,分別控制讓小人不掉落和重新開始遊戲的部分
本周電路板圖片
以下為本周程式碼
processing
import processing.serial.*;
Serial myPort;
int now;
int now2;
int testState=0;
//int testState2=0;
int cfg_width =450;
int cfg_height = 450;
int cfg_maxchange = 5;
float cfg_space_mod = 0.9994;
int cfg_playersize = 5;
float cfg_gravity = 1.0002;
PImage body;
float dir = 1; // current direction of the player (gravity vs pushing)
long score = 0; //分數
long maxscore = 0; //最高分紀錄
int push = 0; //按空白鍵增加
int mode = 1; // 遊戲狀態, 1=running, 0=lost, -1=lost and score printed
float cur_space = 450; // space to play
float factor = 0.5; // how far the cave can move max in the y axis for one x step
// the cave borders
int[] ylinetop = new int[cfg_width];
int[] ylinebottom = new int[cfg_width];
// the player (snake)遊戲的線
float[] yplayer = new float[cfg_width/2];
PFont myFont;
import ddf.minim.*;
Minim minim;
AudioPlayer player;
void initcave() {
score = 0;
dir = 1;
push = 0;
cur_space = 400;
body=loadImage("bodyknife.png");
for (int i = 0; i < width; i++) {
ylinetop[i] = height/2-int(cur_space)/2;
ylinebottom[i] = ylinetop[i]+int(cur_space);
}
for (int i = 0; i < width/2; i++) {
yplayer[i] = height/2;
}
}
void drawframe () {
drawframe2 ();//我寫的背景變色程式
// draw cave
stroke(255, 0, 0);
for (int i=1; i<width; i++) {
line(i, 0, i, ylinetop[i]);
line(i, ylinebottom[i], i, height);
}
if (mode < 1) {
stroke(0, 255, 0);
strokeWeight(5);
fill(100, 255, 0);
ellipse(width/2, yplayer[width/2 - 1], 150, 150);
}
people();
}
//背景變色程式在這邊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void drawframe2 () {
if (score/10<10) {//因為他計分我發現他是score有除以10 所以這邊也要把分數除10才會跟顯示的計分看起來一樣
background(0, 0, 0);//小於10分
}
else if (score/10<=50) {
background(0, 0, 255);//大於10分小於等於50分
}
else if (score/10<100) {
background(255, 255, 255);//大於等於50分小於100分
}
else if (score/10>=100) {
background(255, 255, 255);//大於等於100分
}
//要把所有數值的情況考慮進去,不然畫面會閃一下。例如原本是小於100 和大於100 沒有寫道等於100的情況 那100分的時候遊戲畫面會閃一下
}
void people() {//小人改變大小
for (int i=1; i<width/2; i++) {
if (score/10<50) {
image(body, i, int(yplayer[i]), 80, 80);
}
else if (score/10<=100) {//大於50分 小於等於100分
image(body, i, int(yplayer[i]), 60, 60);
}
else if (score/10<150) {
image(body, i, int(yplayer[i]), 30, 30);//大於100分小於150分
}
else if (score/10>=150) {
image(body, i, int(yplayer[i]), 30, 30);//大於等於150分
}
}
}
void setup()
{
size(cfg_width, cfg_height);
myPort= new Serial(this, "COM3", 9600);
initcave();
frameRate(100);
minim = new Minim(this); //播音樂
player = minim.loadFile("Kalimba.mp3"); //播音樂
player.play(); //播音樂
myFont = loadFont("SansSerif-12.vlw");
textFont(myFont);
}
void drawscore()
{
stroke(0);
strokeWeight(3);
fill(0);
text("最高分紀錄: " + int(maxscore/10) + " 分數: " + int(score/10), 1, 12);//計分都有除10在這
if (mode == -1) {
text("Game Over!再玩一次.", 2, 26);
}
}
void draw()
{
while (myPort.available ()>0) {
testState = myPort.read();
println(testState);
if (testState==49)
{
now = 1;
}
if (now==1)
dir *= 0.997;
if (testState=='a')
{
mode = 1;
initcave();
}
if (mode == 1) {
for (int i = 1; i < width; i++) {
ylinetop[i-1] = ylinetop[i];
ylinebottom[i-1] = ylinebottom[i];
}
for (int i = 1; i < width/2; i++) {
yplayer[i-1] = yplayer[i];
}
ylinetop[width-1] =
constrain( int( random(-cfg_maxchange, cfg_maxchange) + factor)
+ ylinetop[width-1]
, 0, height-int(cur_space+1));
ylinebottom[width-1] = ylinetop[width-1] + int(cur_space);
dir = pow(cfg_gravity, dir) * dir;
yplayer[width/2-1] = constrain(yplayer[width/2- 2] * dir, 1, height-2);
if (yplayer[width/2-1] < ylinetop[width/2] ||
yplayer[width/2-1] > ylinebottom[width/2]) {
mode = 0;
}
cur_space *= cfg_space_mod;
score += 1;
if (ylinetop[width-1] < 2 || ylinebottom[width-1] > height-2) {
factor *= -1;
}
}
else { // collision detected
if (mode == 0) {
// save new max score
maxscore = maxscore > score ? maxscore : score;
mode = -1;
}
}
drawframe();
drawscore();
}
void keyPressed() {
if (mode == 1 && key == '2') {
dir *= 0.997;
}
if (mode == -1 && (key == '0' )) { //按0重新開始
mode = 1;
initcave();
}
}
ardino
/*
DigitalReadSerial
Reads a digital input on pin 2, prints the result to the serial monitor
This example code is in the public domain.
*/
// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;
int pushButton2 = 3;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
pinMode(pushButton2, INPUT);
}
int a=0;
int a2=0;
// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int buttonState = digitalRead(pushButton);
int buttonState2 = digitalRead(pushButton2);
// print out the state of the button:
if (buttonState == HIGH && a==0 ) { // If switch is ON,
Serial.print(1);
a=1; // send 1 to Processing
}
if (buttonState == LOW && a==1) { // If the switch is not ON,
Serial.println(0);
a=0; // send 0 to Processing
}
if (buttonState2 == HIGH && a2==0 ) { // If switch is ON,
Serial.print('a');
a2=1; // send 1 to Processing
}
if (buttonState2 == LOW && a2==1) { // If the switch is not ON,
Serial.println('b');
a2=0; // send 0 to Processing
}
// Serial.println(buttonState);
delay(10); // delay in between reads for stability
}
以下為我們的電路板
沒有留言:
張貼留言