-
-
Notifications
You must be signed in to change notification settings - Fork 978
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,6 +21,7 @@ namespace Pinetime { | |
Paint, | ||
Paddle, | ||
Twos, | ||
Bird, | ||
HeartRate, | ||
Navigation, | ||
StopWatch, | ||
|
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Make this more explicit with |
||
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; | ||
} |
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use |
||
|
||
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(); | ||
}; | ||
}; | ||
} | ||
} |
There was a problem hiding this comment.
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.