通过Arduino Uno开发板进行带控制的游戏开发

首先,我将简要描述该项目的目的。我想提出一些简单直观的方法来演示Arduino Uno板与PC通过串行连接的通信。符合“周末”项目规定的内容是:它在几个小时内完成,并且易于编码。

决定创建具有以下规则的游戏。该动作发生在工作的二维平面上。位置由球员控制的“英雄”球试图避免与“对手”球发生碰撞。英雄球仅沿横坐标轴移动,对手出现在工作平面上的任意位置,并沿纵坐标轴直线移动。如果“英雄”球与“对手”发生碰撞,则计分计数器的值将增加,否则计分器将被重置并且较早累积的点将被“消耗掉”。

步骤1


编程语言的选择。之所以选择处理,是因为基于Arduino板的编程语言是基于处理的,所以处理也是创建图片,动画效果等的好工具。是的,它也是免费的。

第2步


建立一个自制的“操纵杆”。一切都是微不足道的。操纵杆的作用是由连接在Arduino Uno板上+ 5V电源和GND地之间的常规电位计发挥的。中间引脚连接到模拟引脚“ A0”。



当然,如果您愿意,可以使用模拟摇杆,触摸板等。本质是相同的。

第三步


Arduino开发板编程。在该项目中,需要Arduino开发板来连续发送有关电位计滑块位置的数据。随后,通过处理“挑选”计算机上的该数据以满足游戏的需求(确定“英雄”球的坐标)。

Arduino Uno开发板代码
int potPin = 0;//   ,     
// 
void setup() {
Serial.begin(9600);// serial      
}
void loop() {
 int val = map (analogRead(potPin), 0, 1023, 0, 640);//    
//     Arduino     0  1023.
//  map      0  640. 
// ,        
//  Processing   
 Serial.println(val);//       
 delay(50);//   50 
}


第四步


实际上,是游戏本身的编写。如前所述,游戏是用处理语言编写的您可以在网站上下载分发工具包,也有使用示例。就我而言,“引擎”由49行代码组成,其中一半是注释。我想说的,理解它并不困难。您可以独立更改英雄的“皮肤”,增加对手的数量,在游戏中引入奖励,从电位计中消除数据的嘎嘎声,等等。

处理游戏代码
import processing.serial.*;//I/O library
Serial port;
PShape bot; //       
PFont font; //   
int radiusOfHero=100, radiusOfEnemy, speedOfEnemy=1, Counter=0;
float positionOfHeroX=100.0, positionOfEnemyY = 0.0 ,positionOfEnemyX=0.0;
void setup()
{
  size(640, 400);//   
  port = new Serial(this, "COM4", 9600);//     COM  
//  4 
  port.bufferUntil('\n');
  bot = loadShape("2.svg");//  ,      Processing
  font = loadFont("AgencyFB-Bold-200.vlw");//    
  textFont(font,200);
}
void draw() {
    background(0);
    fill(255);
    text(Counter, 30,175);//        (30; 175)
//===============definiton of hero position=============
fill(0, 102, 153);
ellipse(positionOfHeroX, height-radiusOfHero/2, radiusOfHero, radiusOfHero);// 
// -
//===============definition of enemy===============
fill(255,0,0);
radiusOfEnemy=round(random(60));{
    for(int i = 0; i < height; i++) 
      positionOfEnemyY=positionOfEnemyY+0.02*speedOfEnemy;//   -   
      ellipse(positionOfEnemyX, positionOfEnemyY, radiusOfEnemy*2, radiusOfEnemy*2); }//  -
if (positionOfEnemyY>height) {
positionOfEnemyY=0.0;
positionOfEnemyX = round(random(width)); //     -
Counter++;}
//==============clash==========================
if (abs(positionOfHeroX-positionOfEnemyX) < (radiusOfHero+radiusOfEnemy)/2 & 
   (abs(height-radiusOfHero/2)-positionOfEnemyY) < (radiusOfHero+radiusOfEnemy)/2){//   -
background(255,0,0);
shape(bot, positionOfHeroX-radiusOfHero/2,height-radiusOfHero, 100, 100);  
Counter=-1;
fill(255);
textFont(font,150);
text("TURN AWAY!", 0,height/2);
}
}
void serialEvent (Serial port) {
positionOfHeroX=round(float(port.readStringUntil('\n')));//    -   COM4
}


第5步


游戏演示
视频


Source: https://habr.com/ru/post/zh-CN384479/


All Articles