仿抖音网红文字时钟python的pygame实现及代码分析
本文较长,适合收藏,慢慢研究分析。
===========
首先,开场白:
1.推荐索引:
2.真诚感谢:原作者:战斗中的毅力(王程程)
3.代码说明:代码在原作者基础上进行整合、删除、添加、润色、评论,分享仅供学习。
4.模仿Tik Tok在线名人字钟。目前有app可以下载,网上也有html和css的免费代码下载。python很少。这怎么能让python缺席呢?
Html代码,网上有免费的代码下载。
==========================
二、python pygame实现效果图:
1.图:
2、非常漂亮。
3.提前准备:
3.1 python3以上,推荐python3.8
3.2微软编辑器vscode
3.3下载自己喜欢的字体。本文中hwfs=。。仿宋。
3.4二进制文件' hzk16 '需要自己下载。
请搜原作者的博客,这也是对原作者的尊重。我故意留了个小bug。
=============
三、代码与分析:
1.第一步:
#-Step 1-Export module-Import from mathematics * Import from pygame.locals * Import time Import system uses this library to import math2 when importing binascii # arbitrary Chinese characters. Step 2:
The center coordinate is half the screen size screen _ x _ max=int (1500 * fontmultiple) screen _ y _ max=int (1500 * fontmultiple) # game initialization pygame.init()# I like to add adjustable size. Screen size screen=pygame.display.set _ mode ((screen _ x _ max, SCREEN_Y_MAX), resizable) FOCAL_DISTANCE=512 # Perspective model 3. Step 3:
#---第3步---颜色定义---BLACK=(0,0,0)WHITE=(255,255,255)RED=(255,0,0)GREEN=(0,255,0)BLUE=(0,0,255)ForeColor=RED #前景色和背景色BackColor=BLACK#中文字体,
#---第4步---3d相关定义---#定义画点函数---needdef Gui_Point(x,y,color): pygame.draw.line(screen,color,(int(x),int(y)),(int(x+1),int(y)),2)#定义坐标结构体类---needclass zuobiaostruct: def __init__(self): self.x=0 self.y=0 self.z=0#矩阵相乘函数---needdef MATRIX_multiply(MAT1,MAT2): newMAT=[[0.0 for i in range(4)] for n in range(4)] for a in range(4): for b in range(4): newMAT[a][b]=MAT1[a][0]*MAT2[0][b]+MAT1[a][1]*MAT2[1][b]+MAT1[a][2]*MAT2[2][b]+MAT1[a][3]*MAT2[3][b] return newMAT#矢量与矩阵相乘函数---needdef vector_matrix_MULTIPLY(Source,MAT): Result=zuobiaostruct() Result.x=Source.x*MAT[0][0]+Source.y*MAT[1][0]+Source.z*MAT[2][0]+MAT[3][0] Result.y=Source.x*MAT[0][1]+Source.y*MAT[1][1]+Source.z*MAT[2][1]+MAT[3][1] Result.z=Source.x*MAT[0][2]+Source.y*MAT[1][2]+Source.z*MAT[2][2]+MAT[3][2] return Result #构造单位矩阵函数def structure_3D(): MAT=[[0.0 for i in range(4)] for i in range(4)] MAT[0][0]=1.0 MAT[0][1]=0.0 MAT[0][2]=0.0 MAT[0][3]=0.0 #//1 0 0 0 MAT[1][0]=0.0 MAT[1][1]=1.0 MAT[1][2]=0.0 MAT[1][3]=0.0 #//0 1 0 0 MAT[2][0]=0.0 MAT[2][1]=0.0 MAT[2][2]=1.0 MAT[2][3]=0.0 #//0 0 1 0 MAT[3][0]=0.0 MAT[3][1]=0.0 MAT[3][2]=0.0 MAT[3][3]=1.0 #//0 0 0 1 return MAT #平移变换矩阵函数---needdef Translate3D(MAT,tx, ty, tz): tMAT=[[0.0 for i in range(4)] for i in range(4)] tMAT[0][0]=1 tMAT[0][1]=0 tMAT[0][2]=0 tMAT[0][3]=0#//1 0 0 tx tMAT[1][0]=0 tMAT[1][1]=1 tMAT[1][2]=0 tMAT[1][3]=0#//0 1 0 ty tMAT[2][0]=0 tMAT[2][1]=0 tMAT[2][2]=1 tMAT[2][3]=0#//0 0 1 tz tMAT[3][0]=tx tMAT[3][1]=ty tMAT[3][2]=tz tMAT[3][3]=1;#//0 0 0 1 return MATRIX_multiply(MAT,tMAT)#//相乘#比例(scale)变换矩阵函数---needdef Scale_3D( MAT, sx, sy, sz): tMAT=[[0.0 for i in range(4)] for i in range(4)] tMAT[0][0]=sx tMAT[0][1]=0 tMAT[0][2]=0 tMAT[0][3]=0#//sx0 0 0 tMAT[1][0]=0 tMAT[1][1]=sy tMAT[1][2]=0 tMAT[1][3]=0#//0 sy0 0 tMAT[2][0]=0 tMAT[2][1]=0 tMAT[2][2]=sz tMAT[2][3]=0 #//0 0 sz0 tMAT[3][0]=0 tMAT[3][1]=0 tMAT[3][2]=0 tMAT[3][3]=1#//0 0 0 1 return MATRIX_multiply(MAT,tMAT) #//相乘#旋转变换矩阵函数---needdef Rotate_3D( MAT, ax, ay, az): MAT1=[[0.0 for i in range(4)] for i in range(4)] MAT2=[[0.0 for i in range(4)] for i in range(4)] MATx=[[0.0 for i in range(4)] for i in range(4)] MATy=[[0.0 for i in range(4)] for i in range(4)] MATz=[[0.0 for i in range(4)] for i in range(4)] ax=(3.1415926*ax)/180.0#//角度转换为弧度量 ay=(3.1415926*ay)/180.0 az=(3.1415926*az)/180.0 #*****************************绕x轴旋转******************************************** MATx[0][0]=1 MATx[0][1]=0 MATx[0][2]=0 MATx[0][3]=0 #//1 00 0 MATx[1][0]=0 MATx[1][1]=cos(ax) MATx[1][2]=-sin(ax) MATx[1][3]=0 #//0 cos(ax)-sin(ax) 0 MATx[2][0]=0 MATx[2][1]=sin(ax) MATx[2][2]=cos(ax) MATx[2][3]=0 #//0 sin(ax)cos(ax) 0 MATx[3][0]=0 MATx[3][1]=0 MATx[3][2]=0 MATx[3][3]=1 #//0 0 0 1 #*****************************绕y轴旋转******************************************** MATy[0][0]=cos(ay) MATy[0][1]=0 MATy[0][2]=sin(ay) MATy[0][3]=0 #//cos(ay)0sin(ay)0 MATy[1][0]=0 MATy[1][1]=1 MATy[1][2]=0 MATy[1][3]=0 #//0100 MATy[2][0]=-sin(ay) MATy[2][1]=0 MATy[2][2]=cos(ay) MATy[2][3]=0 #//-sin(ay)0cos(ay) 0 MATy[3][0]=0 MATy[3][1]=0 MATy[3][2]=0 MATy[3][3]=1 #//0 001 #*****************************绕z轴旋转******************************************** MATz[0][0]=cos(az) MATz[0][1]=-sin(az) MATz[0][2]=0 MATz[0][3]=0 #//cos(az)-sin(az)00 MATz[1][0]=sin(az) MATz[1][1]=cos(az) MATz[1][2]=0 MATz[1][3]=0 #//sin(az)cos(az)00 MATz[2][0]=0 MATz[2][1]=0 MATz[2][2]=1 MATz[2][3]=0 #//0 010 MATz[3][0]=0 MATz[3][1]=0 MATz[3][2]=0 MATz[3][3]=1 #//0 001 MAT1=MATRIX_multiply(MAT,MATx) MAT2=MATRIX_multiply(MAT1,MATy) return MATRIX_multiply(MAT2,MATz)#透视投影(Perspective projection)---needdef PerProject( Space, XO, YO): Screen=zuobiaostruct() if (Space.z==0): Space.z=0.01#//被除数不能为零 Screen.x=(int)(FOCAL_DISTANCE*Space.x /(Space.z+FOCAL_DISTANCE)+XO) Screen.y=(int)(FOCAL_DISTANCE*Space.y /(Space.z+FOCAL_DISTANCE)+YO) return Screen#显示3D的16x16字符---needdef Show3D16x16Char(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=1.5,fontmultiple=1.0): length=len(font) if length==0:#字符数要大于一个return if length==1: #只支持一个字符的显示text=font else: text=font[0] m=0 i=0 k=0 j=0 XO=0 YO=0 gMAT=[[0.0 for i in range(4)] for n in range(4)] Point0=zuobiaostruct() Point1=zuobiaostruct() PointDis=zuobiaostruct() gMAT=structure_3D() #//构建单位矩阵 gMAT=Translate3D(gMAT,-8,-8,-8); #//平移变换矩阵 gMAT=Scale_3D(gMAT,fontmultiple,fontmultiple,fontmultiple); #//比例变换矩阵 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋转变换矩阵for m in range(length): #理论上就是将单个的字符延长为多个字符,
#---第5步---中文标签定义-------------Week_zw=('一','二','三','四','五','六','日') #星期的中文Day_zw=('零','一','二','三','四','五','六','七','八','九','十') #可用于所有需要0-10的中文的地方Mouth_day=[31,28,31,30,31,30,31,31,30,31,30,31] #月份时长表#秒Second_add=['零','一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十','二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十','三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十','四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九', ]6.第6步:这里有增加秒的代码
#---第6步---相关显示函数定义---#显示年def Show_Year(x0,y0,r,angel): timenow=time.localtime(time.time()) #获取时间 yearstr=Day_zw[(int)(timenow[0]/1000)]+Day_zw[int((timenow[0]%1000)/100)]+Day_zw[int((timenow[0]%100)/10)]+Day_zw[int((timenow[0]%10))]+'年' Show3D16x16Char(yearstr,0,0,angel-90,x0,y0,1,WHITE,BackColor,0,fontmultiple)#显示周(星期)def Show_Week(x0,y0,r,agl): timenow=time.localtime(time.time()) #获取时间 for i in range(7): angel=360/7 if i timenow[6]: angel=agl-angel*(timenow[6]-i) ForeColor=RED elif i timenow[6]: angel=agl+angel*(i-timenow[6]) ForeColor=RED else : angel=agl #当前周设为90度,
#---第7步---定义打印屏幕文字函数---def print_text(font, x, y, text, color=WHITE): imgText=font.render(text, True, WHITE) screen.blit(imgText, (int(float(x)),int(float(y))))8.第8步:
#---第8步---游戏循环---i=0while True: #获取今天的时间 timenow=time.localtime(time.time()) #定义年月日 years=timenow[0] months=timenow[1] days=timenow[2] #定义时分秒 #hours=today.hour % 12 #显示12h制 hours=timenow[3] % 24 #显示24h制 minutes=timenow[4] seconds=timenow[5] #显示当前时间,x=400,y=550,
四、结束语:
据说python无所不能,可惜我也是新手小白,我也是站在巨人和大神的肩膀上的,感谢大神执念执战(王成程)。最重要的是python为什么这么火?第1是代码简洁;第2是代码及库很多,都是开源的、免费的,
都是大神们之间互相免费提供的,在此多谢他们。
喜欢python的人,不管多大年纪、不管男女,看我的python,你学起来简单有趣,我都是亲测过的。