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()
효과 도여전히 못 생 겼 지만 기본 기능 은 모두 실현 되 었 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
완전히 처음부터 시작하는 보드 게임의 프로그래밍과 기계 학습 [4 일째]평소 Python의 기본적인 사용법을 배웠으므로, 드디어 Pygame을 사용하여 게임 제작의 입구로 발길을 가고 싶습니다. Pygame은 Simple DirectMedia Layer (SDL)라고 불리는 다른 게임 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.