می توانید ساده ترین بازی ها را با ذرات متحرک زنده کنید. با استفاده از این تکنیک ها حرکت، انفجار و موارد دیگر را شبیه سازی کنید.
Pygame یک کتابخانه محبوب برای توسعه بازی با استفاده از Python است. در حین ساخت بازی، افزودن جلوه های ویژه می تواند جذابیت بصری و تجربه کلی بازیکنان را تا حد زیادی افزایش دهد.
سیستم های ذرات یک تکنیک قدرتمند برای ایجاد جلوه های پویا و بصری جالب مانند ابرهای گرد و غبار، انفجار، مه و غیره هستند.
یک بازی ساده بسازید
قبل از فرو رفتن در سیستم های ذرات و پیشرفت های بصری، با ایجاد یک بازی ساده با استفاده از Pygame شروع کنید. یک فایل جدید به نام simple-game.py ایجاد کنید و با وارد کردن کتابخانه های لازم و مقداردهی اولیه Pygame شروع کنید. پنجره بازی را با عرض و ارتفاع مشخص تنظیم کنید.
کد استفاده شده در این مقاله در این مخزن GitHub موجود است و برای استفاده شما تحت مجوز MIT رایگان است.
در حلقه اصلی بازی، رویدادهای کاربر را مدیریت کنید و موقعیت بازیکن را بر اساس فشار دادن کلید به روز کنید. با استفاده از pygame.draw.rect یک مستطیل برای شی بازیکن رسم کنید.
در نهایت، پنجره بازی را با استفاده از pygame.display.flip() به روز کنید و زمانی که بازیکن از حلقه خارج شد، بازی را ترک کنید. این بازی ساده به عنوان پایه ای برای افزودن جلوه های ویژه با استفاده از سیستم های ذرات عمل می کند.
شما باید یک مربع سفید به نمایندگی از بازیکن را ببینید که می توانید به چپ و راست حرکت دهید:
ایجاد انواع ذرات
اکنون که بازی ساده خود را تنظیم کرده اید، می توانید سیستم های ذرات مختلفی را اضافه کنید. کلاس های ذرات را برای هر اثر و یک کلاس سیستم ذرات برای مدیریت و به روز رسانی ذرات ایجاد کنید.
اثر ذرات هنگامی که بازیکن در حال حرکت است
اولین اثر ذرات، دنباله ای از ذرات گرد و غبار خواهد بود که از پشت پخش کننده هنگامی که پخش کننده شروع به حرکت با استفاده از ورودی ماوس یا صفحه کلید می کند، ساطع می شود. علاوه بر این، جهت ذرات گرد و غبار با تغییر جهت پخش کننده تغییر می کند.
یک کلاس ذره را تعریف کنید که نشان دهنده یک ذره منفرد باشد. هر ذره دارای یک موقعیت اولیه (x و y)، یک سرعت تصادفی (dx و dy) و یک طول عمر است که تعیین می کند ذره چقدر وجود خواهد داشت.
همچنین یک کلاس ParticleSystem تعریف کنید که مجموعه ای از ذرات را مدیریت می کند. می توانید با استفاده از متد add_particle() یک ذره جدید به سیستم اضافه کنید. متد ()update تمام ذرات موجود در سیستم را به روز می کند و ذراتی را که به پایان عمر خود رسیده اند حذف می کند.
# Particle class
class Particle:
def __init__(self, x, y):
self.x = x
self.y = y
self.dx = random.uniform(-1, 1)
self.dy = random.uniform(-1, 1)
self.lifetime = 60
def update(self):
self.x += self.dx
self.y += self.dy
self.lifetime -= 1
def draw(self, window):
color = (200, 200, 200)
position = (int(self.x), int(self.y))
pygame.draw.circle(window, color, position, 2)
# Particle system class
class ParticleSystem:
def __init__(self):
self.particles = []
def add_particle(self, x, y):
self.particles.append(Particle(x, y))
def update(self):
for particle in self.particles:
particle.update()
if particle.lifetime <= 0:
self.particles.remove(particle)
def draw(self, window):
for particle in self.particles:
particle.draw(window)
برای ادغام سیستم ذرات در بازی خود، باید چند تغییر در حلقه اصلی بازی ایجاد کنید. یک فایل جدید با نام move-particles.py ایجاد کنید و کد را با به روز رسانی های زیر اضافه کنید:
# Create particle system
particle_system = ParticleSystem()
# Main game loop
running = True
clock = pygame.time.Clock()
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
particle_y = player_y + player_height // 2
particle_x = player_x + player_width
keys = pygame.key.get_pressed()
boundary = player_x < window_width - player_width
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= 5
particle_system.add_particle(particle_x, particle_y)
if keys[pygame.K_RIGHT] and boundary:
player_x += 5
particle_system.add_particle(player_x, particle_y)
particle_system.update()
window.fill(BLACK)
player_pos = (player_x, player_y, player_width, player_height)
pygame.draw.rect(window, WHITE, player_pos)
particle_system.draw(window)
pygame.display.flip()
# Quit the game
pygame.quit()
وقتی جسم پخش کننده را اکنون جابه جا می کنید، باید ذراتی را ببینید که بر حرکت تاکید دارند:
اثر انفجار
اثر ذره بعدی یک اثر انفجاری است که زمانی رخ می دهد که بازیکن گلوله ای شلیک کند. اثر انفجار شامل ذرات قرمز رنگی است که از موقعیت گلوله ساطع می شوند.
یک کلاس Particle مشابه کلاس قبلی تعریف کنید، اما این بار یک پارامتر رنگ برای نشان دادن رنگ ذره اضافه کنید.
همچنین، کلاس ParticleSystem را برای کنترل نوع ذرات جدید به روز کنید. متد add_particle() اکنون یک پارامتر رنگ اضافی می گیرد و ذرات با رنگ مشخص شده ایجاد می کند.
# Particle class
class Particle:
def __init__(self, x, y, color):
self.x = x
self.y = y
self.dx = random.uniform(-2, 2)
self.dy = random.uniform(-2, 2)
self.lifetime = 30
self.color = color
def update(self):
self.x += self.dx
self.y += self.dy
self.lifetime -= 1
def draw(self, window):
position = (int(self.x), int(self.y))
pygame.draw.circle(window, self.color, position, 3)
# Particle system class
class ParticleSystem:
def __init__(self):
self.particles = []
def add_particle(self, x, y, color):
self.particles.append(Particle(x, y,color)
def update(self):
for particle in self.particles:
particle.update()
if particle.lifetime <= 0:
self.particles.remove(particle)
def draw(self, window):
for particle in self.particles:
particle.draw(window)
برای ادغام افکت انفجار در بازی خود، باید چند تغییر در حلقه اصلی بازی ایجاد کنید. یک نام فایل جدید shoot-particle.py ایجاد کنید و کد را با به روز رسانی های زیر اضافه کنید:
# Create particle system
particle_system = ParticleSystem()
# Main game loop
running = True
clock = pygame.time.Clock()
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
boundary = player_x < window_width - player_width
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= 5
if keys[pygame.K_RIGHT] and boundary:
player_x += 5
if keys[pygame.K_SPACE]:
bullet_x = player_x + player_width // 2
bullet_y = player_y
particle_system.add_particle(bullet_x, bullet_y, RED)
particle_system.update()
window.fill(BLACK)
player_pos = (player_x, player_y, player_width, player_height)
pygame.draw.rect(window, WHITE, player_pos)
particle_system.draw(window)
pygame.display.flip()
# Quit the game
pygame.quit()
در اینجا خروجی است:
هنگامی که نوار فاصله ( pygame.K_SPACE) فشار داده شد، یک ذره به سیستم ذرات در موقعیت گلوله اضافه کنید. این باعث ایجاد اثر انفجار با ذرات قرمز می شود.
اثر گرد و غبار
آخرین پیشرفت بصری که می توانید پیاده سازی کنید یک افکت پس زمینه گرد و غبار است. اثر گرد و غبار شامل ذرات خاکستری کوچکی است که در یک الگوی دایره ای حرکت می کنند و پس زمینه ای پویا و غبارآلود ایجاد می کنند.
کلاس Particle را به روز کنید تا برای هر ذره یک زاویه و سرعت داشته باشد. زاویه جهت حرکت را تعیین می کند و سرعت سرعت حرکت ذرات را در الگوی دایره ای خود کنترل می کند. متد update() را تغییر دهید تا موقعیت هر ذره بر اساس زاویه و سرعت آن به روز شود.
همچنین، کلاس ParticleSystem را برای مدیریت رفتار ذرات جدید به روز کنید. اکنون ذرات به صورت دایره ای در پنجره بازی حرکت می کنند.
# Particle class
class Particle:
def __init__(self, x, y, radius):
self.x = x
self.y = y
self.radius = radius
self.angle = random.uniform(0, 2 * math.pi)
self.speed = random.uniform(0.5, 1.5)
def update(self):
self.angle += 0.02
self.x += math.cos(self.angle) * self.speed
self.y += math.sin(self.angle) * self.speed
if self.x < 0:
self.x = window_width
elif self.x > window_width:
self.x = 0
if self.y < 0:
self.y = window_height
elif self.y > window_height:
self.y = 0
def draw(self, window):
color = (128, 128, 128)
pos = (int(self.x), int(self.y))
radius = int(self.radius)
pygame.draw.circle(window, color, pos, radius)
# Particle system class
class ParticleSystem:
def __init__(self):
self.particles = []
def add_particle(self, x, y, radius):
self.particles.append(Particle(x, y, radius))
def update(self):
for particle in self.particles:
particle.update()
def draw(self, window):
for particle in self.particles:
particle.draw(window)
برای ادغام جلوه گرد و غبار در بازی خود، باید چند تغییر در حلقه اصلی بازی ایجاد کنید. یک فایل جدید به نام dust-particle.py ایجاد کنید و کد را با به روز رسانی های زیر اضافه کنید:
# Create particle system for dust effect
particle_system = ParticleSystem()
# Main game loop
running = True
clock = pygame.time.Clock()
while running:
dt = clock.tick(60) / 1000.0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
particle_x = random.randint(0, window_width)
particle_y = random.randint(0, window_height)
particle_system.add_particle(particle_x, particle_y, 1)
particle_system.update()
window.fill((0, 0, 0))
particle_system.draw(window)
pygame.display.flip()
# Quit the game
pygame.quit()
با استفاده از تابع ()random.randint ذرات را به طور تصادفی در پنجره بازی اضافه کنید. هر ذره شعاع اولیه 1 دارد. سیستم ذرات را به روز کنید و روی پنجره بازی ترسیم کنید و یک افکت پس زمینه پویا و گرد و غبار ایجاد کنید.
شما باید ذرات زیادی را روی صفحه ببینید که به صورت تصادفی اما هموار حرکت می کنند:
بهترین روش ها برای جلوه های ویژه
هنگام افزودن جلوه های ویژه به بازی Pygame خود، بهترین روش های زیر را در نظر بگیرید:
بهینه سازی عملکرد
سیستمهای ذرات میتوانند شامل تعداد زیادی ذره باشند که میتواند بر عملکرد بازی تأثیر بگذارد. تکنیک هایی مانند پارتیشن بندی فضایی (به عنوان مثال، Quadtree) را برای بهینه سازی به روز رسانی ذرات و ترسیم پیاده سازی کنید.
بازیافت ذرات
به جای ایجاد و از بین بردن ذرات در هر قاب، استفاده مجدد از ذرات را با تنظیم مجدد خواص آنها در زمانی که به پایان عمرشان می رسند در نظر بگیرید. این به به حداقل رساندن تخصیص و عدم تخصیص حافظه کمک می کند.
ادغام ذرات
مجموعه ای از ذرات از پیش تخصیص داده شده را برای جلوگیری از سربار ایجاد نمونه های جدید در زمان اجرا حفظ کنید. این می تواند عملکرد را بهبود بخشد و از تکه تکه شدن حافظه بکاهد.
محدود کردن تعداد ذرات
برای جلوگیری از نفوذ سیستم های ذرات به صفحه بازی، محدودیت هایی را برای حداکثر تعداد ذرات تعیین کنید و زمانی که به این حد رسیدند، ذرات را حذف کنید. این تضمین می کند که جلوه ها از نظر بصری جذاب باقی می مانند بدون اینکه مانع از گیم پلی بازی شوند.
سازگاری بصری
یک سبک بصری ثابت در طول بازی خود، از جمله جلوه های ذرات، حفظ کنید. اطمینان حاصل کنید که رنگها، اندازهها و الگوهای حرکتی ذرات با تم کلی و سبک هنری هماهنگ هستند.
جلوه های صوتی
افکت های صوتی را برای تکمیل جلوه های ذرات خود اضافه کنید. به عنوان مثال، هنگامی که یک افکت انفجار رخ می دهد، صداهای انفجار را پخش کنید یا هنگامی که جلوه های مه یا گرد و غبار فعال هستند، صداهای محیط را پخش کنید.
با جلوه های ویژه بازی ها را سرگرم کننده تر کنید
افزودن جلوههای ویژه، مانند سیستمهای ذرات، به بازیهای Pygame شما میتواند تجربه بازیکن را تا حد زیادی افزایش دهد و بازیهای شما را برای بازیکنان جذابتر و سرگرمکنندهتر کند. با اجرای جلوه های ذرات مانند مسیرها، انفجارها، مه و گرد و غبار، می توانید محیط های بصری خیره کننده و پویا ایجاد کنید.
به یاد داشته باشید که هنگام استفاده از جلوه های ویژه در بازی های خود، بهینه سازی عملکرد، بازیافت ذرات و ثبات بصری را در نظر بگیرید. با خلاقیت و آزمایش، می توانید بازی های Pygame خود را به سطح بالاتری ببرید و بازیکنان را با تجربه های همه جانبه و هیجان انگیز مجذوب خود کنید.