pygame 시계 효과 구현

9865 단어 pygame클 록
pygame 으로 시 계 를 만 들 고 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
방금 pygame 을 배 웠 는데 기초 가 너무 나 빠 서 모든 예 를 반복 해서 한 문장 씩 연 구 를 해 야 기본적으로 이해 할 수 있 습 니 다.이번 에는 간단 한 시침,분침,초침 이 있어 서 정확하게 걸 을 수 있 는 시 계 를 만 듭 니 다.예 는 어렵 지 않 지만 기본 적 인 지식 을 습득 할 수 있다.예 를 들 어 xy 좌표 의 계산,원 그리 기,문자 처리 등 이다.백 군 이 만약 에 제 가 참고 할 수 있다 면 저 는 공 부 는 논 리 를 위주 로 하 는 것 이 라 고 생각 합 니 다.그래서 저 는 초학 때의 논리 적 절 차 를 최대한 복원 하고 잔소리 하지 않 으 며 정리 하 겠 습 니 다!
전기 준비
이번에 우리 가 사용 한 것 은 주로 pygame,math,datetime 몇 개의 라 이브 러 리,datetime.today()입 니 다.현재 시간,math.sin()과 math.cos()는 시계 바늘 의 좌 표를 계산 하 는 데 사 용 됩 니 다.사용 하 는 방법 은 주로 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 부터 시작 합 니 다.
math.randians(angle)、math.sin()、math.cos()
여기 가 비교적 돌아 서 원 주 를 옮 겨 다 니 려 면 세 개의 인자,원심 좌표(posx,pos_y),반지름(radius)과 각도(angle)를 계산 한 다음 에 삼각함수 안의 사인 과 코사인 두 함수 에 반지름 을 곱 하여 각 점 의 좌표(x,y)를 계산 하고 사인 과 코사인 함수 에 필요 한 매개 변 수 는 라디안 이 므 로 math.randians(angle)로 각 도 를 라디안 으로 바 꿔 야 한다.
문제 가 생 겼 다.왜 사인 코사인 이 반지름 을 곱 하면 원주 위의 좌 표를 얻 을 수 있 습 니까?
그림 을 보 여 주 는 것 은 간단 하 다.

A 점 은 원심 이 고 B 점 은 원주 위의 점 이 며 AB 는 원 의 반지름 이 라 고 상상 해 보 세 요.그러면 B 점 의 x 좌 표 는 cosA 곱 하기 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)
여기 작은 기술 이 있 습 니 다.계산 hour 를 보 았 습 니 다.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()
효과 도

여전히 못 생 겼 지만 기본 기능 은 모두 실현 되 었 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기