update drawballs example

This commit is contained in:
Mr.Blinky 2021-05-09 02:06:14 +02:00 committed by GitHub
parent 5e9e431095
commit c933c2b804
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 289 additions and 187 deletions

View File

@ -1,11 +1,12 @@
/* *****************************************************************************
* Flash cart draw balls test v1.14 by Mr.Blinky May-Jun.2019 licenced under MIT
* FX draw balls test v1.15 by Mr.Blinky May 2019 May2021 licenced under MIT
* *****************************************************************************
*
* This test depend on file drawballs-test.bin being uploaded with the
* flash-writer Python script in the develop area using the following command:
* This test depend on the file fxdata.bin being uploaded to the external FX flash
* chip using the uploader-gui.py or flash-writer.py Python script in the
* development area. When using the flash writer script. Use the following command:
*
* python flash-writer.py -d drawballs-single-datafile.bin
* python flash-writer.py -d fxdata.bin
*
* This demo draws a moving background tilemap with a bunch of bouncing ball sprites around
*
@ -14,20 +15,20 @@
* A - increase the number of bounching balls up to MAX_BALLS
* B - decrease the number of balls down to zero
*
* D-Pad scroll the background
* D-Pad - scroll the background
*
*/
#include <Arduboy2.h>
#include <ArduboyFX.h>
#include "fxdata.h"
#include <ArduboyFX.h> // Required library for accessing the FX flash chip
#include "fxdata.h" // this file contains all the references to FX data
// Check out fxdata.txt to see how this is done.
#define FRAME_RATE 60
#define MAX_BALLS 55 // 55 Balls possible at 60fps 155 at 30fps
#define CIRCLE_POINTS 84
#define VISABLE_TILES_PER_COLUMN 5 // the maximum number of tiles visable horizontally
#define VISABLE_TILES_PER_ROW 9 // the maximum number of tiles visable vertically
#define VISABLE_TILES_PER_COLUMN 5 // the maximum number of tiles visable vertically
#define VISABLE_TILES_PER_ROW 9 // the maximum number of tiles visable horizontally
//datafile offsets
constexpr uint8_t ballWidth = 16;
@ -74,9 +75,9 @@ void setup() {
{
ball[i].x = random(113);
ball[i].y = random(49);
ball[i].xspeed = random(1,3);
ball[i].xspeed = 1;//random(1,3);
if (random(100) > 49) ball[i].xspeed = -ball[i].xspeed;
ball[i].yspeed = random(1,3);
ball[i].yspeed = 1; //random(1,3);
if (random(100) > 49) ball[i].yspeed = -ball[i].yspeed;
}
}
@ -84,9 +85,9 @@ void setup() {
uint8_t tilemapBuffer[VISABLE_TILES_PER_ROW]; // a small buffer to store one horizontal row of tiles from the tilemap
void loop() {
if (!arduboy.nextFrame()) return;
if (!arduboy.nextFrame()) return; // return until it's time to draw a new frame
arduboy.pollButtons();
arduboy.pollButtons(); // pollButtons required for the justPressed() function
if ((arduboy.justPressed(A_BUTTON) && ballsVisible < MAX_BALLS)) ballsVisible++; // Pressing A button increases the number of visible balls until the maximum has been reached
if ((arduboy.justPressed(B_BUTTON) && ballsVisible > 0)) ballsVisible--; // Pressing B reduces the number of visible balls until none are visible
if (arduboy.pressed(UP_BUTTON) && mapLocation.y > 16) mapLocation.y--; // Pressing directional buttons will scroll the tilemap
@ -100,7 +101,7 @@ void loop() {
//draw tilemap
for (int8_t y = 0; y < VISABLE_TILES_PER_COLUMN; y++)
{
FX::readDataArray(FX_DATA_TILEMAP, // read the visible tiles on a row from the tilemap in external flash
FX::readDataArray(FX_DATA_TILEMAP, // read the visible tiles on a horizontal row from the tilemap in external flash
y + camera.y / tileHeight, // the tilemap row
camera.x / tileWidth, // the column within tilemap row
tilemapWidth, // use the width of tilemap as array element size
@ -123,7 +124,8 @@ void loop() {
FX::drawBitmap(ball[i].x, // although this function is called drawBitmap it can also draw masked sprites
ball[i].y,
FX_DATA_BALLS, // the ball sprites masked bitmap offset in external flash memory
0, // the drawballs-singe-datafile.bin file only has a single sprite frame
0, // the fxdata was build using the single ball sprite.png image so there's only frame 0
//i % 16, // comment above and uncomment this one if the fxdata is rebuild using the ball_16x16.png image
dbmMasked /* | dbmReverse */ ); // remove the '/*' and '/*' to reverse the balls into white balls
//when uploading the drawballs-singe-datafile.bin into the development area,
@ -171,6 +173,6 @@ void loop() {
}
FX::enableOLED();// only enable OLED for updating the display
arduboy.display(CLEAR_BUFFER);
FX::disableOLED();// disable so flash cart can be used at any time
arduboy.display(CLEAR_BUFFER); // Using CLEAR_BUFFER will clear the display buffer after it is displayed
FX::disableOLED();// disable display again so external flash can be accessed at any time
}

View File

@ -1,11 +1,14 @@
#ifndef FXDATA_H
#define FXDATA_H
#pragma once
/**** FX data header generated by fx-data.py tool version 1.00 ****/
using uint24_t = __uint24;
constexpr uint16_t FX_DATA_PAGE = 0xFFFE; //value given by flashcart-writer.py script using -d option
constexpr uint24_t FX_DATA_TILES = 0x000000; // Background tiles offset in external flash
constexpr uint24_t FX_DATA_TILEMAP = 0x000044; // 16 x 16 tilemap offset in external flash
constexpr uint24_t FX_DATA_BALLS = 0x000144; // masked ball sprite offset in external flash
// Initialize FX hardware using FX::begin(FX_DATA_PAGE); in the setup() function.
#endif
constexpr uint16_t FX_DATA_PAGE = 0xfffe;
constexpr uint24_t FX_DATA_BYTES = 392;
constexpr uint24_t FX_DATA_TILES = 0x000000;
constexpr uint24_t FX_DATA_TILEMAP = 0x000044;
constexpr uint24_t FX_DATA_BALLS = 0x000144;

View File

@ -0,0 +1,97 @@
/*******************************************************************************
FX Data resource file.
********************************************************************************
Run this file through the fx-data.py Python script (drag and drop) to create
a c-style header file that can be included with your project.
a .bin file will also be created containing the actual resource data. This .bin
file can be uploaded to the FX flash chip using the uploader-gui.py Python
script (Use Upload Development data button).
The .bin file can also be uploaded to FX flash chip using the flash-writer.py
Python command line script using the -d switch.
Data types:
int8_t, uint8_t values will be stored as 8-bit bytes (unsigned char)
int16_t, uint16_t values will be stored as 16-bit (half)words (int)
int24_t,uint24_t values will be stored as 24-bit address that points to
a FX data resource
int32_t,uint32_t values will be stored as 32-bit long words
image_t a filename with a relative path to a .bmp or .png image file
raw_t a filename with a relative path to a raw file
to create a constant to point to a FX resource, a similar format as in C(++):
is used.
image_t FXlogo = "FX-logo.png";
image_t FxSprite = "FXSprite.png";
when data of the same format is used the data type may be ommited. The semicolon
may also be ommited in all cases.
image_t FXlogo = "FX-logo.png"
FxSprite = "FXSprite.png"
or even:
image_t FXlogo = "FX-logo.png", FxSprite = "FXSprite.png"
When specifying multiple data make sure they are seperated by at least a space
(comma is optional). A data array can be simplified. For examle:
uint8_t tilemap[] = {
0, 1, 2, 3, 4, 5, 6
};
can also be written simply as:
uint8_t tilemap = 0 1 2 3 4 5 6
data can be commented out using // for a single line or
using /* */ for a block comment
********************************************************************************
Draw balls demo example :
*******************************************************************************/
// Background tiles graphics
image_t FX_DATA_TILES = "assets/tiles_16x16.png"
// 16 x 16 tilemap
uint8_t FX_DATA_TILEMAP[] = {
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01,
0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01,
0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01
};
// masked ball sprite graphics
image_t FX_DATA_BALLS = "assets/ball.png"
//image_t FX_DATA_BALLS = "assets/ball_16x16.png"