第四章 arduboy游戏编程之Arduboy2库介绍

第四章 arduboy游戏编程之Arduboy2库介绍

Arduboy 为开发者提供了一套能够自己编写游戏的库,在进行 arduboy 游戏编程之前,都需要在Arduino IDE 中安装该库,下面就对所安装的 Arduboy2 库进行说明。

Arduboy2 库源码链接

Arduboy2

Arduboy2 库函数文档说明

这里提供一份 Arduboy2 库相关的说明文档,该文档使用 doxygen 生成可以下载下来直接用浏览器打开查看。
Arduboy2库函数说明文档

绘图函数

//绘制空心圆
void drawCircle (int16_t x0, int16_t y0, uint8_t r, uint8_t color=WHITE);
void fillCircle (int16_t x0, int16_t y0, uint8_t r, uint8_t color=WHITE);
// 绘制线
void drawLine (int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint8_t color=WHITE);
// 绘制垂直线
void drawFastVLine (int16_t x, int16_t y, uint8_t h, uint8_t color=WHITE);
// 绘制水平线
void drawFastHLine (int16_t x, int16_t y, uint8_t w, uint8_t color=WHITE);
// 绘制矩形
void drawRect (int16_t x, int16_t y, uint8_t w, uint8_t h, uint8_t color=WHITE);
// 绘制填充矩形
void fillRect (int16_t x, int16_t y, uint8_t w, uint8_t h, uint8_t color=WHITE);
// 填充屏幕
void fillScreen(uint8_t color = WHITE);
// 绘制圆角矩形
void drawRoundRect(int16_t x,int16_t y,uint8_t w,uint8_t h,uint8_t r,uint8_t color = WHITE);
// 绘制圆角填充矩形
void fillRoundRect(int16_t x,int16_t y,uint8_t w,uint8_t h,uint8_t r,uint8_t color = WHITE);
// 绘制三角形 (x0,y0) (x1,y1) (x2,y2) 为三角形的三个角的坐标
void drawTriangle(int16_t x0,int16_t y0,int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint8_t color = WHITE);
// 绘制填充三角形
void fillTriangle(int16_t x0,int16_t y0,int16_t x1,int16_t y1,int16_t x2,int16_t y2,uint8_t color = WHITE);
// 绘制点
void drawPixel(int16_t x,int16_t y,uint8_t color = WHITE);

绘图函数测试

#include <Arduboy2.h>
Arduboy2 arduboy;
void setup() {
  arduboy.begin();
  arduboy.setFrameRate(15);
}

void loop() {
  if (!(arduboy.nextFrame()))
    return;
  arduboy.clear();
  // (positions start at 0, 0)
  arduboy.setCursor(4, 5);
  // then we print to screen what is in the Quotation marks ""
  arduboy.print(F("Hello, world!"));
  arduboy.drawCircle(50,20,5,WHITE);
  arduboy.drawCircle(80,20,5,WHITE);
  arduboy.drawLine(0,40,127,40,WHITE);
  arduboy.fillRect(65,32,2,6,WHITE);
  arduboy.drawRect(55,50,20,3,WHITE);
  arduboy.display();
}

arduboy-draw

按键相关函数

Arduboy 上面一共提供了 6个按键,分别为 上、下、左、右、A、B,可以利用这六个按键作为输入进行游戏控制,下面介绍一下这六个按键控制相关的库函数及宏。

按键相关宏

// 上
UP_BUTTON
// 下
DOWN_BUTTON
// 左
LEFT_BUTTON
// 右
RIGHT_BUTTON

// A
A_BUTTON
// B
B_BUTTON

按键相关库函数

// 检测按键是否按下
bool 	pressed (uint8_t buttons);
bool 	anyPressed (uint8_t buttons);
//检测按键是否未按下
bool 	notPressed (uint8_t buttons);
// 轮询按钮并跟踪状态
void 	pollButtons ();
// 检测按键是否刚刚按下
bool 	justPressed (uint8_t button);
// 检测按键是否刚刚释放
bool 	justReleased (uint8_t button);
// 检测所有按键的当前状态并返回位掩码
static uint8_t 	buttonsState ();

测试代码

#include <Arduboy2.h>
Arduboy2 arduboy;
int counter;
void setup() {
  arduboy.begin();
  arduboy.clear();
  counter = 0;
}
void loop() {
  arduboy.clear();
  if( arduboy.pressed(UP_BUTTON) ) {
    counter = counter + 1;
  }
  if( arduboy.pressed(DOWN_BUTTON) ) {
    counter = counter - 1;
  }
  if(arduboy.pressed(LEFT_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("LEFT!");
  }
  if(arduboy.pressed(RIGHT_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("RIGHT!");
  }
 if(arduboy.pressed(A_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("A BUTTON TEST!");
  }
   if(arduboy.pressed(B_BUTTON))
  {
    arduboy.setCursor(30, 40);
    arduboy.print("B BUTTON TEST!");
  }
  if( counter > 36 ) {
    
    arduboy.setCursor(30, 30);
    arduboy.print("Yay!");
  }
  arduboy.setCursor(0, 0);
  arduboy.print(counter);
  arduboy.display();
}

arduboy-button-test

RGB-LED相关函数

arduboy 硬件带有一颗RGB-LED ,可以用这颗led灯珠来指示当前游戏的进度和状态。

控制rgb-led函数

// RGB LED 模拟控制 可以调整LED的亮度值
static void 	setRGBled (uint8_t red, uint8_t green, uint8_t blue);
static void 	setRGBled (uint8_t color, uint8_t val);
// 释放 RGB LED 模拟控制
static void 	freeRGBled ();
// RGB LED 数字控制 只能开关 RGB LED
static void 	digitalWriteRGB (uint8_t red, uint8_t green, uint8_t blue);
static void 	digitalWriteRGB (uint8_t color, uint8_t val);

测试代码

这里使用模拟器测试 RGB-LED 的代码好像有点问题,在模拟器上面有一些测试的不太准,不过RGB-LED 灯还是有的,可以在模拟器上面运行下面的代码进行测试。

#include <Arduboy2.h>
Arduboy2 arduboy;
int counter;
void setup() {
  arduboy.begin();
  arduboy.clear();
  counter = 0;
 
  
}
void loop() {
  arduboy.clear();
  if( arduboy.pressed(UP_BUTTON) ) {
    counter = counter + 1;
  }
  if( arduboy.pressed(DOWN_BUTTON) ) {
    counter = counter - 1;
  }
  if(arduboy.pressed(LEFT_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("LEFT!");
  }
  if(arduboy.pressed(RIGHT_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("RIGHT!");
  }
 if(arduboy.pressed(A_BUTTON))
  {
    arduboy.setCursor(30, 40);
     arduboy.print("A BUTTON TEST!");
    //arduboy.freeRGBled();
    //arduboy.digitalWriteRGB(RGB_OFF,RGB_ON,RGB_ON);
  }
   if(arduboy.pressed(B_BUTTON))
  {
    arduboy.setCursor(30, 40);
    arduboy.print("B BUTTON TEST!");
  }
  if( counter > 36 ) {
    
    arduboy.setCursor(30, 30);
    arduboy.print("RGB-LED TEST");
    arduboy.freeRGBled();
    arduboy.digitalWriteRGB(RGB_ON,RGB_ON,RGB_ON);
  }
  else
  {
    arduboy.freeRGBled();
    arduboy.digitalWriteRGB(RGB_OFF,RGB_ON,RGB_OFF);
  }
  arduboy.setCursor(0, 0);
  arduboy.print(counter);
  arduboy.display();
}

rgbled1
rgbled2

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这里提供一个基于Arduino和MAX7219四合一点阵模块的频谱显示代码,可以实现从麦克风输入的音频信号的频谱分析并在点阵模块上显示出来。代码如下: ``` c++ #include <MD_MAX72xx.h> #include <MD_Parola.h> #include <MD_Arduboy.h> #include <FFT.h> #define NUM_ROWS 8 // 点阵行数 #define NUM_COLS 32 // 点阵列数 #define DATA_PIN 11 // 数据引脚 #define CLK_PIN 13 // 时钟引脚 #define CS_PIN 10 // 片选引脚 MD_MAX72XX mx = MD_MAX72XX(DATA_PIN, CLK_PIN, CS_PIN, 4); // 初始化点阵模块 MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, 4); // 初始化Parola #define SAMPLES 128 // 采样点数 #define LOG_SAMPLES 7 // 采样点数的对数 #define SAMPLE_RATE 8000 // 采样率 byte spectrum[NUM_COLS]; // 频谱数据 byte peak[NUM_COLS]; // 峰值数据 byte prev_spectrum[NUM_COLS]; // 上一帧的频谱数据 byte prev_peak[NUM_COLS]; // 上一帧的峰值数据 FFT fft = FFT(); // 初始化FFT void setup() { mx.begin(); // 初始化点阵模块 P.begin(); // 初始化Parola P.setInvert(false); // 设置不反转显示 P.setIntensity(2); // 设置亮度 P.displayClear(); // 清空显示 } void loop() { // 读取音频信号并进行FFT分析 int signal[SAMPLES]; for (int i = 0; i < SAMPLES; i++) { signal[i] = analogRead(A0) - 512; // 读取麦克风信号并去除直流分量 delayMicroseconds(1000000 / SAMPLE_RATE); } fft.Windowing(signal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); fft.Compute(signal, SAMPLES, FFT_FORWARD); fft.ComplexToMagnitude(signal, SAMPLES); // 更新频谱数据 for (int i = 0; i < NUM_COLS; i++) { int start = pow(2, i * LOG_SAMPLES / NUM_COLS); int end = pow(2, (i + 1) * LOG_SAMPLES / NUM_COLS) - 1; float sum = 0; for (int j = start; j <= end; j++) { sum += signal[j]; } spectrum[NUM_COLS - 1 - i] = sum / (end - start + 1); // 更新峰值数据 if (spectrum[NUM_COLS - 1 - i] > peak[NUM_COLS - 1 - i]) { peak[NUM_COLS - 1 - i] = spectrum[NUM_COLS - 1 - i]; } else if (peak[NUM_COLS - 1 - i] > 0) { peak[NUM_COLS - 1 - i]--; } } // 绘制频谱图 for (int i = 0; i < NUM_COLS; i++) { for (int j = 0; j < NUM_ROWS; j++) { if (spectrum[i] > (NUM_ROWS - j - 1) * 32) { mx.setPoint(i, j, true); } else { mx.setPoint(i, j, false); } } } // 绘制峰值图 for (int i = 0; i < NUM_COLS; i++) { for (int j = 0; j < NUM_ROWS; j++) { if (peak[i] > (NUM_ROWS - j - 1) * 32) { if (prev_peak[i] > peak[i]) { mx.setPoint(i, j, true); } } else { if (prev_spectrum[i] > spectrum[i]) { mx.setPoint(i, j, false); } } } } // 保存上一帧的数据 memcpy(prev_spectrum, spectrum, NUM_COLS); memcpy(prev_peak, peak, NUM_COLS); // 点阵模块显示 mx.flush(); // 清空显示 P.displayClear(); delay(1000); } ``` 代码中使用了FFT对采样的音频信号进行频谱分析,并将分析结果显示在点阵模块上。具体实现过程如下: 1. 在`setup()`函数中初始化点阵模块和Parola。 2. 在`loop()`函数中读取麦克风信号,并进行FFT分析,得到频谱数据。 3. 更新频谱数据,并根据频谱数据更新峰值数据。 4. 绘制频谱图和峰值图,并保存上一帧的数据。 5. 点阵模块显示。 6. 清空Parola显示,等待1秒。 需要注意的是,这个代码只是一个简单的示例,可能存在一些问题,比如频谱数据的计算方法、峰值数据的更新策略等。如果需要更加精确和稳定的频谱分析结果,需要对代码进行优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘雪冰峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值