InfiniTime/src/displayapp/screens/Paddle.cpp
Reinhold Gschweicher 7cd4929bfd Paddle: compare ballX coordinate with horizontal resolution
Fix the comment as the comparison checks if the ball is at the right
side of the screen.

Compare the x coordinate of the ball with the horizontal resolution of
the screen, instead of the vertical resolution. On the PinePhone this
does make no difference as we have square 240x240 screen. Change it
anyways to be completely correct.
2021-10-11 21:46:19 +02:00

83 lines
2.9 KiB
C++

#include "Paddle.h"
#include "../DisplayApp.h"
#include "../LittleVgl.h"
using namespace Pinetime::Applications::Screens;
Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
background = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_size(background, LV_HOR_RES + 1, LV_VER_RES);
lv_obj_set_pos(background, -1, 0);
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_BLACK);
lv_obj_set_style_local_border_color(background, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_obj_set_style_local_border_width(background, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);
points = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(points, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
lv_label_set_text(points, "0000");
lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 10);
paddle = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_bg_color(paddle, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_obj_set_style_local_radius(paddle, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
lv_obj_set_size(paddle, 4, 60);
ball = lv_obj_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_bg_color(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_obj_set_style_local_radius(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
lv_obj_set_size(ball, ballSize, ballSize);
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
}
Paddle::~Paddle() {
lv_task_del(taskRefresh);
lv_obj_clean(lv_scr_act());
}
void Paddle::Refresh() {
ballX += dx;
ballY += dy;
lv_obj_set_pos(ball, ballX, ballY);
// checks if it has touched the sides (floor and ceiling)
if (ballY <= 1 || ballY >= LV_VER_RES - ballSize - 2) {
dy *= -1;
}
// checks if it has touched the side (right side)
if (ballX >= LV_HOR_RES - ballSize - 1) {
dx *= -1;
}
// checks if it is in the position of the paddle
if (dx < 0 && ballX <= 4) {
if (ballX >= -ballSize / 4) {
if (ballY <= (paddlePos + 30 - ballSize / 4) && ballY >= (paddlePos - 30 - ballSize + ballSize / 4)) {
dx *= -1;
score++;
}
}
// checks if it has gone behind the paddle
else if (ballX <= -ballSize * 2) {
ballX = (LV_HOR_RES - ballSize) / 2;
ballY = (LV_VER_RES - ballSize) / 2;
score = 0;
}
}
lv_label_set_text_fmt(points, "%04d", score);
}
bool Paddle::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
return true;
}
bool Paddle::OnTouchEvent(uint16_t x, uint16_t y) {
// sets the center paddle pos. (30px offset) with the the y_coordinate of the finger
lv_obj_set_pos(paddle, 0, y - 30);
paddlePos = y;
return true;
}