برنامه گربه متحرک

Animated Cat Program

05 آبان 1400
Animated-Cat-Program

پیش گفتار

در این قسمت از آموزش pygame با پویانمایی آشنا می شویم. این قسمت در واقع یک پروژه خیلی کوچک برای مرور آموخته های پیشین است.

پویانمایی

اکنون که می دانیم چطور از Pygame برای نمایش دادن یک پنجره استفاده کنیم،اکنون بیایید با هم تصاویر متحرک درست کنیم. بازی بدون تصاویر متحرک، بسیار کسل کننده خواهد بود. تصاویر متحرک نتیجه کشیدن تصویر های متفاوت یکی پس از دیگری روی صفحه نمایش هستند. گمان کنید پنجره زیر 6 پیکسل طول و 1 پیکسل عرض دارد.از این شش پیکسل یک پیکسل سیاه و بقیه سفید هستند. پیکسل سیاه در موقعیت (0,4) است.

اگر پیکسل سیاه یک خانه عقب آید یعنی در موقعیت (0,3) قرار گیرد، به نظر می رسد که پیکسل سیاه به سمت چپ حرکت کرده است:

اگر را دوباره پیکسل سیاه یک خانه به سمت چپ حرکت کند یعنی در موقعیت (0,3) قرار گیرد، هم چنان به نظر می رسد که پیکسل سیاه به سمت چپ در حال حرکت است:

به نظر می رسد که پیکسل سیاه در حال حرکت است، اما این فقط یک توهم است. به عنوان نمونه اگر سه تصویر زیر را به صورت سرعت پشت سر هم نمایش دهیم، این طور به نظر می رسد که گربه در حال نزدیک شدن به سنجاب است در حالی که تصاویر زیر متفاوت هستند:

کاربر این طور فکر می کند که گربه به سمت سنجاب حرکت می کند ولی برای کامپیوتر، تصویر گربه و سنجاب تنها دسته ای از پیکسل ها هستند. پس برای ساخت انیمیشن در بازی، برنامه باید تصویری را در پنجره بکشد، سپس کسری از ثانیه صبر کنید، و آن گاه تصویر دیگری را ترسیم کند. در زیر یک انیمیشن ساده وجود دارد که به ما نشان می دهد چگونه یک پویانمایی خیلی ساده داشته باشیم. کد زیر را در ویرایشگر خود وارد کنید سپس و آن را به عنوان catanimation.py ذخیره کنید.برای اجرای برنامه به فایل cat.png نیاز داریم. این فایل باید در همان پوشه ای باشد که فایل catanimation.py قرار دارد(پس یادتان نرود که تصویر و فایل پایتون را در یک پوشه بگذارید). می توانید این تصویر را می توانید از سایت http://invpy.com/cat.png دانلود(بارگیری) کنید. کد کامل این برنامه در لینک  http://invpy.com/catanimation.py موجود است.

 

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 30 # frames per second setting
fpsClock = pygame.time.Clock()

# set up the window
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')

WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
direction = 'right'

while True: # the main game loop
    DISPLAYSURF.fill(WHITE)

    if direction == 'right':
        catx += 5
        if catx == 280:
            direction = 'down'
    elif direction == 'down':
        caty += 5
        if caty == 220:
            direction = 'left'
    elif direction == 'left':
        catx -= 5
        if catx == 10:
            direction = 'up'
    elif direction == 'up':
        caty -= 5
        if caty == 10:
            direction = 'right'

    DISPLAYSURF.blit(catImg, (catx, caty))

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()
    fpsClock.tick(FPS)

با اجرای برنامه خواهید دید که گربه حرکت می کند.

فریم ها در ثانیه و اشیا pygame.time.Clock

نرخ فریم یا نرخ تجدید تعداد عکس هایی است که برنامه در هر ثانیه ترسیم می کند و به آن FPS می گویند.FPS در یکای ثانیه اندازه گیری می شود. (در مانیتورهای رایانه ای، نام رایج FPS هرتز است. بسیاری از مانیتورها دارای ضریب فریم 60 هرتز یا 60 فریم در ثانیه هستند.) نرخ فریم پایین در بازی های ویدئویی می تواند بازی را کسل کننده یا هیجان انگیز جلوه دهد. اگر برنامه کد خیلی زیادی برای اجرا داشته باشد، FPS کاهش می یابد. ماژول pygame.time.Clock به ما اطمینان می دهد که برنامه با حداکثر FPS مورد نظر ما اجرا می شود. با استفاده از درنگ های کوچک در هر تکرار از حلقه بازی، این اطمینان حاصل می شود که بازی ما خیلی سریع اجرا نشوند. اگر این درنگ ها را نداشتیم، بازی با سرعت کامپیوتر اجرا می شود که می تواند خیلی سریع تر می شوند باشد. فراخوانی متد ()tick به ما اطمینان می دهد که بازی با همان سرعتی که می خواهیم اجرا می شود.

fpsClock = pygame.time.Clock()

متد tick باید در آخر حلقه بازی، پس از pygame.display.update فراخوانی شود.میزان درنگ یا صبر کردن برای اجرای دور بعدی حلقه، بر این اساس محاسبه می شود که از فراخوانی قبلی تابع tick چقدر گذشته است. باید بدانید که متد tick را یک بار، آن هم در انتهای حلقه اصلی باید فراخوانی کنید.نکته بعدی این است که متد tick باید پس از pygame.display.update فراخوانی شود.

pygame.display.update()
fpsClock.tick(FPS)

با تغییر دادن ثابت FPS خواهید دید که برنامه با سرعت های متفاوتی اجرا می شود. اگر آن را کاهش دهیم، سرعت آن پایین می آید.

کشیدن تصاویر با ()pygame.image.load  و ()blit

اگر بخواهیم اشکال ساده ای مانند دایره و مربع و غیره را در پنجره بکشیم،pygame دارای تابع های ترسیم خوبی برای این کار است، اما بسیاری از بازی ها دارای تصاویر هستند (همچنین به آن ها sprite گفته می شود). Pygame قادر به load (بارگذاری) کردن تصاویر بر روی اشیا Surface است.pygame از فایل هایی با فرمت PNG، JPG، GIF و BMP پشتیبانی می کند. تصویر گربه در فایلی به نام cat.png است. برای استفاده از این تصویر، رشته  'cat.png' را به عنوان پارامتر به تابع pygame.image.load می فرستیم. فراخوانی تابع pygame.image.load یک شی Surface را که دارای تصویر کشیده شده بر روی آن است، برمی گرداند. برای کشیدن تصویر از متد blit استفاده می کنیم. اگر هنگام اجرای برنامه خطایی مانند  "pygame.error: Couldn't open cat.png" دریافت کردید، مطمئن شوید که فایل cat.png در همان پوشه ای است که فایل catanimation.py در آن قرار دارد.

DISPLAYSURF.blit(catImg, (catx, caty))

برای کشیدن تصویر catImg در پنجره از متد blit استفاده می کنیم. blit دو پارامتر می گیرد. پارامتر اول برای تصویر گربه یا هر تصویر دیگر است. پارامتر دوم یک تاپل دو تایی از دو عدد صحیح برای مقادیر X و Y است. X و Y نشان دهنده گوشه چپ بالایی هستند که تصویر باید در آن قرار گیرد. اگر catx و caty با 100 و 200 مقدار دهی شوند و طول تصویر 125 و عرض آن 79 باشد، فراخوانی کردن blit تصویر را بر روی DISPLAYSURF به گونه ای رسم کند که گوشه سمت چپ بالا catImg در مختصات (200, 100) و مختصات گوشه پایین سمت راست تصویر در (225، 279) باشد. بقیه حلقه بازی تغییر متغیرهای catx، caty و direction است تا گربه بتواند در اطراف پنجره حرکت کند.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری بازی‌سازی با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.