check other objects working now

This commit is contained in:
Wolfgang Hottgenroth 2024-03-02 19:15:11 +01:00
parent e73f486116
commit 202f86331b

View File

@ -17,6 +17,8 @@ uint8_t canvas[CANVAS_WIDTH][CANVAS_HEIGHT];
#define I_COLOR 2 #define I_COLOR 2
typedef enum {e_O, e_I} t_shape; typedef enum {e_O, e_I} t_shape;
typedef enum {e_Null, e_Down, e_Left, e_Right} t_direction;
typedef enum {e_12oClock, e_3oClock, e_6oClock, e_9oClock} t_rotation;
typedef struct { typedef struct {
t_shape shape; t_shape shape;
@ -29,11 +31,13 @@ typedef struct {
uint8_t x; uint8_t x;
uint8_t y; uint8_t y;
uint8_t rotation; // 0 = 12 o'clock, 1 = 3 o'clock, 2 = 6 o'clock, 3 = 9 o'clock t_rotation rotation;
uint8_t last_x; uint8_t last_x;
uint8_t last_y; uint8_t last_y;
uint8_t last_rotation; t_rotation last_rotation;
t_direction direction;
union { union {
uint8_t O[O_WIDTH][O_HEIGHT]; uint8_t O[O_WIDTH][O_HEIGHT];
@ -43,7 +47,6 @@ typedef struct {
t_object object; t_object object;
typedef enum {e_Down, e_Left, e_Right} t_direction;
void showCanvas() { void showCanvas() {
@ -69,11 +72,12 @@ void initObject(t_shape shape, uint8_t x, uint8_t y) {
object.shape = shape; object.shape = shape;
object.x = x; object.x = x;
object.y = y; object.y = y;
object.rotation = 0; object.rotation = e_12oClock;
object.last_x = 0; object.last_x = 0;
object.last_y = 0; object.last_y = 0;
object.last_rotation = 0; object.last_rotation = e_12oClock;
object.initial = 1; object.initial = 1;
object.direction = e_Null;
switch (shape) { switch (shape) {
case e_O: case e_O:
@ -96,7 +100,7 @@ void drawObject() {
switch (object.shape) { switch (object.shape) {
case e_O: case e_O:
switch (object.last_rotation) { switch (object.last_rotation) {
case 0: case e_12oClock:
canvas[object.last_x][object.last_y] = 0 | 0x80; canvas[object.last_x][object.last_y] = 0 | 0x80;
canvas[object.last_x][object.last_y+1] = 0 | 0x80; canvas[object.last_x][object.last_y+1] = 0 | 0x80;
canvas[object.last_x+1][object.last_y] = 0 | 0x80; canvas[object.last_x+1][object.last_y] = 0 | 0x80;
@ -106,7 +110,7 @@ void drawObject() {
break; break;
case e_I: case e_I:
switch (object.last_rotation) { switch (object.last_rotation) {
case 0: case e_12oClock:
canvas[object.last_x][object.last_y] = 0 | 0x80; canvas[object.last_x][object.last_y] = 0 | 0x80;
canvas[object.last_x][object.last_y+1] = 0 | 0x80; canvas[object.last_x][object.last_y+1] = 0 | 0x80;
canvas[object.last_x][object.last_y+2] = 0 | 0x80; canvas[object.last_x][object.last_y+2] = 0 | 0x80;
@ -120,7 +124,7 @@ void drawObject() {
switch (object.shape) { switch (object.shape) {
case e_O: case e_O:
switch (object.rotation) { switch (object.rotation) {
case 0: case e_12oClock:
canvas[object.x][object.y] = object.O[0][0] | 0x80; canvas[object.x][object.y] = object.O[0][0] | 0x80;
canvas[object.x][object.y+1] = object.O[0][1] | 0x80; canvas[object.x][object.y+1] = object.O[0][1] | 0x80;
canvas[object.x+1][object.y] = object.O[1][0] | 0x80; canvas[object.x+1][object.y] = object.O[1][0] | 0x80;
@ -130,7 +134,7 @@ void drawObject() {
break; break;
case e_I: case e_I:
switch (object.rotation) { switch (object.rotation) {
case 0: case e_12oClock:
canvas[object.x][object.y] = object.O[0][0] | 0x80; canvas[object.x][object.y] = object.O[0][0] | 0x80;
canvas[object.x][object.y+1] = object.O[0][1] | 0x80; canvas[object.x][object.y+1] = object.O[0][1] | 0x80;
canvas[object.x][object.y+2] = object.O[0][2] | 0x80; canvas[object.x][object.y+2] = object.O[0][2] | 0x80;
@ -148,6 +152,8 @@ void moveObject(t_direction direction) {
object.last_y = object.y; object.last_y = object.y;
object.last_rotation = object.rotation; object.last_rotation = object.rotation;
object.direction = direction;
switch (direction) { switch (direction) {
case e_Down: case e_Down:
object.y = object.y + 1; object.y = object.y + 1;
@ -158,6 +164,8 @@ void moveObject(t_direction direction) {
case e_Right: case e_Right:
object.x = object.x + 1; object.x = object.x + 1;
break; break;
default:
break;
} }
} }
@ -173,31 +181,49 @@ int checkCanvasBordersForObject() {
} }
int checkOtherObjectsTouchedForObject() { int checkOtherObjectsTouchedForObject() {
return 0;
// return true if another object is touched // return true if another object is touched
int res = 0; int res = 0;
// BROKEN! That doesn't work, pixels of the moving object would also be considered.
// The direction must be considered, only the first pixels in the moving direction
// must be checked.
switch (object.shape) { switch (object.shape) {
case e_O: case e_O:
switch (object.rotation) { switch (object.rotation) {
case 0: case e_12oClock:
res = (canvas[object.x][object.y] != 0) || switch (object.direction) {
(canvas[object.x][object.y+1] != 0) || case e_Down:
(canvas[object.x+1][object.y] != 0) || res = (canvas[object.x][object.y+1] != 0) ||
(canvas[object.x+1][object.y+1] != 0); (canvas[object.x+1][object.y+1] != 0);
break;
case e_Left:
res = (canvas[object.x][object.y] != 0) ||
(canvas[object.x][object.y+1] != 0);
break;
case e_Right:
res = (canvas[object.x+1][object.y] != 0) ||
(canvas[object.x+1][object.y+1] != 0);
break;
default:
break;
}
break; break;
} }
break; break;
case e_I: case e_I:
switch (object.rotation) { switch (object.rotation) {
case 0: case e_12oClock:
res = (canvas[object.x][object.y] != 0) || switch (object.direction) {
(canvas[object.x][object.y+1] != 0) || case e_Down:
(canvas[object.x][object.y+2] != 0) || res = (canvas[object.x][object.y+3] != 0);
(canvas[object.x][object.y+3] != 0); break;
case e_Left:
case e_Right:
res = (canvas[object.x][object.y] != 0) ||
(canvas[object.x][object.y+1] != 0) ||
(canvas[object.x][object.y+2] != 0) ||
(canvas[object.x][object.y+3] != 0);
break;
default:
break;
}
break; break;
} }
break; break;
@ -318,5 +344,7 @@ int main(int argc, char *argv[]) {
showCanvas(); showCanvas();
} }
showCanvas();
} }