کتابخانه Python Arcade شما را از سادهترین انیمیشنهای مبتنی بر رنگ گرفته تا مدلسازی ذرات پیچیده پوشش میدهد.
انیمیشن نقشی حیاتی در افزایش جذابیت بصری و جذابیت بازیهای ویدیویی دارد. کتابخانه Arcade یک چارچوب پایتون برای ایجاد بازی های دو بعدی است. این یک راه ساده و موثر برای گنجاندن انیمیشن ها در پروژه های بازی شما ارائه می دهد.
شما می توانید از کتابخانه Arcade برای ایجاد انیمیشن های حرکتی اولیه و انیمیشن های هماهنگ با رویدادهای بازی استفاده کنید.
یک بازی ساده بسازید
قبل از شروع، مطمئن شوید که پیپ را روی دستگاه خود نصب کرده اید. برای نصب کتابخانه آرکید از این دستور استفاده کنید:
pip install arcade
پس از آن، یک فایل پایتون به نام simple-game.py ایجاد کنید و با راهاندازی یک بازی شروع کنید که بازیکن بتواند به چپ و راست حرکت کند.
کد استفاده شده در این مقاله در این مخزن GitHub موجود است و برای استفاده شما تحت مجوز MIT رایگان است.
با استفاده از کتابخانه Arcade، می توانید یک پنجره ایجاد کنید، محیط بازی را تنظیم کنید و ورودی بازیکن را مدیریت کنید. در اینجا یک قطعه کد برای شروع آمده است:
import arcade
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
class MyGame(arcade.Window):
def __init__(self):
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
self.player_x = SCREEN_WIDTH // 2
self.player_y = SCREEN_HEIGHT // 2
def on_draw(self):
arcade.start_render()
col = arcade.color.BLUE
arcade.draw_circle_filled(self.player_x, self.player_y, 20, col)
def on_key_press(self, key, modifiers):
if key == arcade.key.LEFT:
self.player_x -= 10
elif key == arcade.key.RIGHT:
self.player_x += 10
def main():
game = MyGame()
arcade.run()
if __name__ == "__main__":
main()
انیمیشن حرکت پایه را اضافه کنید
اکنون، بازی خود را یک قدم جلوتر ببرید و انیمیشن حرکتی اولیه را به شی بازیکن اضافه کنید. برای متحرک سازی بازیکن در حین حرکت، 3 دایره مختلف ایجاد کنید و زمانی که بازیکن شروع به حرکت کرد، بین آنها به صورت متوالی تکرار کنید. در اینجا قطعه کد به روز شده برای فایل move-animation.py آمده است:
class MyGame(arcade.Window):
def __init__(self):
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
self.player_x = SCREEN_WIDTH // 2
self.player_y = SCREEN_HEIGHT // 2
self.frame_counter = 0
def on_draw(self):
arcade.start_render()
col1 = arcade.color.BLUE
col2 = arcade.color.GREEN
col3 = arcade.color.RED
if self.frame_counter < 10:
arcade.draw_circle_filled(self.player_x, self.player_y, 20,col1 )
elif self.frame_counter < 20:
arcade.draw_circle_filled(self.player_x, self.player_y, 20,col2 )
else:
arcade.draw_circle_filled(self.player_x, self.player_y, 20, col3)
def on_key_press(self, key, modifiers):
if key == arcade.key.LEFT:
self.player_x -= 10
self.frame_counter = (self.frame_counter + 1) % 30
elif key == arcade.key.RIGHT:
self.player_x += 10
self.frame_counter = (self.frame_counter + 1) % 30
در اینجا یک نمونه فریم خروجی آورده شده است:
کنترل سرعت و جهت انیمیشن
برای کنترل سرعت انیمیشن می توانید سیستم نرخ فریم را معرفی کنید. همچنین می توانید ترتیب فریم ها را بسته به جهت حرکت بازیکن تغییر دهید. هنگامی که بازیکن از چپ به راست حرکت می کند، فریم ها به ترتیب معکوس نمایش داده می شوند.
در اینجا قطعه کد اصلاح شده برای فایل frame-rate.py آمده است:
class MyGame(arcade.Window):
def __init__(self):
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
self.player_x = SCREEN_WIDTH // 2
self.player_y = SCREEN_HEIGHT // 2
self.frame_counter = 0
col1 = arcade.color.BLUE
col2 = arcade.color.GREEN
col3 = arcade.color.RED
self.frames = [col1, col2, col3]
self.frame_rate = 10
def on_draw(self):
arcade.start_render()
frame_index = self.frame_counter // self.frame_rate % len(self.frames)
if self.player_x < SCREEN_WIDTH // 2:
frame_index = len(self.frames) - 1 - frame_index
index = self.frames[frame_index]
arcade.draw_circle_filled(self.player_x, self.player_y, 20, index)
def on_key_press(self, key, modifiers):
if key == arcade.key.LEFT:
self.player_x -= 10
self.frame_counter += 1
elif key == arcade.key.RIGHT:
self.player_x += 10
self.frame_counter += 1
از عملگر مدول % با len(self.frames) استفاده کنید تا مطمئن شوید که frame_index همیشه در محدوده فریم های موجود باقی می ماند. این کار از بروز IndexError در زمانی که انیمیشن در فریم ها حلقه می زند جلوگیری می کند.
مقدار فریم_رایت را برای کنترل سرعت انیمیشن تنظیم کنید و از حرکت متحرک اشیاء بازی خود لذت ببرید.
از جمله ویژگی های اضافی
کتابخانه Arcade ویژگی های مختلفی را برای بهبود انیمیشن های شما فراهم می کند.
اثرات ذرات
شما می توانید افکت های ذرات مانند انفجار یا دود ایجاد کنید تا واقع گرایی را به بازی خود بیافزایید. یک فایل به نام particle.py ایجاد کنید و کد زیر را برای پیاده سازی سیستم ذره ساده با استفاده از پایتون و کتابخانه آرکید اضافه کنید:
import arcade
import random
# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# Colors
WHITE = (255, 255, 255)
# Particle class
class Particle:
def __init__(self, x, y, dx, dy, radius, color, lifespan):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.radius = radius
self.color = color
self.lifespan = lifespan
def update(self):
self.x += self.dx
self.y += self.dy
self.lifespan -= 1
def draw(self):
arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)
# Game class
class MyGame(arcade.Window):
def __init__(self, width, height):
super().__init__(width, height, "Particle Example")
self.particles = []
def setup(self):
# Create particles
for _ in range(100):
x = random.randrange(SCREEN_WIDTH)
y = random.randrange(SCREEN_HEIGHT)
dx = random.uniform(-1, 1)
dy = random.uniform(-1, 1)
radius = random.uniform(2, 5)
color = arcade.color.WHITE
lifespan = random.randint(60, 120)
particle = Particle(x, y, dx, dy, radius, color, lifespan)
self.particles.append(particle)
def on_draw(self):
arcade.start_render()
for particle in self.particles:
particle.draw()
def update(self, delta_time):
for particle in self.particles:
particle.update()
if particle.lifespan <= 0:
self.particles.remove(particle)
def main():
game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
game.setup()
arcade.run()
if __name__ == "__main__":
main()
شما باید انیمیشنی را ببینید که شامل بسیاری از ذرات متحرک است:
انیمیشن های تعاملی
انیمیشن های تعاملی را پیاده سازی کنید که به ورودی های کاربر یا رویدادهای بازی پاسخ می دهند. به عنوان مثال، هنگامی که بازیکن با یک شی تعامل برقرار می کند، می تواند متحرک شود، رنگ را تغییر دهد یا به نوعی تغییر شکل دهد. این انیمیشن های تعاملی بازخورد ارائه می کنند و تعامل بازیکن را با بازی افزایش می دهند. کد فایل interactive-animation.py در اینجا آمده است:
import arcade
# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# Colors
WHITE = (255, 255, 255)
RED = (255, 0, 0)
class MyGame(arcade.Window):
def __init__(self, width, height):
super().__init__(width, height, "Interactive Animation")
self.player_x = 400
self.player_y = 300
self.player_radius = 30
self.player_color = RED
self.animation_radius = 60
self.animation_color = WHITE
self.animation_active = False
def on_draw(self):
arcade.start_render()
arcade.draw_circle_filled(self.player_x,
self.player_y,
self.player_radius,
self.player_color)
if self.animation_active:
arcade.draw_circle_filled(self.player_x,
self.player_y,
self.animation_radius,
self.animation_color)
def on_mouse_press(self, x, y, button, modifiers):
if (self.player_x - self.player_radius <=
x <= self.player_x + self.player_radius and
self.player_y - self.player_radius <=
y <= self.player_y + self.player_radius
):
self.animation_active = True
def update(self, delta_time):
if self.animation_active:
self.animation_radius += 1
if self.animation_radius > 100:
self.animation_active = False
self.animation_radius = 0
def main():
game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()
if __name__ == "__main__":
main()
روشهای لازم، مانند on_draw، on_mouse_press، و بهروزرسانی را برای انجام طراحی پخشکننده و انیمیشن، مدیریت کلیکهای ماوس و بهروزرسانی انیمیشن لغو کنید.
برای ترسیم بازیکن، از تابع arcade.draw_circle_filled استفاده کنید که مختصات (x، y) مرکز، شعاع و رنگ را به عنوان آرگومان می گیرد. تابع draw_circle_filled یکی از ابزارهای Arcade است که می توانید از آن برای ترسیم دارایی های بازی استفاده کنید. در این مورد، می توانید با تغییر شعاع در طول زمان، یک دایره در حال رشد رسم کنید.
روش on_mouse_press زمانی اجرا می شود که کاربر روی ماوس کلیک می کند. بررسی میکند که آیا مختصات ماوس در محدوده شی پخشکننده قرار دارند یا خیر و در صورت وجود، انیمیشن را فعال میکند.
بهترین روش ها برای افزودن انیمیشن
هنگام افزودن انیمیشن به بازی های خود، بهترین روش های زیر را در نظر بگیرید:
تعداد انیمیشن ها را محدود کنید
داشتن انیمیشن های زیاد با فریم های زیاد می تواند بر عملکرد تاثیر بگذارد. تعداد انیمیشن ها یا فریم های مورد نیاز را به حداقل برسانید، به خصوص برای عناصر غیر بحرانی در بازی. سادهسازی انیمیشنها میتواند به حفظ نرخ فریم ثابت و بهینهسازی استفاده از منابع کمک کند.
دسته ای رندر اشیاء مشابه
اشیاء مشابهی که فریمها و بافتهای انیمیشن مشابهی دارند را با هم گروهبندی کنید و آنها را بهصورت دستهای رندر کنید. دستهبندی تعداد تماسهای قرعهکشی را کاهش میدهد و در نتیجه عملکرد بهبود مییابد. این تکنیک مخصوصاً برای متحرک سازی اشیایی که از یک صفحه اسپرایت استفاده می کنند یا دنباله های انیمیشن مشابهی دارند مفید است.
از Interpolation برای انیمیشن صاف استفاده کنید
از تکنیک های درون یابی مانند درون یابی خطی (Lerping) برای دستیابی به انتقال صاف انیمیشن استفاده کنید. درون یابی مقادیر میانی بین فریم های کلیدی انیمیشن را برای ایجاد حرکات سیال محاسبه می کند. این رویکرد از پرش های ناگهانی یا حرکات تند بین فریم ها جلوگیری می کند و در نتیجه انیمیشن های بصری جذاب تری ایجاد می کند.
سرعت و زمان انیمیشن را در نظر بگیرید
برای یافتن تعادل مناسب برای بازی خود، سرعت و زمان بندی انیمیشن های مختلف را آزمایش کنید. مدت زمان فریم را تنظیم کنید یا از دنباله های مختلف انیمیشن برای ایجاد تغییرات در سرعت، شتاب یا کاهش سرعت استفاده کنید. این تنظیمات می تواند عمق و شخصیت را به انیمیشن های بازی شما اضافه کند.
تست و بهینه سازی کنید
به طور منظم انیمیشن های خود را بر روی دستگاه های مختلف تست کنید و عملکرد را نظارت کنید. به دنبال تنگناها یا کاهش سرعت بالقوه باشید و بر این اساس بهینه سازی کنید. این فرآیند به اطمینان از تجربههای متحرک یکنواخت و یکنواخت در طیف گستردهای از دستگاهها کمک میکند.
بازی ها را با انیمیشن جذاب تر کنید
افزودن انیمیشن به بازی های شما می تواند به میزان قابل توجهی درگیری و غوطه وری بازیکن را افزایش دهد. انیمیشن ها بازخورد بصری را به اقدامات بازیکن ارائه می دهند و باعث می شود گیم پلی بصری تر و لذت بخش تر شود. آنها دنیای بازی را زنده می کنند و حس واقع گرایی و هیجان را ایجاد می کنند.
خواه یک کاراکتر در حال اجرا باشد، یک شیء در حال انفجار یا یک افکت انتقال ساده، انیمیشن ها به تجربه بازی پویاتر و جذاب تر کمک می کنند.