通过Arduino Uno开发板进行控制处理的游戏开发,第2部分

介绍


上一篇文章中,我们研究了创建最简单的一维游戏-“避免冲突”的示例。凭借这样的能力,ShG显然不辜负它的名字。实际上,它实际上是逃避球,听起来并不骄傲。那么,为什么不扩展“游戏玩法”的功能并为游戏增加交互性呢?
首先,建议将游戏的动作转移到飞机上。将胜利条件引入游戏-一个帐户,达到该帐户后,将显示您珍惜的“您赢了”珍惜的玩家。向ShG发出和平主义者的枪,以获取更快的积分并与ShP交互,如果可能的话,将项目的视觉设计更改为更具吸引力的设计。
实际上,作为下一个“周末”项目的一部分,我解决了这些问题。发生了什么,继续读下去。

步骤1“开发任务”


-ShG必须具有2个自由度。
-SHG能够通过击中最后一个特殊光束来快速得分并降低筒仓的移动速度。
-实施新规则-游戏最高可玩1000点。为了简单避免碰撞,将获得1分。对于每50 * 10 ^ -3 s的光束+1点保持光束(在Arduino程序中设置为50 ms的延迟)

步骤2“连接模拟摇杆的说明”


该棒有5个用于连接的引脚:VCC引脚连接至+ 5V电源,GND-接地至Arduino Uno板上的地线,X-连接至模拟输入A0,Y-连接至A1,D-连接至数字输入D2。

步骤3“通过串行连接传输多个坐标”


操纵杆位置上的数据一起传输,以确保尽可能快地进行处理,而不会造成时间延迟。要描述模拟摇杆的当前位置,足够使用7位XXXYYYB-X坐标为3位,Y坐标为3位,控制摇杆上的按钮为1位。我附上下面的代码:
Arduino Uno开发板代码
#include <stdio.h>
int xPin = A0, yPin = A1, buttonPin = 2;
int xPosition = 0, yPosition = 0, buttonState = 0;
char strbuf[20]; //
void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);
  //activate pull-up resistor on the push-button pin
  pinMode(buttonPin, INPUT_PULLUP);   }
void loop() {
  xPosition = map(analogRead(xPin),0,1023,0,639);
  yPosition = map(analogRead(yPin),0,1023,0,639);
  buttonState = digitalRead(buttonPin);
  sprintf(strbuf,"%03d%03d%1d",xPosition,yPosition,buttonState);
  Serial.println(strbuf); 
  delay(50); }// add some delay between reads

连接棒和Arduino Uno固件后,您可以在串行端口监视器中看到类似以下的内容。

这是我们定义的格式的操纵杆状态向量。顺便说一下,有时工件会“滑移”-退化2 3位的向量。极不愉快的现象。因此,Processing上的游戏崩溃了。也许这是由于我的棍子板上的缺陷造成的,也许不是由于我的缺陷。无论如何,我都没有尝试在Arduino级别处理工件。为此,游戏代码中提供了特殊条件进行处理(请参阅步骤4)。它的任务是验证通过串行连接传输的数据的完整性。

步骤4:“编码游戏”


我不会在代码上详细评论。我试图使其易于理解。评估是否可以在扰流板之下。为了以防万一,我给出了一个变量表:
SH的radiusOfHero半径;
radiusOfEnemy-筒仓的半径;
radiusOfBullet-子弹半径;生产的SHG;
计数器-点计数器;
speedOfEnemy-与筒仓的下降速度成正比的系数;
DeltaPositionOfHeroX-从摇杆获得的SH沿X轴的位置增量;
positionOfHeroX1-SH沿X轴移动的最终坐标(在读取时钟的末尾);
positionOfHeroX0-沿X轴的初始坐标(在小节的起点);
DeltapositionHeroY,positionOfHeroY1,positionOfHeroY0-沿Y轴相同;
strbuf是读取从Arduino Uno传输的模拟摇杆的状态指示的行。
处理游戏代码
import processing.serial.*;//I/O library
Serial port;
PShape bot;
PFont font;
PImage img;
int radiusOfHero=100, radiusOfEnemy, radiusOfBullet=5, Counter=0, Fire;
float speedOfEnemy=1, DeltaPositionOfHeroX, positionOfHeroX1, positionOfHeroX0=640.0,
DeltapositionOfHeroY, positionOfHeroY1, positionOfHeroY0=640.0,
positionOfEnemyY = 0.0 ,positionOfEnemyX=0.0, positionOfBulletX=0.0,positionOfBulletY=0.0;
String strbuf="3223220";
void setup()
{
  size(640, 640);
  port = new Serial(this, "COM4", 9600);
  port.bufferUntil('\n');
  bot = loadShape("2.svg");
  font = loadFont("AgencyFB-Bold-200.vlw");
  img = loadImage("img.png");  // Load the image into the program  
  textFont(font,200);
}
void draw() {
    background(0);
    image(img, 0, 0);
    fill(255);
    text(Counter, 400,170);
//==========definiton of hero==========
fill(0, 200, 102);
positionOfHeroX1=positionOfHeroX0+(0.05*(DeltaPositionOfHeroX-width/2));
if (positionOfHeroX1<0){positionOfHeroX1=0.0;}
if (positionOfHeroX1>width){positionOfHeroX1=width;}
positionOfHeroY1=positionOfHeroY0+(0.05*(DeltapositionOfHeroY-height/2));
if (positionOfHeroY1<0){positionOfHeroY1=0.0;}
if (positionOfHeroY1>height){positionOfHeroY1=height;}
ellipse(positionOfHeroX1, positionOfHeroY1, radiusOfHero, radiusOfHero);
positionOfHeroX0=positionOfHeroX1;
positionOfHeroY0=positionOfHeroY1;
fill(244);
       positionOfBulletY= positionOfHeroY1-radiusOfHero/2;
      if (Fire==0){
            for(int i = 0; i < (positionOfHeroY1); i++){
                      positionOfBulletX = positionOfHeroX1; 
                      positionOfBulletY= positionOfBulletY-height/100;
                      ellipse(positionOfBulletX, positionOfBulletY, radiusOfBullet, radiusOfBullet);           }
                       }
//===============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++;}
//==========definition of counter==========        
        if (Counter>1000){
        text("YOU WON!", 50,height/2);
}
//==========clash==========
if (abs(positionOfHeroX1-positionOfEnemyX) < (radiusOfHero+radiusOfEnemy)/2 & 
   (abs(positionOfHeroY1-positionOfEnemyY) < (radiusOfHero+radiusOfEnemy)/2)){
background(255,0,0);
shape(bot, positionOfHeroX1-radiusOfHero/2,positionOfHeroY1-radiusOfHero, 100, 100);  
Counter=-1;
fill(255);
textFont(font,150);
text("TURN AWAY!", 0,height/2);}
//==========Checking of target hit==========
    if (((abs(positionOfBulletX-positionOfEnemyX) < (radiusOfBullet+radiusOfEnemy)/2))& (Fire==0))
      {speedOfEnemy=0.05;// decreasing of enemy speed
      Counter++;}
    else speedOfEnemy=0.2;}
   
void serialEvent (Serial port) {
  if(port.available()>0){
   strbuf=port.readStringUntil('\n'); 
if (strbuf.length()<7) {//condition to prevent artefacts
strbuf="3223220";
  }
DeltaPositionOfHeroX=float(strbuf.substring(0, 3)); 
DeltapositionOfHeroY=float(strbuf.substring(3, 6)); 
Fire=int(strbuf.substring(6, 7));
}
}

第5步“演示”



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


All Articles