Droplets/src/graphics/sprite.cpp

126 lines
2.4 KiB
C++

#include "sprite.h"
Sprite::Sprite(int m_width, int m_height) {
width = m_width;
height = m_height;
sprite = new bool*[width];
for (int w = 0; w < width; w++) {
sprite[w] = new bool[height];
for (int h = 0; h < height; h++) {
sprite[w][h] = false;
}
}
}
Sprite::~Sprite() {
for (int w = 0; w < width; w++) {
delete[] sprite[w];
}
delete[] sprite;
}
void Sprite::AddPixel(int x, int y, bool on) {
sprite[x][height-y-1] = on;
}
void Sprite::AddLine(int x1,
int y1,
int x2,
int y2,
bool on) {
uint8_t deltaX = abs(x2 - x1);
uint8_t deltaY = abs(y2 - y1);
int8_t signX = ((x1 < x2) ? 1 : -1);
int8_t signY = ((y1 < y2) ? 1 : -1);
int16_t error = deltaX - deltaY;
int16_t error2;
AddPixel(x2, y2, on);
while((x1 != x2) || (y1 != y2)) {
AddPixel(x1, y1, on);
error2 = error * 2;
if(error2 > -deltaY) {
error -= deltaY;
x1 += signX;
}
if(error2 < deltaX) {
error += deltaX;
y1 += signY;
}
}
}
int Sprite::GetHeight() {
return height;
}
int Sprite::GetWidth() {
return width;
}
void Sprite::Draw(DaisyPatch* patch, int x, int y) {
for (int w = 0; w < width; w++) {
for (int h = 0; h < height; h++) {
patch->display.DrawPixel(x+w, y+h,
sprite[GetShiftArrayX(w)]
[GetShiftArrayY(height-h)]);
}
}
}
void Sprite::DrawTile(DaisyPatch* patch,
int x1,
int y1,
int x2,
int y2) {
int x_min = std::min(x1, x2);
int x_max = std::max(x1, x2);
int y_min = std::min(y1, y2);
int y_max = std::max(y1, y2);
int x, y;
for (int w = x_min; w < x_max; w++) {
for (int h = y_min; h < y_max; h++) {
x = GetShiftArrayX((w-x_min) % width);
y = GetShiftArrayY((h-y_min) % height);
patch->display.DrawPixel(w, h, sprite[x][y]);
}
}
}
bool** Sprite::GetSprite() {
return sprite;
}
void Sprite::SetBlank() {
for (int w = 0; w < width; w++) {
for (int h = 0; h < height; h++) {
sprite[w][h] = false;
}
}
}
void Sprite::SetXShift(int x) {
x_shift = x;
}
void Sprite::SetYShift(int y) {
y_shift = y;
}
void Sprite::AdjustXShift(int x) {
x_shift -= x;
}
void Sprite::AdjustYShift(int y) {
y_shift += y;
}
int Sprite::GetShiftArrayX(int pos) {
return GetShiftArray(pos, x_shift, width);
}
int Sprite::GetShiftArrayY(int pos) {
return GetShiftArray(pos, y_shift, height);
}