mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[python/turtle] color and pencolor can take various arguments
These two methods are equal.
This commit is contained in:
@@ -120,8 +120,39 @@ mp_obj_t modturtle_isdown() {
|
||||
return sTurtle.isPenDown() ? mp_const_true : mp_const_false;
|
||||
}
|
||||
|
||||
mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b) {
|
||||
sTurtle.setColor(KDColor::RGB888(mp_obj_get_int(r), mp_obj_get_int(g), mp_obj_get_int(b)));
|
||||
mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args) {
|
||||
if (n_args == 0) {
|
||||
// pencolor()
|
||||
KDColor c = sTurtle.color();
|
||||
mp_obj_t mp_col[3];
|
||||
mp_col[0] = mp_obj_new_int_from_uint(c.red());
|
||||
mp_col[1] = mp_obj_new_int_from_uint(c.green());
|
||||
mp_col[2] = mp_obj_new_int_from_uint(c.blue());
|
||||
return mp_obj_new_tuple(3, mp_col);
|
||||
}
|
||||
if (n_args == 1) {
|
||||
if (MP_OBJ_IS_STR(args[0])) {
|
||||
// pencolor("blue")
|
||||
size_t l;
|
||||
sTurtle.setColor(mp_obj_str_get_data(args[0], &l));
|
||||
} else {
|
||||
// pencolor((r, g, b))
|
||||
mp_obj_t * rgb;
|
||||
mp_obj_get_array_fixed_n(args[0], 3, &rgb);
|
||||
sTurtle.setColor(
|
||||
KDColor::RGB888(
|
||||
mp_obj_get_int(rgb[0]),
|
||||
mp_obj_get_int(rgb[1]),
|
||||
mp_obj_get_int(rgb[2])));
|
||||
}
|
||||
} else if (n_args == 3) {
|
||||
// pencolor(r, g, b)
|
||||
sTurtle.setColor(
|
||||
KDColor::RGB888(
|
||||
mp_obj_get_int(args[0]),
|
||||
mp_obj_get_int(args[1]),
|
||||
mp_obj_get_int(args[2])));
|
||||
}
|
||||
return mp_const_none;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ mp_obj_t modturtle_isdown();
|
||||
mp_obj_t modturtle_pensize(size_t n_args, const mp_obj_t *args);
|
||||
mp_obj_t modturtle_isvisible();
|
||||
|
||||
mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b);
|
||||
mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args);
|
||||
|
||||
mp_obj_t modturtle_showturtle();
|
||||
mp_obj_t modturtle_hideturtle();
|
||||
|
||||
@@ -19,7 +19,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_penup_obj, modturtle_penup);
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_isdown_obj, modturtle_isdown);
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pensize_obj, 0, 1, modturtle_pensize);
|
||||
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(modturtle_color_obj, modturtle_color);
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pencolor_obj, 0, 3, modturtle_pencolor);
|
||||
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_showturtle_obj, modturtle_showturtle);
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_hideturtle_obj, modturtle_hideturtle);
|
||||
@@ -64,7 +64,8 @@ STATIC const mp_rom_map_elem_t modturtle_module_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_pensize), (mp_obj_t)&modturtle_pensize_obj },
|
||||
{ MP_ROM_QSTR(MP_QSTR_width), (mp_obj_t)&modturtle_pensize_obj },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_color_obj },
|
||||
{ MP_ROM_QSTR(MP_QSTR_color), (mp_obj_t)&modturtle_pencolor_obj },
|
||||
{ MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_pencolor_obj },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_showturtle), (mp_obj_t)&modturtle_showturtle_obj },
|
||||
{ MP_ROM_QSTR(MP_QSTR_st), (mp_obj_t)&modturtle_showturtle_obj },
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "turtle.h"
|
||||
#include <escher/palette.h>
|
||||
extern "C" {
|
||||
#include <py/misc.h>
|
||||
}
|
||||
@@ -144,6 +145,32 @@ void Turtle::setVisible(bool visible) {
|
||||
}
|
||||
}
|
||||
|
||||
void Turtle::setColor(const char * color) {
|
||||
if (strcmp("blue", color) == 0) {
|
||||
m_color = KDColorBlue;
|
||||
} else if (strcmp("red", color) == 0) {
|
||||
m_color = KDColorRed;
|
||||
} else if (strcmp("green", color) == 0) {
|
||||
m_color = Palette::Green;
|
||||
} else if (strcmp("yellow", color) == 0) {
|
||||
m_color = KDColorYellow;
|
||||
} else if (strcmp("brown", color) == 0) {
|
||||
m_color = Palette::Brown;
|
||||
} else if (strcmp("black", color) == 0) {
|
||||
m_color = KDColorBlack;
|
||||
} else if (strcmp("white", color) == 0) {
|
||||
m_color = KDColorWhite;
|
||||
} else if (strcmp("pink", color) == 0) {
|
||||
m_color = Palette::Pink;
|
||||
} else if (strcmp("orange", color) == 0) {
|
||||
m_color = Palette::Orange;
|
||||
} else if (strcmp("purple", color) == 0) {
|
||||
m_color = Palette::Purple;
|
||||
} else if (strcmp("grey", color) == 0) {
|
||||
m_color = Palette::GreyDark;
|
||||
}
|
||||
}
|
||||
|
||||
// Private functions
|
||||
|
||||
void Turtle::setHeadingPrivate(mp_float_t angle) {
|
||||
|
||||
@@ -63,10 +63,14 @@ public:
|
||||
bool isVisible() const { return m_visible; }
|
||||
void setVisible(bool visible);
|
||||
|
||||
KDColor color() const { return m_color; }
|
||||
void setColor(KDColor c) {
|
||||
m_color = c;
|
||||
}
|
||||
|
||||
void setColor(uint8_t r, uint8_t g, uint8_t b) {
|
||||
m_color = KDColor::RGB888(r, g, b);
|
||||
}
|
||||
void setColor(const char * color);
|
||||
private:
|
||||
static constexpr mp_float_t k_headingOffset = M_PI_2;
|
||||
static constexpr mp_float_t k_headingScale = M_PI / 180;
|
||||
|
||||
Reference in New Issue
Block a user