Menu
CoddyTech

دوّر انطلاقًا من الصورة الأصلية

جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 9 من 36.

كرة شوكية تدور طوال الوقت تنعطف قليلًا في كل إطار. توجد طريقة مغرية لكتابتها، لكنها تؤدي إلى مشكلة:

ball = pygame.transform.rotate(ball, 2)  # خطأ

في كل إطار، تُدار الصورة التي دارت في الإطار السابق. وتضيف كل عملية تدوير إطارًا شفافًا، لذا يزداد حجم Surface بنحو 3 بالمئة في كل إطار: فيصبح ضعف حجمه بعد نصف ثانية، ويبلغ عرضه قرابة 1,800 بكسل بعد ثانيتين. كما تصبح البكسلات أكثر تلطيخًا قليلًا مع كل تدويرة. وسرعان ما تتباطأ اللعبة إلى حد الزحف.

احتفظ بالأصل والزاوية بدلًا من ذلك، وأنشئ الصورة المدارة من الأصل في كل إطار:

angle += 2
spun = pygame.transform.rotate(ball, angle)
screen.blit(spun, spun.get_rect(center=(320, 240)))

الآن تكون spun على بُعد عملية تدوير واحدة من الملف، مهما كانت الزاوية: فلا يتجاوز حجمها أبدًا 67 في 67 بكسل، ولا تصبح أكثر ضبابية من صورة دارت مرة واحدة. وتنطبق القاعدة نفسها على كل تحويل: ابدأ من الأصل، لا من النسخة الأخيرة.

challenge icon

التحدي

متوسط
  1. قبل الحلقة، اجعل angle = 0.
  2. في كل إطار، أضف 2 إلى angle.
  3. أدِر ball الأصلي بمقدار angle وارسم الناتج بحيث يكون مركزه عند (320, 240). لا تغيّر ball نفسه أبدًا.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Spinning Spikes")
clock = pygame.time.Clock()

ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(ball, ball.get_rect(center=(320, 240)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame