




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第pygame實(shí)現(xiàn)時(shí)鐘效果用pygame做一個(gè)時(shí)鐘,供大家參考,具體內(nèi)容如下
剛剛學(xué)習(xí)pygame,由于基礎(chǔ)實(shí)在太差,每個(gè)例子都要反復(fù)寫逐句研究才能基本弄懂,這次做一個(gè)簡單的有時(shí)針、分針、秒針,能正確行走的表。。。例子不難,但是還是能掌握一些基本的知識(shí)點(diǎn),比如xy坐標(biāo)的計(jì)算,畫圓,文字處理等。小白如我可以借鑒下,我認(rèn)為學(xué)習(xí)還是以邏輯為主,所以我盡量還原初學(xué)時(shí)候的邏輯步驟,不啰嗦了,開整!
這次我們用到的主要是pygame,math,datetime幾個(gè)庫,datetime.today()可以獲取當(dāng)前時(shí)間,math.sin()和math.cos()用于計(jì)算表針的坐標(biāo)。用到的方法主要是pygame.draw.circle()畫圓,和pygame.draw.line()畫線
先把pygame初始化,再弄個(gè)窗口出來,準(zhǔn)備工作做好
importmath,pygame
frompygame.localsimport*
fromdatetimeimportdatetime,date,time
pygame.init()
screen=pygame.display.set_mode((600,600))
pygame.display.set_caption("Clock")
然后畫個(gè)圓當(dāng)表盤,這樣就需要確定位置和半徑
pos_x=300
pos_y=300
radius=250
考慮到區(qū)分三個(gè)表針的顏色,先設(shè)置好四種顏色
white=255,255,255
red=240,0,0
green=0,240,0
blue=0,0,240
計(jì)算表針的坐標(biāo),需要用到角度,所以先把角度設(shè)好
hour_angle=0
minute_angle=0
second_angle=0
寫數(shù)字需要用到文字處理,把文字樣式設(shè)置一下
font=pygame.font.Font(None,24)
最后還要寫兩個(gè)方法一個(gè)是輸出文字的,一個(gè)是規(guī)范角度的。這倆以后都經(jīng)常用
#abs()是取絕對(duì)值,%運(yùn)算符號(hào)很有意思,效果是360取余數(shù),保證了角度在360以內(nèi)
defwrap_angle(angle):
returnabs(angle%360)
#把打印文字的步驟封裝在一個(gè)方法里,每次方便調(diào)用,簡化代碼
defprint_text(font,x,y,text,color):
imgText=font.render(text,True,color)
screen.blit(imgText,(x,y))
好了,準(zhǔn)備工作做完了,我們來寫循環(huán)
whileTrue:
foreventinpygame.event.get():
ifevent.type==QUIT:
exit()
keys=pygame.key.get_pressed()
ifkeys[K_ESCAPE]:
exit()
這一段都是常規(guī)格式了,不解釋了,就是讓窗口能關(guān)掉。
然后把背景涂上一個(gè)顏色,不止一個(gè)人說我審美有問題了,所以我隨便選了個(gè)顏色,我都覺得有點(diǎn)丑
screen.fill((131,139,139))
我們先畫一個(gè)表盤
#畫表盤
pygame.draw.circle(screen,white,(pos_x,pos_y),radius,2)
在表盤上寫數(shù)字
#寫表盤數(shù)字
forninrange(1,13):
#一共12個(gè)數(shù)字,平均分到一個(gè)圓內(nèi)每兩個(gè)數(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)
這里說道說道幾個(gè)常用函數(shù)和概念,防止以后時(shí)間長了自己都忘
range(x,y)
作用是從x開始到y(tǒng)結(jié)束,但不包括y,所以range(1,13)就是從1到12,如果x不填,則默認(rèn)從0開始
math.randians(angle)、math.sin()、math.cos()
這里比較繞了,要遍歷一個(gè)圓周,我們需要三個(gè)參數(shù),圓心坐標(biāo)(pos_x,pos_y),半徑(radius),和角度(angle),然后通過三角函數(shù)里的正弦和余弦兩個(gè)函數(shù)乘以半徑,計(jì)算出每個(gè)點(diǎn)的坐標(biāo)(x,y),而正弦和余弦函數(shù)需要的參數(shù)是弧度,所以需要用math.randians(angle)將角度轉(zhuǎn)化成弧度
問題來了,為啥正弦余弦乘以半徑可以得出圓周上點(diǎn)的坐標(biāo)呢?
給個(gè)圖自己看,很簡單
想象一下A點(diǎn)是圓心,B點(diǎn)是圓周上的點(diǎn),AB是圓的半徑,那么B點(diǎn)的x坐標(biāo)就是cosA乘以AB,y坐標(biāo)就是sinA乘以AB
計(jì)算x,y坐標(biāo)時(shí)候-5-7又是為啥呢?
因?yàn)閜ygame里畫模型的時(shí)候,坐標(biāo)是模型的左上角并不是模型的中心點(diǎn),無論圖片還是文字還是其他什么都是這樣,所以需要減掉幾個(gè)像素,使模型出現(xiàn)在正確的位置,不然會(huì)往右下偏,這點(diǎn)以后要經(jīng)常用到
目前為止,表盤畫好了,是這個(gè)樣子的
開始畫表針
我們首先拿到當(dāng)前的時(shí)間
#獲取時(shí)間
time=datetime.today()
hour=time.hour%12
minute=time.minute
second=time.second
畫秒針
#畫秒針
second_angle=wrap_angle(second*(360/60)-90)#秒針是60進(jìn)制,所以一秒的角度為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
因?yàn)楫媹A的時(shí)候,0度是在3點(diǎn)鐘方向的,而實(shí)際情況下,我們希望0度在12點(diǎn)鐘方向,所以要減掉90度,達(dá)到需要
radius-3是為了讓秒針短一些,不至于戳到表盤上
解決了秒針,分針時(shí)針就簡單了
畫分針和時(shí)針
#畫分針
minute_angle=wrap_angle(minute*(360/60)-90)#分針也是60進(jìn)制,原理同秒針
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)
#畫時(shí)針
#時(shí)針?biāo)憬嵌葧r(shí)增加了一部分,因?yàn)殓姳矸轴樧叩臅r(shí)候,時(shí)針也在走一個(gè)很小的角度即30/60,
#加上這個(gè)角度,表才更加逼真,否則分針走的時(shí)候,時(shí)針一直保持指到整點(diǎn),是錯(cuò)誤的
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)
這里有點(diǎn)小技巧,我們看到計(jì)算hour_angle的時(shí)候,在后面加了minute*30/60,這里實(shí)際上應(yīng)該這么寫minute/60*(360/12)minute是當(dāng)前的分鐘數(shù),拿他除以60分鐘得到一個(gè)比例,然后12個(gè)小時(shí),每兩個(gè)數(shù)字之間的角度是360/12即30度
加上這一塊,使分針每走一分鐘,時(shí)針也會(huì)相應(yīng)的走一點(diǎn),更逼真不是
然后寫上當(dāng)前時(shí)間,比較表針位置是不是當(dāng)前時(shí)間
#寫時(shí)間
print_text(font,10,10,str(hour)+":"+str(minute)+":"+str(second),white)
最后在圓點(diǎn)位置畫一個(gè)點(diǎn),蓋住三個(gè)表針交叉的位置,好看一點(diǎn)
#畫表中心的圓點(diǎn)之所以放在最后是想蓋住三個(gè)針的原點(diǎn)
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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子專業(yè)視頻采集卡考核試卷
- 葡萄酒教育與文化交流考核試卷
- 生物藥品的藥物發(fā)現(xiàn)與篩選技術(shù)優(yōu)化考核試卷
- 稀土金屬壓延加工的數(shù)據(jù)分析與應(yīng)用考核試卷
- 傳染病處置規(guī)范
- 旅行社與景區(qū)共建特色旅游項(xiàng)目合作協(xié)議
- 心理咨詢服務(wù)保密協(xié)議修訂
- 民辦教育機(jī)構(gòu)委托管理及教學(xué)質(zhì)量提升合作協(xié)議
- 影視拍攝場地使用與安全設(shè)施定期檢查維護(hù)協(xié)議
- 澳洲天然美妝連鎖店全球加盟合同
- 國家開放大學(xué)2025年《機(jī)電控制工程基礎(chǔ)》形考任務(wù)1-4答案
- 出納人員面試題及答案
- 2025年隨州國有資本投資運(yùn)營集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 低血糖休克護(hù)理
- 2025至2030年多功能背封包裝機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 白內(nèi)障患者的護(hù)理查房
- 餐廳送貨協(xié)議合同
- 古建筑修繕加固施工方案
- 抗生素分級(jí)管理規(guī)范
- T-PAYS 002-2024 磐安藥膳制作技術(shù)規(guī)程
- 牛場安全培訓(xùn)
評(píng)論
0/150
提交評(píng)論