91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Circuit Playground Bluefruit和TFT Gizmo創(chuàng)建數(shù)字版本的雪球

454398 ? 來源:網(wǎng)絡整理 ? 作者:網(wǎng)絡整理 ? 2019-12-03 09:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

啊,經(jīng)典的雪球。那個充滿神秘液體的透明球體,某種鱗片狀的材料,通常是一個描繪某個場景的西洋鏡。搖一搖,看著雪落。

在本指南中,我們將向您展示如何使用Circuit Playground Bluefruit和TFT Gizmo創(chuàng)建數(shù)字版本的雪球。我們將在TFT上顯示可自定義的雪花玻璃球。您將能夠設置自定義背景,創(chuàng)建自定義雪花,當然還可以搖晃以清除雪球并重新開始。

所有代碼均由CircuitPython編寫。

讓我們開始吧。

由于內(nèi)存限制,該項目只能在

Circuit Playground Bluefruit-低功耗藍牙

產(chǎn)品ID:4333

電路游樂場Bluefruit是我們在電路游樂場系列中的第三塊板,朝著完美介紹電子學和編程邁出了一步。我們已經(jīng)。..。..

缺貨

缺貨

電路游樂場TFT Gizmo-螺栓固定顯示器+音頻放大器

產(chǎn)品ID:4367

擴展并用TFT Gizmo上的螺栓擴展Circuit Playground項目,使您以堅固可靠的方式添加漂亮的彩色顯示屏。該PCB看起來像一個圓形。..

缺貨

缺貨

DIY裝飾套件-直徑6厘米-非常適合電路游樂場

產(chǎn)品ID:4036

您是否忍受了主流的,低調(diào)的,低技術含量的樹木裝飾品?這個季節(jié)為什么不用冬青樹的代碼裝飾大廳呢?這個DIY裝飾品。..

$ 1.95

有貨

添加到購物車

工作原理

雪球球主要由三個部分組成:

背景圖片

薄片

地面上的雪

像這樣的東西:

讓我們談談每個。

背景

這很簡單。它只是圖像或純色。除了坐在那里,實際上沒有什么可做的。因此,除了加載和顯示它之外,沒有更多的代碼與之相關。

我們將只執(zhí)行此處描述的內(nèi)容,然后再將其保留。

薄片

這些是掉下來的漂亮的小雪花天空。我們將使用小的位圖來賦予它們形狀。我們還將允許幾種不同的下降速度,因此它們的下降速度并不相同。要做的另一件事是檢查它們是否已經(jīng)降落到地面上—當前的雪水平。

要真正使薄片運動,只需更改y它們關聯(lián)的TileGrid的值。這是CircuitPython displayio的功能。有關更多信息,請參見此處和此處。因此,基本上,每個薄片將是一個單獨的TileGrid,我們將更改每個薄片的y值以使其掉落。

這是地面上的雪。剛開始時,地面上沒有積雪。當薄片落下并撞擊地面時,會在薄片撞擊的整個區(qū)域中增加積雪。因此,隨著越來越多的薄片落下,該級別將增加。

我們將使用displayio位圖表示積雪。位圖大小將與屏幕大小相同。它將開始為空-完全透明。要“添加雪”,我們只需將單個像素設置為雪的顏色。

簡單的Snow Globe

讓我們從簡單的snowglobe版本開始。此版本不需要任何其他位圖文件。您可以根據(jù)需要設置背景圖像。但是,如果您沒有一個,只是想啟動并運行,就不要管它,它將使用純色。

下面是代碼:

下載:項目Zip 或 snowglobe_simple.py | 在Github上查看

復制代碼

from random import randrange

import board

import busio

import displayio

from adafruit_gizmo import tft_gizmo

import adafruit_imageload

import adafruit_lis3dh

#---| User Config |---------------

BACKGROUND = 0xAA0000 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

# Accelerometer setup

accelo_i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

accelo = adafruit_lis3dh.LIS3DH_I2C(accelo_i2c, address=0x19)

# Create the TFT Gizmo display

display = tft_gizmo.TFT_Gizmo()

# Load background image

try:

bg_bitmap, bg_palette = adafruit_imageload.load(BACKGROUND,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

# Or just use solid color

except (OSError, TypeError):

BACKGROUND = BACKGROUND if isinstance(BACKGROUND, int) else 0x000000

bg_bitmap = displayio.Bitmap(display.width, display.height, 1)

bg_palette = displayio.Palette(1)

bg_palette[0] = BACKGROUND

background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette)

# Shared palette for snow bitmaps

palette = displayio.Palette(2)

palette[0] = 0xADAF00 # transparent color

palette[1] = SNOW_COLOR # snow color

palette.make_transparent(0)

# Snowflake setup

FLAKES = (

0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,

0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

flake_sheet = displayio.Bitmap(12, 4, len(palette))

for i, value in enumerate(FLAKES):

flake_sheet[i] = value

flake_pos = [0.0] * NUM_FLAKES

flakes = displayio.Group(max_size=NUM_FLAKES)

for _ in range(NUM_FLAKES):

flakes.append(displayio.TileGrid(flake_sheet, pixel_shader=palette,

width = 1,

height = 1,

tile_width = 4,

tile_height = 4 ) )

# Snowfield setup

snow_depth = [display.height] * display.width

snow_bmp = displayio.Bitmap(display.width, display.height, len(palette))

snow = displayio.TileGrid(snow_bmp, pixel_shader=palette)

# Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash)

def clear_the_snow():

#pylint: disable=global-statement, redefined-outer-name

global flakes, flake_pos, snow_depth

display.auto_refresh = False

for flake in flakes:

# set to a random sprite

flake[0] = randrange(0, 3)

# set to a random x location

flake.x = randrange(0, display.width)

# set random y locations, off screen to start

flake_pos = [-1.0*randrange(0, display.height) for _ in range(NUM_FLAKES)]

# reset snow level

snow_depth = [display.height] * display.width

# and snow bitmap

for i in range(display.width * display.height):

snow_bmp[i] = 0

display.auto_refresh = True

def add_snow(index, amount, steepness=2):

location = []

# local steepness check

for x in range(index - amount, index + amount):

add = False

if x == 0:

# check depth to right

if snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

elif x == display.width - 1:

# check depth to left

if snow_depth[x-1] - snow_depth[x] 《 steepness:

add = True

elif 0 《 x 《 display.width - 1:

# check depth to left AND right

if snow_depth[x-1] - snow_depth[x] 《 steepness and

snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

if add:

location.append(x)

# add where snow is not too steep

for x in location:

new_level = snow_depth[x] - 1

if new_level 》= 0:

snow_depth[x] = new_level

snow_bmp[x, new_level] = 1

while True:

clear_the_snow()

# loop until globe is full of snow

while snow_depth.count(0) 《 display.width:

# check for shake

if accelo.shake(SHAKE_THRESHOLD, 5, 0):

break

# update snowflakes

for i, flake in enumerate(flakes):

# speed based on sprite index

flake_pos[i] += 1 - flake[0] / 3

# check if snowflake has hit the ground

if int(flake_pos[i]) 》= snow_depth[flake.x]:

# add snow where it fell

add_snow(flake.x, flake[0] + 2)

# reset flake to top

flake_pos[i] = 0

# at a new x location

flake.x = randrange(0, display.width)

flake.y = int(flake_pos[i])

display.refresh()

from random import randrange

import board

import busio

import displayio

from adafruit_gizmo import tft_gizmo

import adafruit_imageload

import adafruit_lis3dh

#---| User Config |---------------

BACKGROUND = 0xAA0000 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

# Accelerometer setup

accelo_i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

accelo = adafruit_lis3dh.LIS3DH_I2C(accelo_i2c, address=0x19)

# Create the TFT Gizmo display

display = tft_gizmo.TFT_Gizmo()

# Load background image

try:

bg_bitmap, bg_palette = adafruit_imageload.load(BACKGROUND,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

# Or just use solid color

except (OSError, TypeError):

BACKGROUND = BACKGROUND if isinstance(BACKGROUND, int) else 0x000000

bg_bitmap = displayio.Bitmap(display.width, display.height, 1)

bg_palette = displayio.Palette(1)

bg_palette[0] = BACKGROUND

background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette)

# Shared palette for snow bitmaps

palette = displayio.Palette(2)

palette[0] = 0xADAF00 # transparent color

palette[1] = SNOW_COLOR # snow color

palette.make_transparent(0)

# Snowflake setup

FLAKES = (

0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,

0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

flake_sheet = displayio.Bitmap(12, 4, len(palette))

for i, value in enumerate(FLAKES):

flake_sheet[i] = value

flake_pos = [0.0] * NUM_FLAKES

flakes = displayio.Group(max_size=NUM_FLAKES)

for _ in range(NUM_FLAKES):

flakes.append(displayio.TileGrid(flake_sheet, pixel_shader=palette,

width = 1,

height = 1,

tile_width = 4,

tile_height = 4 ) )

# Snowfield setup

snow_depth = [display.height] * display.width

snow_bmp = displayio.Bitmap(display.width, display.height, len(palette))

snow = displayio.TileGrid(snow_bmp, pixel_shader=palette)

# Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash)

def clear_the_snow():

#pylint: disable=global-statement, redefined-outer-name

global flakes, flake_pos, snow_depth

display.auto_refresh = False

for flake in flakes:

# set to a random sprite

flake[0] = randrange(0, 3)

# set to a random x location

flake.x = randrange(0, display.width)

# set random y locations, off screen to start

flake_pos = [-1.0*randrange(0, display.height) for _ in range(NUM_FLAKES)]

# reset snow level

snow_depth = [display.height] * display.width

# and snow bitmap

for i in range(display.width * display.height):

snow_bmp[i] = 0

display.auto_refresh = True

def add_snow(index, amount, steepness=2):

location = []

# local steepness check

for x in range(index - amount, index + amount):

add = False

if x == 0:

# check depth to right

if snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

elif x == display.width - 1:

# check depth to left

if snow_depth[x-1] - snow_depth[x] 《 steepness:

add = True

elif 0 《 x 《 display.width - 1:

# check depth to left AND right

if snow_depth[x-1] - snow_depth[x] 《 steepness and

snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

if add:

location.append(x)

# add where snow is not too steep

for x in location:

new_level = snow_depth[x] - 1

if new_level 》= 0:

snow_depth[x] = new_level

snow_bmp[x, new_level] = 1

while True:

clear_the_snow()

# loop until globe is full of snow

while snow_depth.count(0) 《 display.width:

# check for shake

if accelo.shake(SHAKE_THRESHOLD, 5, 0):

break

# update snowflakes

for i, flake in enumerate(flakes):

# speed based on sprite index

flake_pos[i] += 1 - flake[0] / 3

# check if snowflake has hit the ground

if int(flake_pos[i]) 》= snow_depth[flake.x]:

# add snow where it fell

add_snow(flake.x, flake[0] + 2)

# reset flake to top

flake_pos[i] = 0

# at a new x location

flake.x = randrange(0, display.width)

flake.y = int(flake_pos[i])

display.refresh()

您可以自定義的功能分組在代碼的頂部:

下載:文件

復制代碼

#---| User Config |---------------

BACKGROUND = 0xAA0000 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |--------------- #---| User Config |---------------

BACKGROUND = 0xAA0000 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

代碼注釋描述了它們的作用。以下是摘要:

BACKGROUND-背景顏色 OR 圖像文件名

NUM_FLAKES-總數(shù)薄片顯示

SNOW_COLOR-雪的顏色

SHAKE_THRESHOLD-清晰可見的振動

現(xiàn)在,只需繼續(xù)嘗試使用默認值按原樣運行即可。您應該在紅色背景上得到一些漂亮的白雪。

更改顏色

現(xiàn)在嘗試更改BACKGROUND和SNOW_COLOR值。將這些行更改為以下內(nèi)容:

下載:文件

復制代碼

BACKGROUND = 0x00FF00 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFF00FF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive BACKGROUND = 0x00FF00 # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

SNOW_COLOR = 0xFF00FF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

嘿!黃雪!

更改背景

如果您為BACKGROUND指定位圖文件而不是顏色,則將加載并使用該文件。對于TFT Gizmo,文件必須是大小為240x240的索引BMP文件。您可以使用以下示例進行嘗試:

blinka_dark.bmp

下載該文件并將其復制到您的 CIRCUITPY 夾。然后將背景設置行更改為:

下載:文件

復制代碼

BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file

,然后將雪色更改回白色:

下載:文件

復制代碼

SNOW_COLOR = 0xFFFFFF # snow color SNOW_COLOR = 0xFFFFFF # snow color

運行該程序,最后應該使雪落在Blinka背景上。

更改薄片 》

您可以進行少量的薄片形狀定制。接下來,我們將提供更高級的代碼版本,使您真正做到這一點。但是,如果您愿意,可以使用以下代碼行:

下載:文件

復制代碼

FLAKES = (

0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,

0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

) FLAKES = (

0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,

0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1,

看看如何有3個單獨的4x4網(wǎng)格?這些是鱗片,每個鱗片寬4像素,高4像素。 0最終是透明的。 1最終為雪色。因此,如果您想更改薄片形狀,則可以對其進行編輯。但是只有4x4像素可以使用,因此自定義設置非常簡單。

搖晃清除

別忘了還要嘗試搖動木板以“清除”積雪球。這將清除所有積雪,并將所有雪花重置回頂部。繼續(xù)-像寶麗來一樣搖動它!

奇特的雪花玻璃球

好的,讓我們開始喜歡那些雪花。如此處所討論的,允許自定義薄片是創(chuàng)建“ sprite薄板”來容納薄片形狀的完美用法。

這是以要求您實際創(chuàng)建此sprite薄板為代價的。您還需要修改幾行代碼以提供有關Sprite Sheet布局的一些信息。但是有了此功能,再加上可設置的背景圖像,您可以真正自定義雪球了。我們將提供一些示例來幫助您入門。

這是雪花玻璃球代碼的漂亮版本:

下載:Project Zip 或 snowglobe_fancy.py | 查看Github

復制代碼

from random import randrange

import board

import busio

import displayio

from adafruit_gizmo import tft_gizmo

import adafruit_imageload

import adafruit_lis3dh

#---| User Config |---------------

BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

FLAKE_SHEET = “/flakes_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

# Accelerometer setup

accelo_i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

accelo = adafruit_lis3dh.LIS3DH_I2C(accelo_i2c, address=0x19)

# Create the TFT Gizmo display

display = tft_gizmo.TFT_Gizmo()

# Load background image

try:

bg_bitmap, bg_palette = adafruit_imageload.load(BACKGROUND,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

# Or just use solid color

except (OSError, TypeError):

BACKGROUND = BACKGROUND if isinstance(BACKGROUND, int) else 0x000000

bg_bitmap = displayio.Bitmap(display.width, display.height, 1)

bg_palette = displayio.Palette(1)

bg_palette[0] = BACKGROUND

background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette)

# Snowflake setup

flake_bitmap, flake_palette = adafruit_imageload.load(FLAKE_SHEET,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

if FLAKE_TRAN_COLOR is not None:

for i, color in enumerate(flake_palette):

if color == FLAKE_TRAN_COLOR:

flake_palette.make_transparent(i)

break

NUM_SPRITES = flake_bitmap.width // FLAKE_WIDTH * flake_bitmap.height // FLAKE_HEIGHT

flake_pos = [0.0] * NUM_FLAKES

flakes = displayio.Group(max_size=NUM_FLAKES)

for _ in range(NUM_FLAKES):

flakes.append(displayio.TileGrid(flake_bitmap, pixel_shader=flake_palette,

width = 1,

height = 1,

tile_width = FLAKE_WIDTH,

tile_height = FLAKE_HEIGHT,

x = randrange(0, display.width),

default_tile=randrange(0, NUM_SPRITES)))

# Snowfield setup

snow_depth = [display.height] * display.width

snow_palette = displayio.Palette(2)

snow_palette[0] = 0xADAF00 # transparent color

snow_palette[1] = SNOW_COLOR # snow color

snow_palette.make_transparent(0)

snow_bitmap = displayio.Bitmap(display.width, display.height, len(snow_palette))

snow = displayio.TileGrid(snow_bitmap, pixel_shader=snow_palette)

# Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash)

def clear_the_snow():

#pylint: disable=global-statement, redefined-outer-name

global flakes, flake_pos, snow_depth

display.auto_refresh = False

for flake in flakes:

# set to a random sprite

flake[0] = randrange(0, NUM_SPRITES)

# set to a random x location

flake.x = randrange(0, display.width)

# set random y locations, off screen to start

flake_pos = [-1.0*randrange(0, display.height) for _ in range(NUM_FLAKES)]

# reset snow level

snow_depth = [display.height] * display.width

# and snow bitmap

for i in range(display.width*display.height):

snow_bitmap[i] = 0

display.auto_refresh = True

def add_snow(index, amount, steepness=2):

location = []

# local steepness check

for x in range(index - amount, index + amount):

add = False

if x == 0:

# check depth to right

if snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

elif x == display.width - 1:

# check depth to left

if snow_depth[x-1] - snow_depth[x] 《 steepness:

add = True

elif 0 《 x 《 display.width - 1:

# check depth to left AND right

if snow_depth[x-1] - snow_depth[x] 《 steepness and

snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

if add:

location.append(x)

# add where snow is not too steep

for x in location:

new_level = snow_depth[x] - 1

if new_level 》= 0:

snow_depth[x] = new_level

snow_bitmap[x, new_level] = 1

while True:

clear_the_snow()

# loop until globe is full of snow

while snow_depth.count(0) 《 display.width:

# check for shake

if accelo.shake(SHAKE_THRESHOLD, 5, 0):

break

# update snowflakes

for i, flake in enumerate(flakes):

# speed based on sprite index

flake_pos[i] += 1 - flake[0] / NUM_SPRITES

# check if snowflake has hit the ground

if flake_pos[i] 》= snow_depth[flake.x]:

# add snow where it fell

add_snow(flake.x, FLAKE_WIDTH)

# reset flake to top

flake_pos[i] = 0

# at a new x location

flake.x = randrange(0, display.width)

flake.y = int(flake_pos[i])

display.refresh()

from random import randrange

import board

import busio

import displayio

from adafruit_gizmo import tft_gizmo

import adafruit_imageload

import adafruit_lis3dh

#---| User Config |---------------

BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

FLAKE_SHEET = “/flakes_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

# Accelerometer setup

accelo_i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)

accelo = adafruit_lis3dh.LIS3DH_I2C(accelo_i2c, address=0x19)

# Create the TFT Gizmo display

display = tft_gizmo.TFT_Gizmo()

# Load background image

try:

bg_bitmap, bg_palette = adafruit_imageload.load(BACKGROUND,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

# Or just use solid color

except (OSError, TypeError):

BACKGROUND = BACKGROUND if isinstance(BACKGROUND, int) else 0x000000

bg_bitmap = displayio.Bitmap(display.width, display.height, 1)

bg_palette = displayio.Palette(1)

bg_palette[0] = BACKGROUND

background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette)

# Snowflake setup

flake_bitmap, flake_palette = adafruit_imageload.load(FLAKE_SHEET,

bitmap=displayio.Bitmap,

palette=displayio.Palette)

if FLAKE_TRAN_COLOR is not None:

for i, color in enumerate(flake_palette):

if color == FLAKE_TRAN_COLOR:

flake_palette.make_transparent(i)

break

NUM_SPRITES = flake_bitmap.width // FLAKE_WIDTH * flake_bitmap.height // FLAKE_HEIGHT

flake_pos = [0.0] * NUM_FLAKES

flakes = displayio.Group(max_size=NUM_FLAKES)

for _ in range(NUM_FLAKES):

flakes.append(displayio.TileGrid(flake_bitmap, pixel_shader=flake_palette,

width = 1,

height = 1,

tile_width = FLAKE_WIDTH,

tile_height = FLAKE_HEIGHT,

x = randrange(0, display.width),

default_tile=randrange(0, NUM_SPRITES)))

# Snowfield setup

snow_depth = [display.height] * display.width

snow_palette = displayio.Palette(2)

snow_palette[0] = 0xADAF00 # transparent color

snow_palette[1] = SNOW_COLOR # snow color

snow_palette.make_transparent(0)

snow_bitmap = displayio.Bitmap(display.width, display.height, len(snow_palette))

snow = displayio.TileGrid(snow_bitmap, pixel_shader=snow_palette)

# Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash)

def clear_the_snow():

#pylint: disable=global-statement, redefined-outer-name

global flakes, flake_pos, snow_depth

display.auto_refresh = False

for flake in flakes:

# set to a random sprite

flake[0] = randrange(0, NUM_SPRITES)

# set to a random x location

flake.x = randrange(0, display.width)

# set random y locations, off screen to start

flake_pos = [-1.0*randrange(0, display.height) for _ in range(NUM_FLAKES)]

# reset snow level

snow_depth = [display.height] * display.width

# and snow bitmap

for i in range(display.width*display.height):

snow_bitmap[i] = 0

display.auto_refresh = True

def add_snow(index, amount, steepness=2):

location = []

# local steepness check

for x in range(index - amount, index + amount):

add = False

if x == 0:

# check depth to right

if snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

elif x == display.width - 1:

# check depth to left

if snow_depth[x-1] - snow_depth[x] 《 steepness:

add = True

elif 0 《 x 《 display.width - 1:

# check depth to left AND right

if snow_depth[x-1] - snow_depth[x] 《 steepness and

snow_depth[x+1] - snow_depth[x] 《 steepness:

add = True

if add:

location.append(x)

# add where snow is not too steep

for x in location:

new_level = snow_depth[x] - 1

if new_level 》= 0:

snow_depth[x] = new_level

snow_bitmap[x, new_level] = 1

while True:

clear_the_snow()

# loop until globe is full of snow

while snow_depth.count(0) 《 display.width:

# check for shake

if accelo.shake(SHAKE_THRESHOLD, 5, 0):

break

# update snowflakes

for i, flake in enumerate(flakes):

# speed based on sprite index

flake_pos[i] += 1 - flake[0] / NUM_SPRITES

# check if snowflake has hit the ground

if flake_pos[i] 》= snow_depth[flake.x]:

# add snow where it fell

add_snow(flake.x, FLAKE_WIDTH)

# reset flake to top

flake_pos[i] = 0

# at a new x location

flake.x = randrange(0, display.width)

flake.y = int(flake_pos[i])

display.refresh()

如您所見,定制部分中還有更多項目:

下載:文件

復制代碼

#---| User Config |---------------

BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

FLAKE_SHEET = “/flakes_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |--------------- #---| User Config |---------------

BACKGROUND = “/blinka_dark.bmp” # specify color or background BMP file

NUM_FLAKES = 50 # total number of snowflakes

FLAKE_SHEET = “/flakes_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFFFFFF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

其中大多數(shù)與上一節(jié)中的簡單版本相同。新的用于指定片狀Sprite表。它們是:

FLAKE_SHEET-包含片狀精靈的BMP文件

FLAKE_WIDTH-每個精靈的寬度

FLAKE_HEIGHT-每個精靈的高度

FLAKE_TRAN_COLOR-用作透明度的顏色

FLAKE_TRAN_COLOR,最好在創(chuàng)建精靈表位圖時選擇簡單的內(nèi)容。不要使用薄片本身中的一種顏色,因為那樣以后就不會顯示出來。

最容易混淆的兩種顏色是FLAKE_WIDTH和FLAKE_HEIGHT。您可以將它們視為每個薄片的寬度和高度。每個薄片的這些應該相同。這不是薄片的總寬度和高度,而是精靈本身。有關更深入的討論,請參見此處和此處。

背景圖片

首先,代碼將重用指南上一部分中的背景圖片。從那里的鏈接下載。確保在 CIRCUITPY 文件夾中保存文件 blinka_dark.bmp 。

簡單的Snowglobe Redux

讓我們從簡單地重新創(chuàng)建與上一節(jié)相同的薄片開始,但是這次使用sprite片。這是文件:

flakes_sheet.bmp

下載該文件并將其復制到您的 CIRCUITPY 文件夾中。

如果在圖像查看器中將其打開,則由于體積太小,您將看不到太多內(nèi)容。但放大后,它看起來像這樣:

已添加邊框和網(wǎng)格以供參考。它們不是實際文件的一部分。您可以看到如何有3種不同的4x4位圖。我們需要告訴代碼,這是這些行的作用:

下載:file

復制代碼

FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height FLAKE_WIDTH = 4 # sprite width

FLAKE_HEIGHT = 4 # sprite height

帶有背景( blinka_dark.bmp )和片狀精靈工作表( flake_sheet.bmp )文件復制到您的 CIRCUITPY 文件夾中,您可以嘗試運行上面的代碼。您應該獲得與以前相同的效果-帶有簡單白色雪花的Blinka背景。

現(xiàn)在讓我們嘗試一些不同的事情。

誰觀看。..烏賊?

此示例更好地顯示了如何自定義雪花玻璃球。嗯我們還能從天上掉下來。魷魚呢?當然。并且背景與參考相匹配。抓取這兩個文件:

watchmen_bg.bmp

squid_sheet_16.bmp

并保存到您的 CIRCUITPY 文件夾。

然后,將自定義設置更改為此:

下載:文件

復制代碼

#---| User Config |---------------

BACKGROUND = “/watchmen_bg.bmp” # specify color or background BMP file

NUM_FLAKES = 20 # total number of snowflakes

FLAKE_SHEET = “/squid_sheet_16.bmp” # flake sprite sheet

FLAKE_WIDTH = 16 # sprite width

FLAKE_HEIGHT = 16 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0x279ED5 # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |--------------- #---| User Config |---------------

BACKGROUND = “/watchmen_bg.bmp” # specify color or background BMP file

NUM_FLAKES = 20 # total number of snowflakes

FLAKE_SHEET = “/squid_sheet_16.bmp” # flake sprite sheet

FLAKE_WIDTH = 16 # sprite width

FLAKE_HEIGHT = 16 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0x279ED5 # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

背景圖像只是另一個BMP文件。除此之外,沒有什么新內(nèi)容。

sprite表單卻大不相同。薄片較大-16 x16。它們還包含多種顏色。放大,看起來像這樣:

薄片總數(shù)有所減少,因為它們是較大的薄片。為了使雪與魷魚匹配,將其設置為藍色。

在復制所有內(nèi)容并進行其他更改之后,再次運行代碼,您應該得到:

魷魚!

玩得開心!

通過薄片自定義功能獲得樂趣。好像有貓和狗的薄片嗎?也許是青蛙?墮落的心可能很好。或者只是更奇特的雪花。由您決定。

還有什么可以從天上掉下來?這里還有一個給您。但是您必須加載這些文件才能查看。..

wg_bg.bmp

wg_sheet.bmp

下載:文件

復制代碼

#---| User Config |---------------

BACKGROUND = “/wg_bg.bmp” # specify color or background BMP file

NUM_FLAKES = 20 # total number of snowflakes

FLAKE_SHEET = “/wg_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 20 # sprite width

FLAKE_HEIGHT = 20 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFF00FF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |--------------- #---| User Config |---------------

BACKGROUND = “/wg_bg.bmp” # specify color or background BMP file

NUM_FLAKES = 20 # total number of snowflakes

FLAKE_SHEET = “/wg_sheet.bmp” # flake sprite sheet

FLAKE_WIDTH = 20 # sprite width

FLAKE_HEIGHT = 20 # sprite height

FLAKE_TRAN_COLOR = 0x000000 # transparency color

SNOW_COLOR = 0xFF00FF # snow color

SHAKE_THRESHOLD = 27 # shake sensitivity, lower=more sensitive

#---| User Config |---------------

更多詳細信息

制作精靈表格

主鍵是將文件另存為索引位圖圖像文件。然后可以使用CircuitPython圖像加載庫加載它們。確切的操作方式取決于所使用的軟件。本指南中的精靈表是使用GIMP創(chuàng)建的??傮w過程如下:

創(chuàng)建新的圖像寬x高像素

使用1像素鉛筆工具繪制精靈

另存為.xcf文件以供將來編輯

準備導出時:

圖像-》模式-》索引

文件-》導出為。..

使用.bmp擴展名指定文件名

類似的導出方法可用于背景圖像。

薄片落下速度

那么如何實現(xiàn)不同的薄片落下速度?好吧,很簡單。速度基于薄片指數(shù)。歸結為這一行代碼(從高級版本開始):

下載:文件

復制代碼

flake_pos[i] += 1 - flake[0] / NUM_SPRITES flake_pos[i] += 1 - flake[0] / NUM_SPRITES

第一個薄片掉落最快。最后一片雪花落得最慢。這就是為什么各種薄片示例將薄片從最小到最大排列的原因。

由于y位置是整數(shù)值,因此使用單獨的float值進行浮點數(shù)學運算。那就是存儲在flake_pos中的內(nèi)容。設置薄片位置時,只需將其更改為整數(shù)即可:

下載:文件

復制代碼

flake.y = int(flake_pos[i]) flake.y = int(flake_pos[i])

一種更簡單的方法是允許設置自定義下降速度每片。但這將需要額外的存儲機制,并需要為每個片狀Sprite表格手動設置更多的工作。

另一個想法可能是以某種方式“稱量”片狀Sprite,例如它要多少個非透明像素。包含。然后以此為基礎降低速度。

動畫片?

確定。為什么不?那實在是太酷了??梢宰龅降?。可能是將來的版本。

積雪

很容易知道薄片何時落在地面上。但是那又怎樣呢?我們?nèi)绾螌⒀疤砑印钡疆斍袄鄯e的雪中。最簡單的方法是在薄片掉落的地方盲目添加一些像素。但是,這可能會導致下雪的“ spikey”配置文件,這看起來并不自然。

當前代碼版本試圖以一種非常簡單的方式來處理此問題。它根據(jù)周圍的雪進行局部陡度檢查,并且僅在當前不太陡峭時才添加像素。這在大多數(shù)情況下都有效,但是確實會導致看起來有些不自然的邊緣效果。

如果這樣更出色,那就太好了。另一個未來的mod??赡苁茄┍?a href="http://m.makelele.cn/analog/" target="_blank">模擬器嗎?

該項目是一個很好的示例,說明了如何使用多個TileGrids和Groups來創(chuàng)建分層的效果和動畫。背景圖像和地面上的積雪只是單個TileGrid,它填充了整個顯示。薄片更有趣。每個薄片都是TileGrid,并且僅與薄片本身一樣大。這些都添加到相同的Group中。然后將所有這三個元素,背景(TileGrid),雪(TileGrid)和薄片(Group中的TileGrid)添加到主Group在顯示屏上顯示。因此,排序在以下代碼行中很重要:

下載:文件

復制代碼

# Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash) # Add everything to display

splash = displayio.Group()

splash.append(background)

splash.append(flakes)

splash.append(snow)

display.show(splash)
責任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • pcb
    pcb
    +關注

    關注

    4411

    文章

    23915

    瀏覽量

    425373
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    LTC3524:小/中型TFT-LCD面板的理想電源解決方案

    提供穩(wěn)定可靠的電源解決方案至關重要。本文將詳細介紹Linear Technology的Demo Circuit 1121,它采用LTC3524芯片,為小/中型TFT-LCD面板提供了偏置和白色LED電源
    的頭像 發(fā)表于 03-31 13:05 ?117次閱讀

    MAX8798:TFT LCD應用的多功能電源管理利器

    ——MAX8798。 文件下載: MAX8798.pdf 一、產(chǎn)品概述 MAX8798是一款高度集成的芯片,它集成了高性能的升壓調(diào)節(jié)器、高速運算放大器、帶非易失性存儲器的數(shù)字可調(diào)VCOM校準器、I2C接口以及高壓電平轉換掃描驅動器。這種高度集成的設計使得它在TFT LCD
    的頭像 發(fā)表于 03-16 14:30 ?134次閱讀

    MAX17094:多功能集成芯片助力TFT LCD設計

    MAX17094:多功能集成芯片助力TFT LCD設計 在電子設備的設計中,尤其是TFT LCD應用領域,一款功能強大且性能出色的芯片能為產(chǎn)品帶來顯著的優(yōu)勢。MAX17094就是這樣一款值得關注
    的頭像 發(fā)表于 03-16 13:45 ?120次閱讀

    MAX16928:汽車TFT-LCD電源供應的理想之選

    個1.8V/3.3V調(diào)節(jié)器控制器以及兩個柵極電壓調(diào)節(jié)器,有多種版本可供選擇,能滿足常見的汽車TFT-LCD電源供應需求。它采用了擴
    的頭像 發(fā)表于 03-11 09:20 ?307次閱讀

    3.5寸TFT屏規(guī)格書

    關于3.5寸TFT彩屏的參考資料
    發(fā)表于 10-24 16:01 ?1次下載

    Quartus Prime Pro 25.1版本的安裝和使用

    如果用戶開發(fā)板是基于Agilex 3、Agilex 5等高階器件,則需要安裝高版本的Quartus軟件比如Quartus Prime Pro 25.1版本,這個版本在安裝包和license獲?。赓M)等方面跟以往的Quartus
    的頭像 發(fā)表于 10-07 13:06 ?2952次閱讀
    Quartus Prime Pro 25.1<b class='flag-5'>版本</b>的安裝和使用

    rtthread studio 創(chuàng)建不了工程怎么解決?

    安裝最新studio,路徑默認或自選,重新安裝都會創(chuàng)建工程不成功,報錯如圖 實際上首次安裝rtt studio ,且電腦上并未有相關rttsudio創(chuàng)建的相關工程 所有安裝路徑、創(chuàng)建工程路徑均沒有中文 studio
    發(fā)表于 09-29 06:49

    AppGallery Connect(HarmonyOS 5及以上) --公開測試創(chuàng)建并發(fā)布測試版本(一)

    )的公開測試版本會自動下架。 發(fā)布測試版本 首先,您需創(chuàng)建并發(fā)布測試版本。最多支持1個公開測試版本在架, 1.登錄AppGallery Co
    發(fā)表于 09-26 17:24

    創(chuàng)建并發(fā)布測試版本(二)

    :測試版本審核駁回后,狀態(tài)為“審核不通過”,狀態(tài)旁會顯示審核不通過的原因。 ? 已失效:開發(fā)者手動停止測試、復測不通過、或者到達測試截止時間時,狀態(tài)會變?yōu)椤耙咽А保瑺顟B(tài)旁會顯示已失效的原因。 當創(chuàng)建了多個
    發(fā)表于 09-17 15:00

    創(chuàng)建并發(fā)布測試版本(一)

    創(chuàng)建并發(fā)布測試版本,并選擇您要分發(fā)的測試群組。邀請測試最多允許100個版本同時在架,邀請測試和公開測試的總計版本數(shù)量不超過100個。 1.在左側導航欄選擇“應用測試>
    發(fā)表于 09-16 15:21

    解決博途新舊版本項目兼容問題:升級操作與風險提示

    前言: 當自己電腦安裝的是博途 V17 或更高版本,而項目設備程序版本較低(如 V15 或更早的 V13/V14)時,能否直接用 V17 打開這些舊版本創(chuàng)建的項目? 答:不能直接打開,
    的頭像 發(fā)表于 09-08 16:34 ?3037次閱讀
    解決博途新舊<b class='flag-5'>版本</b>項目兼容問題:升級操作與風險提示

    TFT顯示模組有什么功能

    在咱們的日常生活里,TFT 顯示模組其實一點都不陌生,家里看的電視、辦公用的電腦屏幕,還有每天揣在兜里的手機屏幕,背后都離不開它的支撐。不過大家雖說常和這些帶 TFT 顯示模組的設備打交道,可要
    的頭像 發(fā)表于 08-27 10:59 ?796次閱讀
    <b class='flag-5'>TFT</b>顯示模組有什么功能

    TFT顯示原理

    *附件:TFT_LCD 顯示原理_20191026.pdf
    發(fā)表于 08-26 10:22

    淺談TFT顯示屏的供電方式

    作為現(xiàn)代電子設備的核心視覺載體,液晶屏 的顯示效果與壽命,極大程度依賴于其供電系統(tǒng)的精準與穩(wěn)定。尤其對于TFT(薄膜晶體管)類液晶模塊,其內(nèi)部構造精密,包含升壓電路、數(shù)字邏輯、Gamma電壓、TFT
    的頭像 發(fā)表于 07-16 15:49 ?1984次閱讀

    基于ESP32的圓形顯示屏圣誕主題互動式雪球

    用一款以圣誕為主題的互動式雪球讓節(jié)日氛圍鮮活起來!項目使用矽遞科技(SeeedStudio)圓形顯示屏和(XIAO)ESP32S3開發(fā)板打造出極具視覺吸引力的雪景動畫,包含動態(tài)飄落的雪花、風效以及
    的頭像 發(fā)表于 04-15 11:48 ?1384次閱讀
    基于ESP32的圓形顯示屏圣誕主題互動式<b class='flag-5'>雪球</b>