Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new game: bird and cactus #1791

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,7 @@ list(APPEND SOURCE_FILES
displayapp/DisplayApp.cpp
displayapp/screens/Screen.cpp
displayapp/screens/Tile.cpp
displayapp/screens/Bird.cpp
displayapp/screens/InfiniPaint.cpp
displayapp/screens/Paddle.cpp
displayapp/screens/StopWatch.cpp
Expand All @@ -383,6 +384,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/ApplicationList.cpp
displayapp/screens/Notifications.cpp
displayapp/screens/Twos.cpp
displayapp/screens/Bird.cpp
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was added two times.

displayapp/screens/HeartRate.cpp
displayapp/screens/FlashLight.cpp
displayapp/screens/List.cpp
Expand Down
2 changes: 2 additions & 0 deletions src/displayapp/DisplayApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
#include "displayapp/screens/FirmwareUpdate.h"
#include "displayapp/screens/FirmwareValidation.h"
#include "displayapp/screens/InfiniPaint.h"
#include "displayapp/screens/Bird.h"
#include "displayapp/screens/Paddle.h"
#include "displayapp/screens/Bird.h"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate, see above.

#include "displayapp/screens/StopWatch.h"
#include "displayapp/screens/Metronome.h"
#include "displayapp/screens/Music.h"
Expand Down
1 change: 1 addition & 0 deletions src/displayapp/apps/Apps.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace Pinetime {
Paint,
Paddle,
Twos,
Bird,
HeartRate,
Navigation,
StopWatch,
Expand Down
1 change: 1 addition & 0 deletions src/displayapp/apps/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ else ()
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Paint")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Paddle")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Twos")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Bird")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Metronome")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Navigation")
#set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Weather")
Expand Down
2 changes: 1 addition & 1 deletion src/displayapp/fonts/fonts.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
{
"file": "FontAwesome5-Solid+Brands+Regular.woff",
"range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf743"
"range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf743, 0xf4ba"
}
],
"bpp": 1,
Expand Down
143 changes: 143 additions & 0 deletions src/displayapp/screens/Bird.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#include "displayapp/screens/Bird.h"
#include "displayapp/DisplayApp.h"
#include "displayapp/LittleVgl.h"
#include "displayapp/screens/Symbols.h"

#include <cstdlib> // for rand()

using namespace Pinetime::Applications::Screens;

Bird::Bird() {

lv_obj_t* background = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_size(background, LV_HOR_RES, LV_VER_RES);
lv_obj_set_style_local_radius(background, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
lv_obj_set_style_local_bg_color(background, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x2874a6));

cactus_top = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_size(cactus_top, CACTUS_WIDTH, CACTUS_HEIGHT);
lv_obj_set_style_local_bg_color(cactus_top, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_obj_set_style_local_border_color(cactus_top, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
lv_obj_set_style_local_border_width(cactus_top, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);

cactus_bottom = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_size(cactus_bottom, CACTUS_WIDTH, CACTUS_HEIGHT);
lv_obj_set_style_local_bg_color(cactus_bottom, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_obj_set_style_local_border_color(cactus_bottom, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
lv_obj_set_style_local_border_width(cactus_bottom, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);

MovePipe();

points = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(points, " ");
lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -10, 5);

info = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(info, "touch to start");
lv_obj_align(info, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 40);

bird = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(bird, Symbols::dove);
lv_obj_set_style_local_text_color(bird, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
lv_obj_set_pos(bird, BIRD_X, pos);

taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
}

Bird::~Bird() {
lv_task_del(taskRefresh);
lv_obj_clean(lv_scr_act());
}

void Bird::MovePipe() {
lv_obj_set_pos(cactus_top, cactus_x, -cactus_y_offset);
lv_obj_set_pos(cactus_bottom, cactus_x, CACTUS_HEIGHT + CACTUS_GAP - cactus_y_offset);
return;
}

void Bird::Refresh() {
if (is_stopped) {
return;
}

pos += accel / 6;

if (is_ascending) {
if (accel >= -18) {
accel -= 3;
}
} else {
if (accel <= 42) {
accel++;
Comment on lines +63 to +71
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as your other PR. I think adding variable names to the magic numbers would be a good idea.

}
}

// checks if it has hit the floor or ceiling
if (pos <= 1 || pos >= LV_VER_RES - BIRD_SIZE) {
GameOver();
return;
}

// checks if it has rammed into cacti
// BIRD_X-CACTUS_WIDTH to BIRD_X+BIRD_SIZE
if (90 < cactus_x && cactus_x < 130) {
Comment on lines +82 to +83
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make this more explicit with constexpr.

if (pos < CACTUS_HEIGHT - cactus_y_offset || pos > CACTUS_HEIGHT + CACTUS_GAP - BIRD_SIZE - cactus_y_offset) {
GameOver();
return;
}
}

lv_obj_set_pos(bird, BIRD_X, pos);

lv_label_set_text_fmt(points, "%04d", score / 10);
is_ascending = false;

score++;
if (cactus_x == 0) {
while (true) {
uint8_t new_offset = rand() % 5 * 40;
if (new_offset != cactus_y_offset) {
cactus_y_offset = new_offset;
break;
}
}
cactus_x = 240;
}
cactus_x--;
if (cactus_x % 4 == 0) {
MovePipe();
}
}

void Bird::GameOver() {
is_stopped = true;
lv_label_set_text_static(info, "Game Over");
lv_obj_align(info, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 40);
lv_obj_set_style_local_text_color(bird, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
return;
}

bool Bird::OnTouchEvent(Pinetime::Applications::TouchEvents /*event*/) {
if (is_stopped) {
if (pos != 120) {
pos = 120;
lv_label_set_text_static(info, "Touch to Start");
lv_obj_align(info, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 40);
lv_obj_set_style_local_text_color(bird, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
return true;
}
// reset
cactus_x = 240;
accel = 0;
score = 0;
is_stopped = false;
lv_label_set_text_static(info, "");
}
is_ascending = true;
return true;
}

bool Bird::OnTouchEvent(uint16_t /*x*/, uint16_t /*y*/) {
is_ascending = true;
return true;
}
63 changes: 63 additions & 0 deletions src/displayapp/screens/Bird.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#pragma once

#include <lvgl/lvgl.h>
#include <cstdint>
#include "displayapp/screens/Screen.h"
#include "Symbols.h"
#include "systemtask/SystemTask.h"

#define BIRD_X 110
#define BIRD_SIZE 20
#define CACTUS_HEIGHT 160
#define CACTUS_WIDTH 30
#define CACTUS_GAP 80
Comment on lines +9 to +13
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use constexpr instead of the preprocessor.


namespace Pinetime {
namespace Components {
class LittleVgl;
}

namespace Applications {
namespace Screens {

class Bird : public Screen {
public:
Bird();
~Bird() override;

void Refresh() override;

bool OnTouchEvent(TouchEvents event) override;
bool OnTouchEvent(uint16_t x, uint16_t y) override;

private:
void GameOver();
void MovePipe();

bool is_stopped = true;
bool is_ascending = false;

uint8_t cactus_x = 240;
uint8_t cactus_y_offset = 40;

int8_t accel = 0;
uint8_t pos = 120;
uint16_t score = 0;

lv_obj_t *info, *points, *bird, *cactus_top, *cactus_bottom;

lv_task_t* taskRefresh;
};
}

template <>
struct AppTraits<Apps::Bird> {
static constexpr Apps app = Apps::Bird;
static constexpr const char* icon = Screens::Symbols::dove;

static Screens::Screen* Create(AppControllers& /*controllers*/) {
return new Screens::Bird();
};
};
}
}
1 change: 1 addition & 0 deletions src/displayapp/screens/Symbols.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace Pinetime {
static constexpr const char* paintbrush = "\xEF\x87\xBC";
static constexpr const char* paddle = "\xEF\x91\x9D";
static constexpr const char* map = "\xEF\x96\xa0";
static constexpr const char* dove = "\xEF\x92\xBA";
static constexpr const char* phone = "\xEF\x82\x95";
static constexpr const char* phoneSlash = "\xEF\x8F\x9D";
static constexpr const char* volumMute = "\xEF\x9A\xA9";
Expand Down