pygame實現(xiàn)時鐘效果_第1頁
pygame實現(xiàn)時鐘效果_第2頁
pygame實現(xiàn)時鐘效果_第3頁
pygame實現(xiàn)時鐘效果_第4頁
pygame實現(xiàn)時鐘效果_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第pygame實現(xiàn)時鐘效果用pygame做一個時鐘,供大家參考,具體內(nèi)容如下

剛剛學習pygame,由于基礎實在太差,每個例子都要反復寫逐句研究才能基本弄懂,這次做一個簡單的有時針、分針、秒針,能正確行走的表。。。例子不難,但是還是能掌握一些基本的知識點,比如xy坐標的計算,畫圓,文字處理等。小白如我可以借鑒下,我認為學習還是以邏輯為主,所以我盡量還原初學時候的邏輯步驟,不啰嗦了,開整!

這次我們用到的主要是pygame,math,datetime幾個庫,datetime.today()可以獲取當前時間,math.sin()和math.cos()用于計算表針的坐標。用到的方法主要是pygame.draw.circle()畫圓,和pygame.draw.line()畫線

先把pygame初始化,再弄個窗口出來,準備工作做好

importmath,pygame

frompygame.localsimport*

fromdatetimeimportdatetime,date,time

pygame.init()

screen=pygame.display.set_mode((600,600))

pygame.display.set_caption("Clock")

然后畫個圓當表盤,這樣就需要確定位置和半徑

pos_x=300

pos_y=300

radius=250

考慮到區(qū)分三個表針的顏色,先設置好四種顏色

white=255,255,255

red=240,0,0

green=0,240,0

blue=0,0,240

計算表針的坐標,需要用到角度,所以先把角度設好

hour_angle=0

minute_angle=0

second_angle=0

寫數(shù)字需要用到文字處理,把文字樣式設置一下

font=pygame.font.Font(None,24)

最后還要寫兩個方法一個是輸出文字的,一個是規(guī)范角度的。這倆以后都經(jīng)常用

#abs()是取絕對值,%運算符號很有意思,效果是360取余數(shù),保證了角度在360以內(nèi)

defwrap_angle(angle):

returnabs(angle%360)

#把打印文字的步驟封裝在一個方法里,每次方便調(diào)用,簡化代碼

defprint_text(font,x,y,text,color):

imgText=font.render(text,True,color)

screen.blit(imgText,(x,y))

好了,準備工作做完了,我們來寫循環(huán)

whileTrue:

foreventinpygame.event.get():

ifevent.type==QUIT:

exit()

keys=pygame.key.get_pressed()

ifkeys[K_ESCAPE]:

exit()

這一段都是常規(guī)格式了,不解釋了,就是讓窗口能關掉。

然后把背景涂上一個顏色,不止一個人說我審美有問題了,所以我隨便選了個顏色,我都覺得有點丑

screen.fill((131,139,139))

我們先畫一個表盤

#畫表盤

pygame.draw.circle(screen,white,(pos_x,pos_y),radius,2)

在表盤上寫數(shù)字

#寫表盤數(shù)字

forninrange(1,13):

#一共12個數(shù)字,平均分到一個圓內(nèi)每兩個數(shù)字之間的角度為360/12

x=math.cos(math.radians(angle))*(radius-10)-5

y=math.sin(math.radians(angle))*(radius-10)-7

print_text(font,pos_x+x,pos_y+y,str(n),white)

這里說道說道幾個常用函數(shù)和概念,防止以后時間長了自己都忘

range(x,y)

作用是從x開始到y(tǒng)結束,但不包括y,所以range(1,13)就是從1到12,如果x不填,則默認從0開始

math.randians(angle)、math.sin()、math.cos()

這里比較繞了,要遍歷一個圓周,我們需要三個參數(shù),圓心坐標(pos_x,pos_y),半徑(radius),和角度(angle),然后通過三角函數(shù)里的正弦和余弦兩個函數(shù)乘以半徑,計算出每個點的坐標(x,y),而正弦和余弦函數(shù)需要的參數(shù)是弧度,所以需要用math.randians(angle)將角度轉(zhuǎn)化成弧度

問題來了,為啥正弦余弦乘以半徑可以得出圓周上點的坐標呢?

給個圖自己看,很簡單

想象一下A點是圓心,B點是圓周上的點,AB是圓的半徑,那么B點的x坐標就是cosA乘以AB,y坐標就是sinA乘以AB

計算x,y坐標時候-5-7又是為啥呢?

因為pygame里畫模型的時候,坐標是模型的左上角并不是模型的中心點,無論圖片還是文字還是其他什么都是這樣,所以需要減掉幾個像素,使模型出現(xiàn)在正確的位置,不然會往右下偏,這點以后要經(jīng)常用到

目前為止,表盤畫好了,是這個樣子的

開始畫表針

我們首先拿到當前的時間

#獲取時間

time=datetime.today()

hour=time.hour%12

minute=time.minute

second=time.second

畫秒針

#畫秒針

second_angle=wrap_angle(second*(360/60)-90)#秒針是60進制,所以一秒的角度為360/60

second_x=math.cos(math.radians(second_angle))*(radius-3)

second_y=math.sin(math.radians(second_angle))*(radius-3)

pygame.draw.line(screen,blue,(pos_x,pos_y),(pos_x+second_x,pos_y+second_y),2)

問題又來了,為啥要-90

因為畫圓的時候,0度是在3點鐘方向的,而實際情況下,我們希望0度在12點鐘方向,所以要減掉90度,達到需要

radius-3是為了讓秒針短一些,不至于戳到表盤上

解決了秒針,分針時針就簡單了

畫分針和時針

#畫分針

minute_angle=wrap_angle(minute*(360/60)-90)#分針也是60進制,原理同秒針

minute_x=math.cos(math.radians(minute_angle))*(radius-40)

minute_y=math.sin(math.radians(minute_angle))*(radius-40)

pygame.draw.line(screen,green,(pos_x,pos_y),(pos_x+minute_x,pos_y+minute_y),4)

#畫時針

#時針算角度時增加了一部分,因為鐘表分針走的時候,時針也在走一個很小的角度即30/60,

#加上這個角度,表才更加逼真,否則分針走的時候,時針一直保持指到整點,是錯誤的

hour_angle=wrap_angle(hour*(360/12)-90)+minute*30/60

hour_x=math.cos(math.radians(hour_angle))*(radius-80)

hour_y=math.sin(math.radians(hour_angle))*(radius-80)

pygame.draw.line(screen,red,(pos_x,pos_y),(pos_x+hour_x,pos_y+hour_y),6)

這里有點小技巧,我們看到計算hour_angle的時候,在后面加了minute*30/60,這里實際上應該這么寫minute/60*(360/12)minute是當前的分鐘數(shù),拿他除以60分鐘得到一個比例,然后12個小時,每兩個數(shù)字之間的角度是360/12即30度

加上這一塊,使分針每走一分鐘,時針也會相應的走一點,更逼真不是

然后寫上當前時間,比較表針位置是不是當前時間

#寫時間

print_text(font,10,10,str(hour)+":"+str(minute)+":"+str(second),white)

最后在圓點位置畫一個點,蓋住三個表針交叉的位置,好看一點

#畫表中心的圓點之所以放在最后是想蓋住三個針的原點

pygame.draw.circle(screen,white,(pos_x,pos_y),8,0)

最最后,別忘了刷新

pygame.display.update()

完整代碼如下

importmath,pygame

frompygame.localsimport*

fromdatetimeimportdatetime,date,time

pygame.init()

screen=pygame.display.set_mode((600,600))

pyga

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論