From 24539d46819f3b95c926b74e37accb4bece739ad Mon Sep 17 00:00:00 2001 From: caternuson Date: Wed, 11 Dec 2019 16:10:14 -0800 Subject: [PATCH] add dreidel code --- TFT_Gizmo_Dreidel/dreidel.py | 68 +++++++++++++++++++++++ TFT_Gizmo_Dreidel/dreidel_background.bmp | Bin 0 -> 58746 bytes TFT_Gizmo_Dreidel/dreidel_sheet.bmp | Bin 0 -> 7346 bytes 3 files changed, 68 insertions(+) create mode 100644 TFT_Gizmo_Dreidel/dreidel.py create mode 100644 TFT_Gizmo_Dreidel/dreidel_background.bmp create mode 100644 TFT_Gizmo_Dreidel/dreidel_sheet.bmp diff --git a/TFT_Gizmo_Dreidel/dreidel.py b/TFT_Gizmo_Dreidel/dreidel.py new file mode 100644 index 000000000..66bafcebf --- /dev/null +++ b/TFT_Gizmo_Dreidel/dreidel.py @@ -0,0 +1,68 @@ +import time +import random +import board +import displayio +import adafruit_imageload +from adafruit_circuitplayground.bluefruit import cpb +from adafruit_gizmo import tft_gizmo + +# define melody to play while spinning (freq, duration) +melody = ( +# oh drei del drei del + (330, 8), (392, 8), (330, 8), (392, 8), (330, 8), +# drei del I made it + (392, 8), (330, 16), (330, 8), (392, 8), (392, 8), +# out of clay + (349, 8), (330, 8), (294, 16), (0, 8), +# oh drei del drei del + (294, 8), (349, 8), (294, 8), (349, 8), (294, 8), +# drei del then drei del + (349, 8), (294, 16), (294, 8), (392, 8), (349, 8), +# I shall play + (330, 8), (294, 8), (262, 16), +) +melody_tempo = 0.02 + +# setup TFT Gizmo and main display group (splash) +display = tft_gizmo.TFT_Gizmo() +splash = displayio.Group() +display.show(splash) + +# load dreidel background image +dreidel_bmp, dreidel_pal = adafruit_imageload.load("/dreidel_background.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette) +dreidel_tg = displayio.TileGrid(dreidel_bmp, pixel_shader=dreidel_pal) +splash.append(dreidel_tg) + +# load dreidel symbols (sprite sheet) +symbols_bmp, symbols_pal = adafruit_imageload.load("/dreidel_sheet.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette) +for index, color in enumerate(symbols_pal): + if color == 0xFFFF01: + symbols_pal.make_transparent(index) +symbols_tg = displayio.TileGrid(symbols_bmp, pixel_shader=symbols_pal, + width = 1, + height = 1, + tile_width = 60, + tile_height = 60) +symbols_group = displayio.Group(scale=2, x=60, y=70) +symbols_group.append(symbols_tg) +splash.append(symbols_group) + +# dreidel time! +tile = 0 +while True: + # wait for shake + while not cpb.shake(): + pass + # play melody while "spinning" the symbols + for note, duration in melody: + symbols_tg[0] = tile % 4 + tile += 1 + cpb.play_tone(note, duration * melody_tempo) + # land on a random symbol + symbols_tg[0] = random.randint(0, 3) + # prevent immediate re-shake + time.sleep(2) diff --git a/TFT_Gizmo_Dreidel/dreidel_background.bmp b/TFT_Gizmo_Dreidel/dreidel_background.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6ae7429c0e8f9440f2d2099b41cb994e7fa10cbb GIT binary patch literal 58746 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 p`bp2F^cnwIi13F&h*uzSjzf$&+jde61d z0Q2i`*v@YoxrFBLpPF?6DZ($({PVH3{*oiiN>zzpe*YSO>%1AO8>3L^FJkqQ>{bzln)=Hf^8GAeb@5ueu&nB?XB9oo**J<-1<~7J zapqKg4U~W2jIDudCh(ZvW|8elJzv01MPI<8L~F*Z=*!r#Xddoo{GCObDH^cmC5T;A zw3eAhAJ0duLwNx^R$i0%*5NhFt%=LeG|#4cY`{XJZyigUY~C&}Yu7GiQ43vjEHj&$ zv-_LvFBO&)+ua~mk6K#b&|F#ZP4-TkkxRCrPY_SHzh)v(5MA{LWVYTI8A=op~EX_tykyru^d#sb*tQ2JHuA~SvHPDnW zb-3C1qEM`8uw42TG$fZNrtyr zHKs9W-0cq7Y8T>*U9zQb@VQ;GIRm9$499NIYK%(IFe}&T<*Y6utR}23(C0`Ibc&PQ zm!)r5UstHWY{FKwoClRky{@h(Fq_a0E4n;13v9E+NwTG1;mcSQR>#Wm?(3PAPu1ye zKxcGHr_uADD$TNWUhW}6w9i(9 zC0A$9E;0=^7+N;GyQhw2)8!4ivAd*+ypVFQbgp2FwQxPFN=Gd3u+)Z{UxHoLaXkr; zaJ6glW}};8RavtMabRT0mZelw6>2hv2mxo*_$VJhEYi$Am}e~FjFMeR@R6X#1P>~X zN!gof10la)Zp9$Wd9mflLDZG7RY^jYqC=0m81iy5LB9OkdK$rg%Tr=qr7Wj#yeYHv Z5j&MNJtvMkx`DbMabvtw($O#Z;2U6qJ$3*9 literal 0 HcmV?d00001