Açılı Şutlar
Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 18 / 31.
Pong'da topun rakete çarptığı yer, topun hangi yöne gideceğini belirler. Üst kenara yakın çarparsa yukarı, alt kenara yakın çarparsa aşağı, ortadan çarparsa dümdüz karşıya gider.
Topun merkezinin raketin merkezine ne kadar uzak olduğunu ölç ve bunu yeni vy değeri yap:
if ball.colliderect(right):
vx = -abs(vx)
vy = (ball.centery - right.centery) // 6Top, raketin ortasının üstüne çarptığında fark negatiftir; bu yüzden top yukarı gider. Altına çarptığında fark pozitiftir. 6'ya bölmek, topun aşırı hızlanmasını önler: en uç noktadan gelen bir vuruşta vy yaklaşık 7 olur.
Böylece Pong bir beceri oyununa dönüşür: topu raketinle yönlendirirsin.
Görev
ZorHer iki raket çarpışmasında da vx ayarlandıktan sonra vy değerini, topun orta noktası ile ilgili raketin orta noktası arasındaki farkı // ile 6'ya bölerek ayarla.
Kendin dene
import pygame
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)
ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
waiting = False
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
left.y -= 6
if keys[pygame.K_s]:
left.y += 6
if keys[pygame.K_UP]:
right.y -= 6
if keys[pygame.K_DOWN]:
right.y += 6
left.clamp_ip(screen.get_rect())
right.clamp_ip(screen.get_rect())
if not waiting:
ball.x += vx
ball.y += vy
if ball.top <= 0 or ball.bottom >= 400:
vy = -vy
if ball.colliderect(left):
vx = abs(vx)
if ball.colliderect(right):
vx = -abs(vx)
if ball.left > 600:
left_score += 1
ball.center = (300, 200)
vx = -vx
waiting = True
if ball.right < 0:
right_score += 1
ball.center = (300, 200)
vx = -vx
waiting = True
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), left)
pygame.draw.rect(screen, (235, 80, 80), right)
pygame.draw.rect(screen, (255, 196, 0), ball)
score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
screen.blit(score, score.get_rect(center=(300, 30)))
if waiting:
message = font.render("Press Space to serve", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(300, 360)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
Kendi başına pratik yap: Pygame playground