系列文章
序號 | 直達鏈接 |
---|---|
Tkinter | |
1 | Python李峋同款可寫字版跳動的愛心 |
2 | Python跳動的雙愛心 |
3 | Python藍色跳動的愛心 |
4 | Python動漫煙花 |
5 | Python粒子煙花 |
Turtle | |
1 | Python滿屏飄字 |
2 | Python藍色流星雨 |
3 | Python金色流星雨 |
4 | Python漂浮愛心 |
5 | Python愛心光波① |
6 | Python愛心光波② |
7 | Python滿天繁星 |
8 | Python五彩氣球 |
9 | Python白色飄雪 |
10 | Python七彩花朵 |
11 | Python 3D星空 |
12 | Python大雪紛飛 |
13 | Python一閃一閃亮星星 |
14 | Python愛心泡泡 |
15 | Python愛心射線 |
16 | Python圣誕禮物 |
17 | Python禮物圣誕樹 |
18 | Python浪漫星空 |
19 | Python飛舞蝙蝠 |
20 | Python萬圣禮物 |
21 | Python藍色飄雪 |
Pygame | |
1 | Python跨年煙花 |
2 | Python炫酷煙花 |
3 | Python黑客帝國字母雨 |
敬請期待…… |
寫在前面
Python實現漂浮愛心動畫的完整代碼。
技術需求
-
Turtle 圖形庫:
- 通過
turtle
庫進行圖形繪制,創建了動態的愛心動畫。使用Pen()
創建畫筆對象,控制畫筆的運動、繪制和顏色等屬性。turtle
庫還提供了繪制基本幾何圖形(如圓形、直線等)的功能,適用于動畫和圖形界面的創建。
- 通過
-
面向對象編程 (OOP):
- 通過定義
Heart
類來實現愛心的對象化管理。每個愛心具有自己的屬性(如位置、速度、顏色、半徑等)和方法(如移動、繪制等)。這種設計方式使得每個愛心的行為獨立且封裝,方便管理和擴展。
- 通過定義
-
隨機數生成:
- 使用
random
庫生成隨機數,為每個愛心的屬性(如位置、大小、顏色、速度)賦予隨機值,使得每次運行時愛心的位置、運動軌跡和速度都不相同,從而增加了動畫的隨機性和趣味性。
- 使用
-
數學計算:
- 使用
math
庫中的三角函數sin()
來控制愛心左右的擺動。通過正弦函數的變化,愛心的水平運動軌跡呈現波動效果,模擬了自然的漂浮感覺。
- 使用
-
動態畫布更新:
- 使用
tu.tracer(0)
和tu.update()
來優化畫布的更新。tu.tracer(0)
禁用自動刷新,避免每次繪制時屏幕的閃爍;tu.update()
在所有繪制完成后一次性刷新屏幕,提高了動畫的流暢度。
- 使用
-
無限循環與實時動畫:
- 通過
while True
無限循環實現了愛心的持續漂浮和動態更新,模擬了連續的動畫效果。每次循環都會更新愛心的位置,并重繪它們。
- 通過
完整代碼
import turtle as tu
import random as ra
import mathtu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
t = tu.Pen()
t.ht()
colors = ['pink']
class Heart(): #每個愛心(愛心類)def __init__(self):self.r = ra.randint(10,15) #愛心的半徑self.x = ra.randint(-1000,1000) #愛心的橫坐標self.y = ra.randint(-500,500) #愛心的縱坐標self.f = ra.uniform(-3.14,3.14) #愛心左右移動呈正弦函數self.speed = ra.randint(5,10) #愛心移動速度self.color = ra.choice(colors) #愛心的顏色self.outline = 1 #愛心的外框大小(可不要)
……
代碼分析
這段 Python 代碼使用 turtle
庫和 random
庫創建了一種動態效果,其中多個愛心在屏幕上飄浮,模擬愛心隨時間和運動的變化。下面將從代碼的各個部分進行詳細分析,重點關注代碼的功能、實現過程、以及相關的技術細節。
1. 引入必要的庫
import turtle as tu
import random as ra
import math
這段代碼導入了三個庫:
turtle
:Python 的一個圖形繪制模塊,常用于繪制簡單的圖形和動畫。random
:用于生成隨機數的庫,代碼中用它來隨機生成愛心的屬性(位置、速度等)。math
:提供數學運算支持,在這里用來處理一些運動的三角函數,特別是愛心的左右擺動。
2. 設置屏幕參數
tu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
tu.setup(1.0, 1.0)
設置了屏幕的寬度和高度為 1.0,即使用屏幕的最大范圍。tu.screensize(1.0, 1.0)
設置了屏幕的顯示區域,參數也為最大。
3. 創建畫筆對象
t = tu.Pen()
t.ht()
t = tu.Pen()
創建了一個畫筆對象t
,可以用它來控制 Turtle 畫筆的狀態和位置。t.ht()
隱藏了畫筆。因為我們不需要在屏幕上看到畫筆本身,只需繪制出愛心圖形。
4. 定義顏色列表
colors = ['pink']
這里的顏色列表只包含一個顏色 'pink'
,表示所有愛心的顏色都將是粉色。這也使得整個動畫具有統一的風格。
5. 定義 Heart 類
Heart
類用于表示一個愛心對象,每個實例代表一個漂浮的愛心。self.r
:隨機生成愛心的半徑,取值范圍是 10 到 15。self.x
和self.y
:隨機生成愛心的初始位置,x
在橫軸上取值范圍為 -1000 到 1000,y
在縱軸上取值范圍為 -500 到 500。self.f
:隨機生成一個角度值,用于控制愛心的左右移動,范圍是 -π 到 π。self.speed
:隨機生成愛心的速度,取值范圍為 5 到 10。self.color
:愛心的顏色,這里是從colors
列表中隨機選取顏色,雖然目前colors
列表只有'pink'
一個顏色,但可以方便未來擴展。self.outline
:愛心的外框線寬,默認值為 1。
6. move
方法
- 該方法控制愛心的位置更新和漂浮。
- 首先判斷愛心是否在畫布范圍內 (
self.y <= 500
)。- 如果愛心仍在畫布內,
self.y += self.speed
使愛心垂直方向上向下移動,self.x += self.speed * math.sin(self.f)
控制愛心在水平方向上的移動,self.f += 0.1
使得愛心的左右運動呈現正弦波狀。 - 如果愛心超出了畫布的下邊界 (
self.y > 500
),則重新生成一個新的愛心對象,并將其初始位置設置為畫布的上方。
- 如果愛心仍在畫布內,
7. draw
方法
draw
方法負責使用turtle
繪制愛心形狀。t.pensize(self.outline)
設置畫筆的外框寬度。t.penup()
抬起畫筆,移動到指定位置后再繪制。t.goto(self.x, self.y)
將畫筆移動到當前愛心的隨機位置。t.pendown()
放下畫筆開始繪制。- 使用
begin_fill()
和end_fill()
方法填充愛心內部顏色為粉色。 - 通過
t.setheading(120)
設置畫筆的初始角度,t.circle(self.r, 195)
畫出愛心的兩個半圓部分,t.fd(self.r * 2.4)
和t.left(90)
繪制愛心的底部。
8. 創建多個愛心對象
Hearts = [] # 用列表保存所有愛心
for i in range(100):Hearts.append(Heart())
Hearts
列表用于保存所有的愛心對象。通過for
循環,創建 100 個Heart
實例,并將其添加到Hearts
列表中。
9. 設置背景顏色
tu.bgcolor('black')
- 這行代碼將畫布的背景色設置為黑色,能讓粉色的愛心更加突出。
10. 漂浮效果的實現
- 進入一個無限循環,模擬愛心漂浮的過程。
tu.tracer(0)
禁用畫布的自動刷新,以提高性能,避免每次繪制都更新屏幕。t.clear()
清除當前的繪圖,準備進行下一次繪制。- 使用
for i in range(50)
來控制當前繪制 50 個愛心對象。Hearts[i].move()
調用每個愛心的move
方法,使愛心根據隨機屬性移動。Hearts[i].draw()
繪制愛心。
tu.update()
刷新畫布,顯示更新后的圖形。
11. 總結
這段代碼通過定義 Heart
類,結合隨機生成的屬性和移動機制,使用 turtle
庫繪制了一個動態的愛心飄浮效果。每個愛心都有隨機的顏色、速度、位置和運動軌跡,模擬了愛心在畫布上自由飄浮的效果。這種設計方法不僅實現了動態效果,還通過面向對象的設計,使得代碼結構清晰易于擴展。
寫在后面
我是一只有趣的兔子,感謝你的喜歡!