pygameは時計効果を実現します。

8877 ワード

pygameで時計を作って、参考にしてください。具体的な内容は以下の通りです。
ちょうどpygameを学んで、基礎があまりにも悪いため、すべての例はすべて繰り返し文章を書いて研究してようやく基本的にようやくわかることができて、今度は1つの簡単な時計、分針、秒針があって、正しい歩くことができる時計をします。例は難しくないですが、xy座標の計算、円の描画、文字処理など、基本的な知識点を身につけられます。白さんは参考にしてもいいです。勉強はやはり論理が中心ですから、できるだけ初心の時の論理ステップを元に戻して、うるさくないです。
前期の準備
今回使ったのは主にpygame、math、datetimeのいくつかのライブラリで、datetime.today()は現在の時間を取得できます。使う方法は主にpygame.draw.circle()が円を描くので、とpygame.draw.line()が線をかくのです。
手を下す
まずpygameを初期化してから、窓口を作って準備します。

import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")
それから円を描いて、文字盤として位置と半径を決めます。

pos_x = 300
pos_y = 300
radius = 250
三つの時計針の色を区別することを考慮して、四つの色を設定します。

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
数字を書くには文字処理が必要です。文字スタイルを設定してください。

font = pygame.font.Font(None, 24)
最後にまた二つの方法を書きます。一つは文字を出力するもので、一つは角度を規範化するものです。この二人はこれからよく使います。

# abs()     ,%        ,   360   ,      360  
def wrap_angle(angle):
    return abs(angle % 360)

#                 ,      ,    
def print_text(font, x, y, text, color):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))
はい、準備が終わりました。サイクルを書きます。

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        exit()
この部分は全部レギュラーフォーマットです。説明しないと、窓を閉めることができます。
背景を一つの色に塗ってください。一人だけではなく、審美に問題があると言われました。だから、適当に色を選びました。私はちょっと醜そうです。

screen.fill((131, 139, 139))
まず文字盤を描きます。

#    
pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)
文字盤に数字を書く

#      
for n in range(1, 13):  
    #   12   ,                     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)
ここでいくつかの常用関数と概念について話しますが、後で長くなると自分でも忘れないようにします。
range(x,y)
作用はxからyまでですが、yを含まないので、range(1,13)は1から12までです。xを埋めないとデフォルトは0から始まります。
mash.radians(angle)、mash.sin()、mash.com()
ここでは周りを比較して、円周を遍歴するには、3つのパラメータ、円心座標(pos_)が必要です。x,pos_y)半径(radius)と角度(angle)は三角関数の正弦と余弦の2つの関数で半径を乗じて各点の座標(x,y)を計算しますが、正弦とコサイン関数に必要なパラメータはラジアンですので、math.radiansで角度をラジアンに変換する必要があります。
問題です。なぜサインの余弦に半径をかけると円周上の点の座標が得られますか?
絵をあげて自分で見るのは簡単です。

A点が円心であり、B点が円周上の点であり、ABが円の半径であることを想像すると、B点のx座標はコストAにABを掛け、y座標はsinAにABを掛けます。
xを計算して、y座標の時-5-7はまたどうしてですか?
pygameでモデルを描く時、座標はモデルの左上隅でモデルの中心点ではなく、絵でも文字でも他の何でもこのようにするため、いくつかのピクセルを減らして、モデルを正しい位置に表示させます。そうでないと右に下に偏ってしまうので、これからよく使います。
今までは文字盤が描かれていましたが、このような形です。

時計の針を描き始める
まず当面の時間をもらいます。

#     
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)
ここはちょっとテクニックがあります。計算ハウスを見ました。angleの時、後にminute*30/60を加えました。ここで実際にminute/60*(360/12)minuteと書くべきです。彼を60分で割って、12時間で、二つの数字の間の角度は360/12で30度です。
これを加えて、分針を1分ずつ歩かせます。時計の針もそれに応じて少し歩きます。
そして現在の時間を書いて、針の位置を比較します。現在の時間ですか?

#    
    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()
完全コードは以下の通りです

import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")

pos_x = 300
pos_y = 300
radius = 250

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

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


def wrap_angle(angle):
    return abs(angle % 360)


def print_text(font, x, y, text, color):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        exit()

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

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

    #      
    for n in range(1, 13):  # range(x,y)  x   y       y,     1-13
        #   12   ,                     360/12
        #  90         3    ,     12    ,     、  、         
        angle = n * 360 / 12 - 90
        #   x,y 5 7,                           
        # ,            ,           
        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)

    #     
    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)
    #    
    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)

    #    
    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()
効果図

まだ醜いですが、基本機能は全部実現しました。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。