|
今天我们继续学习Processing的自带库--Serial库(串口通信库)。
串口通信相对来说一个比较重要的库,因为应用比较多。毕竟Processing+Arduino的应用组合是当前十分受欢迎的一个模式。
下面我就从一个例子中感受一下Serial库带来的震撼效果。
本例中用到了碰撞检测(边界检测),飘雪系统,音效,弧线轨迹等。
实际上用底层手段,粗糙的模拟了一套2d游戏框架(有点吹大了)。不过确实是这样的。
总体来说,技术含量居中,属于介于学年设计,毕业设计的水平。
希望大家有所参考吧。 - import ddf.minim.*;
- import processing.serial.*;
- Table myGameSave;
- Serial myPort = new Serial(this,"COM20", 9600);
- Minim minim= new Minim(this);
- AudioPlayer BKMplayer;
- AudioPlayer BZSplayer;
- AudioPlayer CJBplayer;
- AudioPlayer TTplayer;
- AudioPlayer WDplayer;
- AudioPlayer XYplayer;
- PImage mybackground;
- PImage biaoti;
- PImage xuehua1;
- PImage xuehua2;
- PImage xuehua3;
- PImage myMan;
- PImage myManDao;
- PImage myGoldBi;
- PImage citie;
- PImage danyanguai;
- PImage dashouguai;
- PImage kuloutou;
- PImage lansexiaoguai;
- PImage xiaoji;
- PImage xiaoxiaoji;
- PImage xueren;
- PImage youling;
- PImage zhadan;
- PFont myFont;
- int stage=0;
- String GameName="饥饿的机器人";
- int PlayNowTime;
- int GameLiveTime;
- int GameRank;
- int GoldNum;
- int AddGoldNum;
- int m_LanFormMove;
- int BestGameRank;
- int BestGameGoldNum;
- int CreateGoldTime;
- int CreateObstacleTime;
- // float noiseScale=0.005;//地形变化指数
- int xspacing = 8; // How far apart should each horizontal location be spaced
- int w; // Width of entire wave
- int maxwaves = 1; // total # of waves to add together
- float theta = 0.0;
- float[] amplitude = new float[maxwaves]; // Height of wave
- float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing
- float[] yvalues; // Using an array to store height values for the wave (not entirely necessary)
- int WindowsX;
- int WindowsY;
- int RobotManX;
- int RobotManY;
- int realRobotManX;
- int realRobotManY;
- int GoldX;
- int GoldY;
- int ObstacleX;
- int ObstacleY;
- int xuanyunshijian;
- int wudishijian;
- int Arduinokey;
- boolean ArduinoKeyA;
- boolean ArduinoKeyB;
- float mylinek = 0.0;
- boolean IsObstacleisLive;
- boolean IsGoldisLive;
- float RobotManJump;
- int [][]ThingMap=new int[10][2];
- xuehua []m_xiaxuehuazu=new xuehua[10];
- void setup()
- {
- myGameSave=loadTable("Save.csv","header");
- println("myGameSave.getRowCount(): "+myGameSave.getRowCount());
- if (myGameSave.getRowCount()==1)
- {
- TableRow newRow=myGameSave.addRow();
- newRow.setInt("GameRankSave",0);
- newRow.setInt("GameGoldNumSave",0);
- saveTable(myGameSave,"data/Save.csv");
- }
-
- size(1024, 768,P3D);
- //
- BKMplayer=minim.loadFile("bkmusic.mp3");
- BZSplayer=minim.loadFile("baozhasheng.wav");
- CJBplayer=minim.loadFile("chijinbi.wav");
- TTplayer=minim.loadFile("tantiao.wav");
- WDplayer=minim.loadFile("wudiyinxiao.wav");
- XYplayer=minim.loadFile("xuanyun.wav");
- //Ani.init(this);//初始化ani库
- w = width +160;
- for (int i = 0; i < maxwaves; i++)
- {
- amplitude[i] = random(0,10);
- float period = random(800,1500); // How many pixels before the wave repeats
- dx[i] = (TWO_PI / period) * xspacing;
- }
- yvalues = new float[w/xspacing];
- frameRate(60);
- WindowsX=0;
- WindowsY=0;
- myFont=createFont("微软雅黑",32);
- mybackground=loadImage("background.jpg");
- biaoti=loadImage("biaoti.png");
- myMan=loadImage("man.png");
- myManDao=loadImage("mandao.png");
- myGoldBi=loadImage("goldbi.png");//1,2,3
- xuehua1=loadImage("xuehua1.png");
- xuehua2=loadImage("xuehua2.png");
- xuehua3=loadImage("xuehua3.png");
- citie=loadImage("citie.png");//5
- danyanguai=loadImage("danyanguai.png");//10
- dashouguai=loadImage("dashouguai.png");//15
- lansexiaoguai=loadImage("lansexiaoguai.png");//20
- xiaoji=loadImage("xiaoji.png");//25
- xiaoxiaoji=loadImage("xiaoxiaoji.png");//30
- xueren=loadImage("xueren.png");//35
- youling=loadImage("youling.png");//40
- zhadan=loadImage("zhadan.png");//45
- kuloutou=loadImage("kuloutou.png");//50
- textFont(myFont);
- GameRank=0;
- GameLiveTime=12;
- GoldNum=0;
- m_LanFormMove=0;
- RobotManX=150;
- for (int i = 0; i<10; i++){
- m_xiaxuehuazu[i]=new xuehua();
- }
- BKMplayer.loop();
- BeginGame();
-
- }
- void draw()
- {
- // image(mybackground, 0, 0, width, height);
- // image(myMan, 0, 0, 100, 100);
- GetArduinoKey();
- switch (stage)
- {
- case 0 ://游戏开始选择画面
- {
-
- BeginGame();
- xiaxue();
- break;
- }
- case 1 ://游戏开始
- {
- PlayGame();
- PrintText();
- xiaxue();
- break;
- }
- case 2://制作人员
- {
- CreditsPage();
- xiaxue();
- break;
- }
- case 3://游戏结束
- {
- GameOver();
- xiaxue();
- break;
- }
- case 4 ://游戏胜利
- {
- GameWin();
- xiaxue();
- break;
- }
- default :
- {
- break;
- }
-
-
- }
-
- }
- void keyPressed()
- {
- switch (stage)
- {
- case 0 ://游戏开始选择画面
- {
- if (key=='a'||key=='A')
- {
- stage=1;
- InitGame();
- }
- if (key=='b'||key=='B')
- {
- CreditsPage();
- }
- break;
- }
- case 1 ://游戏开始
- {
- if (key=='b'||key=='B')
- {
-
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- wudishijian=0;
- }
- else
- {
- WDplayer.loop(0);
- wudishijian=2;
- }
-
- EliminateObstacle();
- println("ok");
- }
- if (key=='a'||key=='A')
- {
- TTplayer.loop(0);
- RobotManJump=5;
- TTplayer.play();
- }
- break;
- }
- case 2://制作人员
- {
- if(keyCode>0)
- {
- BeginGame();
- }
- break;
- }
- case 3://游戏结束
- {
- if (key=='a'||key=='A')
- {
- stage=0;
- BeginGame();
- }
- if (key=='b'||key=='B')
- {
- exit();
- }
- break;
- }
- case 4://游戏胜利
- {
- if (key=='a'||key=='A')
- {
- WindowsX=0;
- WindowsY=0;
- GameRank++;
- InitGame();
- }
- if (key=='b'||key=='B')
- {
- exit();
- }
- break ;
- }
-
- }
- }
- void BeginGame()//开始游戏界面
- {
- stage=0;
- // image(mybackground, 0,0, width, height);
- MoveBackImage(WindowsX++,WindowsY++);
- if (WindowsX>mybackground.width-width)
- {
- WindowsX=0;
- }
- if (WindowsY>mybackground.height-height)
- {
- WindowsY=0;
- }
- textSize(100);
- // fill((millis()/100)%255, (millis()/100)%255, (millis()/100)%255, (millis()/100)%100+155);
- // text(GameName, 190, 200);
- image(biaoti, 0, 0, width, height);
- noStroke();
- fill((millis()/100)%255, (millis()/100)%255, (millis()/100)%255, (millis()/100)%100+155);
- textSize(40);
- text("输入A 开始游戏",150, 500);
- text("输入B 查看创作人员",150,600);
- GoldNum=0;
- GameRank=0;
- }
- void InitGame()//初始化游戏状态
- {
- stage=1;
- PlayNowTime=millis()/1000;
- GameLiveTime=60;
-
- //CreateSomeThing();
- PlayGame();
- CreateGold();
- }
- void PlayGame()//游戏开始
- {
- if (IsGameWin())
- {
- GameWin();
- }
- if (!IsGameOver())
- {
- DrawlandForm();
- }
- else
- {
- GameOver();
- }
- }
- void EliminateObstacle()
- {
- if (wudishijian>0)
- {
- fill(248,252,31, 100);
- // rect(realRobotManX, realRobotManY, 100, 100);
- ellipse(realRobotManX+40, realRobotManY+40, 100, 100);
- }
-
- }
- void DrawPlayerGoldMan(int x,int y)//绘制主人公
- {
- RobotManJump-=((millis()/1000)%2);
- xuanyunshijian-=((millis()/1000)%2);
- // wudishijian-=((millis()/1000)%1.5);
- if (xuanyunshijian>0)
- {
- image(myManDao, x, y, 80, 80);
- }
- else
- {
- if (RobotManJump>0)
- {
- realRobotManX=x;
- realRobotManY=y-100;
- image(myMan, x, y-100, 80, 80);
- EliminateObstacle();
- println("(RobotManJump-(millis()/1000)%2): "+(RobotManJump-(millis()/1000)%2));
- }
- else
- {
- realRobotManX=x;
- realRobotManY=y;
- image(myMan, x, y, 80, 80);
- EliminateObstacle();
- RobotManJump=0;
- }
- }
-
- }
- void MoveBackImage(int x,int y)//绘制动态的背景图片
- {
- if (X<mybackground.width&&y<mybackground.height)
- {
- image(mybackground, -x, -y);
- }
- else
- {
- println("绘制动态的背景图片error!");
- }
- }
- void DrawlandForm()//绘制动态雪景地形
- {
- // image(mybackground, 0, 0, width, height);
- if(xuanyunshijian>0)
- {
- MoveBackImage(WindowsX,WindowsY);
- }
- else
- {
- WindowsX=WindowsX+1+GameRank;
- WindowsY=WindowsY+1+GameRank;
- MoveBackImage(WindowsX,WindowsY);
- }
- if (WindowsX>mybackground.width-width)
- {
- WindowsX=0;
- }
- if (WindowsY>mybackground.height-height)
- {
- WindowsY=0;
- }
- // for (int x = width; x>0; x-=10)
- // {
- // float noiseVal = noise((LanFormMove())*noiseScale,100*noiseScale);
- // //线级渲染 速度慢,但效果细腻
- // // stroke(222,248,255);
- // // line(x,noiseVal*100+400, x, height);
- // // 方块级渲染 速度快,但效果较粗糙
- // noStroke();
- // fill(222, 248, 255,250);
- // rect(x, noiseVal*100+400, 10,noiseVal*100+400);
- // RobotManY=(int)noiseVal*100+400;
- // DrawPlayerGoldMan(RobotManX,RobotManY-40);
- // rect(x, noiseVal*100+400, 80, 80);
- // if (IsGoldisLive)
- // {
- // DrawAGold((int)noiseVal*100+400);
- // }
- // if (IsObstacleisLive)
- // {
- // DrawAObstacle((int)noiseVal*100+400);
- // }
- noStroke();
- calcWave();
- renderWave();
- fill(222, 248, 255,250);
- triangle(0,RobotManY-50,0,height,900,height);
- mylinek=(float)(height-(RobotManY-50))/(float)(900-0);
- //println("mylinek: "+mylinek);
- DrawPlayerGoldMan(RobotManX,RobotManY);
- DrawAGold();
- // }
- }
- void calcWave() {//计算主人公滑雪动作
- theta += 0.001;
- for (int i = 0; i < yvalues.length; i++) {
- yvalues[i] = 0;
- }
-
- // Accumulate wave height values
- for (int j = 0; j < maxwaves; j++) {
- float x = theta;
- for (int i = 0; i < yvalues.length; i++) {
- // Every other wave is cosine instead of sine
- if (j % 2 == 0) yvalues[i] += sin(x)*amplitude[j];
- else yvalues[i] += cos(x)*amplitude[j];
- x+=dx[j];
- }
- }
- }
- void renderWave() {//输出主人公滑雪动作
- noStroke();
- fill(255,50);
- for (int x = 0; x < yvalues.length; x++)
- {
- RobotManY=(int)yvalues[x]+400-80;
- }
- }
- void CreateGold()//创建金币
- {
- // CreateGoldTime=millis()/1000;
- // GoldX=width;
- // IsGoldisLive=true;
- for (int x = 0; x<10; x++){
- for (int y = 0; y<2; y++){
- ThingMap[x][y]=(int)random(0, 60);
- }
- }
- GoldX=RobotManX+800;
- GoldY=RobotManY+400;
- }
- void DrawAGold()//绘制金币
- {
- if (xuanyunshijian>0)
- {
-
- }
- else
- {
- GoldX-=(2+GameRank*2);
- GoldY-=(1+GameRank);
- }
- if (GoldX+10*80+80<RobotManX)
- {
- CreateGold();
- }
- for (int x = 0; x<10; x++){
- for (int y = 0; y<2; y++){
- switch (ThingMap[x][y])
- {
- case 1 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 2 ://绘制创建中金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 40, 40);
- AddGoldNum=4;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 3 ://绘制创建大金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45,50, 50);
- AddGoldNum=8;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 4 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 5 ://磁铁怪
- {
- image(citie, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-5;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=2;
- GameLiveTime-=1;
- ThingMap[x][y]=0;
- }
-
- }
- AddGoldNum=0;
- break;
- }
- case 6 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 10 :
- {
- image(danyanguai, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-5;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=3;
- GameLiveTime-=1;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 11://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 12 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 13 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 14 ://绘制创建小金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 30, 30);
- AddGoldNum=2;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 15 :
- {
- image(dashouguai, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-7;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=3;
- GameLiveTime-=1;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 20 :
- {
- image(kuloutou, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-8;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=2;
- GameLiveTime-=5;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 21 ://绘制创建中金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 40, 40);
- AddGoldNum=4;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 25 :
- {
- image(lansexiaoguai, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-9;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=2;
- GameLiveTime-=2;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 26 ://绘制创建中金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 40, 40);
- AddGoldNum=4;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 30 :
- {
- image(xiaoji, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GameLiveTime+=5;
- ThingMap[x][y]=0;
- }
- break;
- }
- case 31 ://绘制创建中金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 40, 40);
- AddGoldNum=4;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 35 :
- {
- image(xiaoxiaoji, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GameLiveTime+=3;
- ThingMap[x][y]=0;
- }
- break;
- }
- case 36://绘制创建中金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45, 40, 40);
- AddGoldNum=4;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 40 :
- {
- image(xueren, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-10;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=4;
- GameLiveTime-=2;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 41 ://绘制创建大金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45,50, 50);
- AddGoldNum=8;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 45 :
- {
- image(youling, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-15;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=4;
- GameLiveTime-=5;
- ThingMap[x][y]=0;
- }
- }
- AddGoldNum=0;
- break;
- }
- case 46 ://绘制创建大金币
- {
- image(myGoldBi, GoldX+x*80+80, GoldY-y*80+x*45,50, 50);
- AddGoldNum=8;
- if (IsGetGold(GoldX+x*80+80, GoldY-y*80+x*45))
- {
- CJBplayer.loop(0);
- GoldNum+=AddGoldNum;
- println("is can ");
- ThingMap[x][y]=0;
- }
- AddGoldNum=0;
- break ;
- }
- case 50 :
- {
- image(zhadan, GoldX+x*80+80, GoldY-y*80+x*45, 50, 50);
- if (IsGetGold(GoldX+x*80+80,GoldY-y*80+x*45))
- {
- AddGoldNum=-30;
- if (wudishijian>0)
- {
- WDplayer.loop(0);
- GoldNum+=AddGoldNum;
- ThingMap[x][y]=0;
- }
- else
- {
- XYplayer.loop(0);
- xuanyunshijian=3;
- GameLiveTime-=10;
- ThingMap[x][y]=0;
- CreateGold();
- }
- }
- AddGoldNum=0;
- break;
- }
- default :
-
- break;
- }
-
- }
- }
- if (GoldX<RobotManX-(20*80+80))
- {
- IsGoldisLive=false;
- }
- // if (IsGetGold())
- // {
- // GoldNum+=AddGoldNum;
- // //IsGoldisLive=false;
- // println("is can ");
- // }
-
- }
- boolean IsGetGold(int x,int y)//主人公是否得到了金币
- {
- if(x<realRobotManX+80&&(y>realRobotManY-10&&y<realRobotManY+80))
- {
- return true;
- }
- else
- {
- return false;
- }
-
- }
- // int LanFormMove()//雪景地形的移动参数计算函数
- // {
- // if (m_LanFormMove<width)
- // {
- // m_LanFormMove++;
- // return m_LanFormMove;
- // }
- // else
- // {
- // m_LanFormMove=0;
- // return m_LanFormMove;
- // }
- // }
- boolean IsGameWin()
- {
- if(!IsGameOver())
- {
- if (GoldNum>30+GameRank*70)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- boolean IsGameOver()//是否游戏结束 主人公生存时间为零,即游戏结束
- {
- if ((millis()/1000-PlayNowTime)>GameLiveTime)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- void CreditsPage()//显示制作人员的窗口
- {
- stage=2;
- image(mybackground, 0, 0, width, height);
- textSize(100);
- fill(236, 245, 17);
- text("作者:杨帆",300,120);
- GetGameResult();
- textSize(60);
- text("至今挑战到了:"+BestGameRank+"游戏难度!", 0, 400);
- text("至今获得最大金币数量为:"+BestGameGoldNum, 0, 500);
- }
- void PrintText()//显示游戏数据,如主人公生存时间等
- {
- fill(0,0,0,0);
- rect(450, 0, width, 30);
- textSize(30);
- fill(34,62,196,200);
- String m_time="";
- //m_time+="主人公生存时间:"+(GameLiveTime-(millis()/1000-PlayNowTime))+"S";
- m_time+=" "+"游戏难度:"+GameRank;
- m_time+=" "+"金币数:"+GoldNum;
- m_time+=" "+"过关金币数:"+(30+GameRank*70);
- text(m_time,450,0,width,100);
- text("时间:", 0, 0,100, 100);
- DrawPowerRect();
- }
- void DrawPowerRect()//画时间条
- {
- int power;
- power=(GameLiveTime-(millis()/1000-PlayNowTime))*5;
- noFill();
- rect(100, 0, 450, 30);
- fill(30, 72, 232,200);
- rect(100, 0, power, 30);
- }
- void GameOver()//游戏结束
- {
- stage=3;
- // background(0);
- MoveBackImage(WindowsX++,WindowsY++);
- if (WindowsX>mybackground.width-width)
- {
- WindowsX=0;
- }
- if (WindowsY>mybackground.height-height)
- {
- WindowsY=0;
- }
- textSize(30);
- text("按 A 键 ", 0, 80);
- textSize(100);
- text("再来一次!",220, 200);
- textSize(30);
- text("按 B 键 ", 0, 240);
- textSize(100);
- text("游戏结束!", 220, 350);
- String m_time="金币数:"+GoldNum+"个";
- text(m_time,220,500);
- SaveGameResult();
- }
- void GameWin()
- {
- stage=4;
- WindowsX=0;
- WindowsY=0;
- MoveBackImage(WindowsX++,WindowsY++);
- if (WindowsX>mybackground.width-width)
- {
- WindowsX=0;
- }
- if (WindowsY>mybackground.height-height)
- {
- WindowsY=0;
- }
- textSize(30);
- text("按 A 键 ", 0, 80);
- textSize(100);
- text("进行下一关!",220, 200);
- textSize(30);
- text("按 B 键 ", 0, 240);
- textSize(100);
- text("游戏结束!", 220, 350);
- String m_time="金币数:"+GoldNum+"个";
- text(m_time,220,500);
- SaveGameResult();
- }
- void xiaxue()
- {
- for (int i = 0; i<10; i++){
- m_xiaxuehuazu[i].displayxiaxue();
- }
-
- }
- void SaveGameResult()
- {
- GetGameResult();
- if (GameRank>BestGameRank)
- {
- myGameSave.setInt(0,0,GameRank);
- println("1BestGameRank: "+GameRank);
- }
- if (GoldNum>BestGameGoldNum)
- {
- myGameSave.setInt(1,0,GoldNum);
- println("2BestGameGoldNum: "+GoldNum);
- }
- saveTable(myGameSave,"data/Save.csv");
- }
- void GetGameResult()
- {
- BestGameRank=myGameSave.getInt(0,0);
- BestGameGoldNum=myGameSave.getInt(1,0);
- println("BestGameRank: "+BestGameRank);
- println("BestGameGoldNum: "+BestGameGoldNum);
- }
- void GetArduinoKey()
- {
- int temp;
- while (myPort.available()>0)
- {
- temp=myPort.read();
- Arduinokey=temp;
- println("temp: "+temp);
- }
- switch (stage)
- {
- case 0 ://游戏开始选择画面
- {
- if (Arduinokey=='1')
- {
- stage=1;
- Arduinokey=0;
- InitGame();
- }
- if (Arduinokey=='2')
- {
- Arduinokey=0;
- CreditsPage();
- }
- break;
- }
- case 1 ://游戏开始
- {
- if (Arduinokey=='1')
- {
- Arduinokey=0;
- if (wudishijian>0)
- {
- wudishijian=0;
- }
- else
- {
- wudishijian=2;
- }
-
- EliminateObstacle();
- println("ok");
- }
- if (Arduinokey=='2')
- {
- Arduinokey=0;
- RobotManJump=1.5;
- }
- break;
- }
- case 2://制作人员
- {
- if(Arduinokey=='1'||Arduinokey=='2')
- {
- Arduinokey=0;
- BeginGame();
- }
- break;
- }
- case 3://游戏结束
- {
- if (Arduinokey=='1')
- {
- Arduinokey=0;
- stage=0;
- BeginGame();
- }
- if (Arduinokey=='2')
- {
- Arduinokey=0;
- exit();
- }
- break;
- }
- case 4://游戏胜利
- {
- if (Arduinokey=='1')
- {
- Arduinokey=0;
- WindowsX=0;
- WindowsY=0;
- GameRank++;
- InitGame();
- }
- if (Arduinokey=='2')
- {
- Arduinokey=0;
- exit();
- }
- break ;
- }
-
- }
- }
- public class xuehua
- {
-
- weizhi []xuehuazu=new weizhi[5];
- public xuehua()
- {
- for (int i = 0; i<5; i++)
- {
- xuehuazu[i]=new weizhi();
- }
- for (int i = 0; i<5; i++)
- {
- xuehuazu[i].m_x=(int)random(0, width);
- xuehuazu[i].m_y=0;
- xuehuazu[i].m_h=20;
- xuehuazu[i].m_w=20;
- }
- }
- void Createxuehua()
- {
- for (int i = 0; i<5; i++)
- {
- xuehuazu[i].m_x=(int)random(0, width);
- xuehuazu[i].m_y=0;
- xuehuazu[i].m_h=30;
- xuehuazu[i].m_w=30;
- }
- }
- void displayxiaxue()
- {
- for (int i = 0; i<5; i++){
- image(xuehua3, xuehuazu[i].m_x, xuehuazu[i].m_y, xuehuazu[i].m_w, xuehuazu[i].m_h);
- xuehuazu[i].m_y+=(int)random(0, 20);
- if ((int)random(0, 2)>0)
- {
- xuehuazu[i].m_x+=(int)random(0, 5);
- }
- else
- {
- xuehuazu[i].m_x-=(int)random(0, 5);
- }
- if (xuehuazu[i].m_y>height+10)
- {
- Createxuehua();
- }
- }
- }
- }
- public class weizhi
- {
-
- int m_x,m_y;
- int m_h,m_w;
- }
-
复制代码
游戏开始界面,本例程实际上是一个用Arduino做控制器的PC小游戏。
下面就是游戏开始界面的截图。
游戏中的截图。
在Arduino 端实际上就是通过发送0,1来代表A,B键,Arduino具体用什么方式是不限制的,之前做的是用红外遥控器。
不过貌似这种做法被江南大学教授评为工作量较低,哈哈,不要在意这些细节。
有通信协议,用什么不都能控制么。
那么这节课就先下课吧。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|