آموزش بازی‌سازی

چطور با PyGame بازی بسازیم؟ | نحوه استفاده از PyGame برای توسعه بازی

چطور بازی‌ساز شیم!

چطور با PyGame بازی بسازیم؟ در خانه گیر افتاده‌اید و وقت زیادی در اختیار دارید؟ آیا می خواهید چیز جدید و هیجان انگیزی یاد بگیرید؟ اگر شما هم مانند بسیاری از سازندگان گیم هستید، احتمالاً طرحی از بازیتان را در ذهن خود زیر و رو کرده اید. اکنون زمان آن است که امتحان کردن را شروع کنید، مهارت های خود را بهبود بخشید و کمی سرگرم شوید. این راهنما چند مفهوم توسعه بازی را با استفاده از PyGame که مجموعه ای کراس-پلتفرم از ماژول های Python است و برای نوشتن بازی های ویدیویی طراحی شده است، به شما آموزش می دهد.

نیازی نیست چیزی پیچیده یا بیش از حد مهندسی شده ایجاد کنید – یک بازی کلاسیک اسکرول دوبعدی کارتان را راه می‌اندازد.

بیایید شروع کنیم.

نحوه کار با PyGame

ما قصد داریم با استفاده از مراحل زیر یک بازی اسکرول ساده ایجاد کنیم:

  1. Python و PyGame را نصب کنید
  2. پس زمینه را پیاده سازی کنید
  3. پس زمینه را اسکرول کنید
  4. یک حرکت برای ماوس تعریف کنید
  5. همه را کنار هم بگذارید

مرحله ۱ – PyGame را نصب کنید

اولین قدم این است که نسخه ای از پایتون ۳ (مانند ActivePython 3.8) را نصب کنید و سپس pygame را از خط فرمان زیر با استفاده از pip نصب کنید:

python3 -m pip install -U pygame

مرحله ۲ – یک پس زمینه در PyGame پیاده سازی کنید

یک پنجره بسیار ابتدایی با یک تصویر پس زمینه ایجاد می کنیم. به منظور یادگیری مهارت‌های ساخت بازی، بهترین رویکرد این است که یک سری برنامه‌های کوچک را توسعه دهید که فقط یک ویژگی را ارائه می‌دهند، و سپس زمانی که کار با کد دستان آمد، آن‌ها را در برنامه‌های بزرگ‌تر ترکیب کنید.

یک فایل پایتون جدید به نام background_picture_game.py با محتویات زیر ایجاد کنید:

import pygame

import sys

import os

from pygame.locals import *

pygame.init()  # initialize pygame

clock = pygame.time.Clock()

screen = pygame.display.set_mode((600, 480))

# Load the background image here. Make sure the file exists!

bg = pygame.image.load(os.path.join(“./”, “background.png”))

pygame.mouse.set_visible(0)

pygame.display.set_caption(‘Space Age Game’)

# fix indentation

while True:

clock.tick(60)

screen.blit(bg, (0, 0))

x, y = pygame.mouse.get_pos()

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

pygame.display.update()

این کد:

  • pygame را با init() راه‌اندازی می کند،
  • ابعاد صفحه را باset_mode() تنظیم می کند،
  • یک تصویر را باload() بارگیری می کند.

مطمئن شوید که یک تصویر با نام background.png در همان پوشه فایل background_picture_game.py دارید (این کار را هر تصویری قابل انجام است.)

این حلقه اصلی بازی بعد از عبارت while True درج خواهد شد، جایی که:

  • tick(60) (60 FPS) با نرخ فریم همگام می شود،
  • متدblit() تصویر را در مختصات اولیه ترسیم می کند،
  • با فشردن کلید ESC، بر اساس کدی که به رویدادهای خروج گوش می دهد، از بازی خارج می شوید،
  • همچنین می توانید موقعیت فعلی ماوس را با استفاده از ()mouse.get_pos بدست آورید.

حالا بیایید برنامه را با استفاده از خط فرمان زیر اجرا کنیم:

python3 background_picture_game.py

مرحله ۳ – یک پس زمینه را در PyGame اسکرول کنید

اکنون که می‌دانید چگونه پس‌زمینه اضافه کنید، بیایید با اسکرول کردن آن به روش بازی‌های قدیمی خوب مانند ۱۹۴۲ آن را تعاملی‌تر کنیم. ابتدا، باید پس‌زمینه را هنگام بارگذاری برنامه نمایش دهیم و سپس با حرکت دادن محور y در هر به‌روزرسانی، آن را به صورت عمودی اسکرول کنیم، همانطور که در نمودار زیر نشان داده شده است:

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

class ScrollingBackground:

def __init__(self, screenheight, imagefile):

self.img = pygame.image.load(imagefile)

self.coord = [0, 0]

self.coord2 = [0, -screenheight]

self.y_original = self.coord[1]

self.y2_original = self.coord2[1]

برای نشان دادن پس‌زمینه هر بار که به‌روزرسانی می‌کنیم، می‌توانیم از روش surface.blit برای ترسیم تصویر در مختصات فعلی استفاده کنیم:

def Show(self, surface):     surface.blit(self.img, self.coord)     surface.blit(self.img, self.coord2)

سپس باید مختصات تصویر را به‌روزرسانی کنیم تا دفعه بعد که به‌روزرسانی انجام می‌شود، پس‌زمینه به سمت پایین تغییر کند. در اینجا، ما از مکانیک کلاسیک حرکت استفاده می کنیم و فاصله را با استفاده از سرعت و زمان محاسبه می کنیم:

def UpdateCoords(self, speed_y, time):     distance_y = speed_y * time     self.coord[1] += distance_y     self.coord2[1] += distance_y     if self.coord2[1] >= 0:         self.coord[1] = self.y_original         self.coord2[1] = self.y2_original

حالا بیایید همه این کدها را به حلقه اصلی اضافه کنیم. ابتدا یک فایل جدید با نام scrolling_background_game.py ایجاد کنید و سپس کد کلاس ScrollingBackground را به صورت زیر اضافه کنید:

pygame.init()  # initialize pygame clock = pygame.time.Clock() screenwidth, screenheight = (480, 640) screen = pygame.display.set_mode((screenwidth, screenheight))   # Set the framerate framerate = 60   # Set the background scrolling speed bg_speed = 100   # Load the background image here. Make sure the file exists! StarField = ScrollingBackground(screenheight, “background.png”) pygame.mouse.set_visible(0) pygame.display.set_caption(‘Space Age Game’)   # fix indentation while True:     time = clock.tick(framerate)/1000.0     x, y = pygame.mouse.get_pos()        for event in pygame.event.get():         if event.type == pygame.QUIT:             sys.exit()      # Set new Background Coordinates and update the screen     StarField.UpdateCoords(bg_speed, time)     StarField.Show(screen)     pygame.display.update()

توجه داشته باشید که سرعت اسکرول به هزاران ثانیه (زمان/۱۰۰۰) تقسیم می‌شود، بنابراین می‌توانیم کنترل دقیقی روی سرعت اسکرول پس‌زمینه داشته باشیم و سپس مختصات را به‌روزرسانی می‌کنیم و بعد از هر حلقه تصویر را دوباره رندر می‌کنیم.

مرحله ۴متحرک را در PyGame اضافه کنید

حالا می توانیم متحرک (Sprite) به شکل یک سفینه فضایی که کاربر از طریق ماوس آن را کنترل می‌کند، اضافه کنیم. ما می توانیم یک کلاس جدید به نام HeroShip با کد زیر ایجاد کنیم:

class HeroShip:     def __init__(self, screenheight, screenwidth, imagefile):         self.shape = pygame.image.load(imagefile)         self.top = screenheight – self.shape.get_height()         self.left = screenwidth/2 – self.shape.get_width()/2       def Show(self, surface):         surface.blit(self.shape, (self.left, self.top))       def UpdateCoords(self, x):         self.left = x-self.shape.get_width()/2

کد بالا مختصات بالا و سمت چپ سفینه را از ابعاد پنجره مشخص می کند. ما می خواهیم حرکت در امتداد محور x را محدود کنیم، بنابراین فقط مختصات سمت چپ را به روز می کنیم. پارامتر x در روش UpdateCoords توسط موقعیت فعلی ماوس ارائه می شود.

مرحله ۵ – بازی را با استفاده از PyGame اجرا کنید

اکنون می توانیم کد برنامه اصلی خود را با افزودن قطعه زیر درست قبل از حلقه while به روز کنیم:

Hero = HeroShip(screenheight, screenwidth, “ship.png”)

فراموش نکنید که یک تصویر از یک سفینه ایجاد کنید، نام آن را ship.png بگذارید و آن را در پوشه پروژه خود قرار دهید. سپس می توانیم کد زیر را در حلقه while اضافه کنیم:

x, y = pygame.mouse.get_pos() Hero.UpdateCoords(x) Hero.Show(screen)

حالا اگر بازی را دوباره اجرا کنیم، باید بتوانیم سفینه فضایی را ببینیم و با استفاده از ماوس آن را در امتداد محور x حرکت دهیم.

مراحل بعدی

اکنون یاد گرفتیم که پس‌زمینه‌ها و sprites را پیاده‌سازی کنیم و آنها را به حرکت درآوریم. شما می توانید با ایجاد ویژگی‌های بیشتر و افزودن تدریجی کدها مهارت بیشتری در استفاده از Pygame کسب کنید و کارهایی از قبیل زیر را انجام دهید:

  • سفینه فضایی را به شلیک لیزری مجهز کنید.
    • به عنوان مثال، می‌توانیم به رویدادهای کلیک پایین ماوس دقت کنیم
      (event.type == MOUSEBUTTONDOWN) و سپس موقعیت شلیک لیزری را به‌روزرسانی کنیم. می توانید شلیک لیزری را در کلاسی کپسوله کنید که مختصات محور y خود را به روز می کند و خود را دوباره رندر می کند. با حرکت در اطراف محور x، شلیک لیزری جرکت شما را دنبال خواهد کرد.

 

  • دشمنان متحرکی را اضافه کنید که با عبور شلیک لیزری از مسیرشان نابود شوند.
    • برای انجام صحیح این کار به هوش مصنوعی برای کنترل دشمنان و همچنین تشخیص برخورد نیاز است که هر دو موضوعات پیشرفته تری هستند.

Pygame امکانات بی انتهایی دارد و ساخت بازی‌هایی مانند بازی‌های کلاسیک گاتاگا یا Space Invaders را بسیار آسان می‌کند، همچنین این فرآیند را سرگرم‌کننده نیز می‌کند.

امیدواریم این راهنما الهام بخش شما برای طراحی و ساخت بازی های جدید و همچنین کسب اطلاعات بیشتر در مورد ساخت بازی باشد.

مطالب مرتبط
عضویت
اطلاع از
guest
0 Comments
Inline Feedbacks
دیدن همه دیدگاه‌ها
دکمه بازگشت به بالا
0
Would love your thoughts, please comment.x
()
x
بستن
بستن