آموزش ساخت بازی اندروید با پایتون (دوبعدی و سه بعدی)
پایتون به عنوان یکی از زبانهای برنامهنویسی مبتدیپسند و انعطافپذیر شناخته شده است. اما در حالی که پایتون تجربهای فوقالعاده برای تازهکاران حتی با کمترین تجربه فراهم میکند، در بعضی جهات فهمیدن و آشنایی با آن میتواند گیجکنندهتر باشد. پایتون آنقدر انعطافپذیر است که بلافاصله مشخص نمیشود که با آن چه کارهایی میتوانید انجام دهید.
برای مثال، ممکن است تعداد زیادی آموزش بخوانید و باز هم متوجه نشوید که چگونه یک بازی در پایتون بسازید یا چگونه یک برنامه وب بسازید. در این پست ساخت بازی دوبعدی و سه بعدی در پایتون مورد بررسی قرار می گیرد.
ساخت بازی دوبعدی با Pygame
در این قسمت ، میخواهیم در مورد چگونگی ساخت یک بازی بسیار ساده دو بعدی در پایتون با استفاده از Pygame، مجموعهای محبوب از ماژولها که برای تسهیل در ایجاد بازیهای ساده طراحی شدهاند، صحبت کنیم.
Pygame چیست؟
یکی از مواردی که میتواند برای توسعهدهندگان تازهکار پیچیده باشد، این است که زبانهای برنامهنویسی به ندرت به صورت مستقل وجود دارند. برای مثال، هنگامی که یک برنامه اندرویدی میسازید، نه تنها باید از جاوا یا کاتلین (دو زبان برنامهنویسی اصلی که توسط گوگل پشتیبانی میشوند) استفاده کنید، بلکه باید از Android SDK نیز استفاده کنید. این کیت توسعه نرمافزار شامل مجموعهای از کتابخانهها، کلاسها و ابزارهای مختلف است که کد جاوا را بر روی اندروید کارآمد کرده و به آن دسترسی به ویژگیهایی میدهد که مختص پلتفرمهای موبایل هستند.
پایتون نیز به همین صورت است. یادگیری پایتون به تنهایی برای شروع ساخت برنامهها کافی نیست: شما نیاز به کدهای اضافی ارائهشده توسط توسعهدهندگان دیگر دارید تا آن برنامهها کار کنند. در پایتون، این ابزارهای خارجی معمولاً به صورت ماژول وجود دارند. اینها برنامههای کوچک پایتونی هستند که عملکردهای مفیدی انجام میدهند که میتوانند تولید شما را پشتیبانی کنند.
Pygame یکی از چنین مجموعههای ماژولها است. و همانطور که از نامش پیداست، Pygame بسیاری از توابعی را که برای توسعه بازی مفید هستند، فراهم میکند. این به معنای کارهایی مانند رسم گرافیک روی صفحه و پخش صدا است. با ارائه توابع آماده مانند این، Pygame میتواند مقدار زیادی از کارهای توسعهدهنده را کاهش داده و فرآیند را سادهتر کند. بنابراین، وقتی میپرسید چگونه میتوان یک بازی در پایتون ساخت، اکثر افراد به شما خواهند گفت که از Pygame استفاده کنید!
با این حال، کسانی که به موتورهای بازیسازی جامعتر و محیطهای توسعه یکپارچه (IDEs) مانند Unity عادت دارند، ممکن است Pygame را نسبتاً ساده و ابتدایی بیابند. شما در اینجا فیزیک داخلی یا رابط کاربری پر زرق و برق کشیدن و رها کردن (drag-and-drop) را نخواهید یافت! اما در حالی که این ممکن است مقدار کار شما را به عنوان یک توسعهدهنده افزایش دهد، همچنین به شما آزادی میدهد تا از تخیل خود استفاده کرده و پروژه بازی خود را کاملاً از ابتدا طراحی کنید.
PyGame چگونه کار میکند؟
PyGame یک ابزار برای ساخت بازیهای ویدیویی است که بر اساس کتابخانهای به نام Simple DirectMedia Layer (SDL) ساخته شده است. این کتابخانه به شما کمک میکند تا با دستگاههای ورودی مثل کیبورد، ماوس یا جویاستیک و دستگاههای خروجی مثل صفحه نمایش یا بلندگو ارتباط برقرار کنید.
هدف PyGame این است که توسعه بازیهای ویدیویی را بدون نیاز به کار با زبانهای پیچیده مثل C سادهتر کند. با استفاده از PyGame، نیازی نیست که یک موتور بازی از صفر بسازید، چون این ابزار بسیاری از عملکردهای مورد نیاز برای بازیها را از قبل آماده کرده است. این ویژگی به شما اجازه میدهد تا بیشتر بر روی طراحی و محتوای بازی تمرکز کنید.
علاوه بر این، SDL امکاناتی مانند ریاضیات برداری، تشخیص برخورد، مدیریت اشیاء دو بعدی، دستکاری ماتریس پیکسل، تغییرات و رسم را فراهم میکند. همچنین از MIDI و فونتهای freetype پشتیبانی میکند.
شما میتوانید برنامههای ساخته شده با PyGame را بر روی گوشیها و تبلتهای اندرویدی اجرا کنید، که شامل امکاناتی مانند صدا، لرزش، ورودی کیبورد و شتابسنج میشود.
اجزای PyGame
PyGame شامل چهار جزء اصلی است. برای ساخت یک بازی با این ابزار، لازم است که این اجزا را به خوبی بشناسید.
ابتدا، `()pygame.init` برای راهاندازی تمامی ماژولهای PyGame استفاده میشود. این دستور بهصورت یکجا تمامی ماژولهای لازم برای برنامه را فعال میکند.
صفحه نمایش (Display Surface) یک صفحه سیاه است که به عنوان بوم برای طراحی بازی عمل میکند. تمام عناصر بازی بر روی این صفحه نمایش داده میشوند.
حلقه بازی (Game Loop) کدی است که منطق اصلی بازی را اجرا میکند. این حلقه قوانین بازی را تعریف میکند و رویدادها را مدیریت و بهروزرسانی میکند.
در نهایت، `()pygame.quit` برای خاموش کردن PyGame استفاده میشود. این دستور تمامی ماژولهای PyGame را غیرفعال میکند، اما بازی را نمیبندد.
چه نوع بازیهایی میتوان با PyGame ساخت؟
با PyGame میتوانید انواع مختلفی از بازیها بسازید، از بازیهای ساده متنی گرفته تا بازیهای گرافیکی پیچیده. به عنوان مثال، میتوانید بازیهای تختهای مانند شطرنج، چکرز، سودوکو، یا بازیهای گرافیکی مانند Snake، Flappy Bird یا مسابقه اتومبیل رانی بسازید. همچنین میتوانید بازیهای پلتفرمی که شامل انیمیشن هستند را ایجاد کنید. اگرچه ساخت بازیهای پیچیدهتر با PyGame امکانپذیر است، اما ممکن است با محدودیتهایی مواجه شوید.
به عنوان مثالهایی از بازیهای ساخته شده با PyGame میتوان به بازیهایی مثل Snake، Frets on Fire، Dangerous High School Girls in Trouble، Drawn Down Abyss، و Save the Date اشاره کرد.
چگونه یک بازی در پایتون بسازیم - یک پروژه ساده برای شروع
قصد دارم روش خودم را برای این آموزش کمی تغییر دهم. به جای اینکه بازی را قدم به قدم توضیح دهم، کد را به شما ارائه میدهم و سپس بررسی میکنیم که چگونه کار میکند. ابتدا شما باید کد زیر را جایگذاری کنید:
import pygame
pygame.init()
win = pygame.display.set_mode((1280, 720))
pygame.display.set_caption("Squarey")
x = 100
y = 100
baddyX = 300
baddyY = 300
vel = 6
baddyVel = 4
run = True
def draw_game():
win.fill((0, 0, 0))
pygame.draw.rect(win, (0, 0, 255), (x, y, 20, 20))
pygame.draw.rect(win, (255, 0, 0), (baddyX, baddyY, 40, 40))
pygame.display.update()
while run:
pygame.time.delay(100)
if baddyX < x - 10: baddyX = baddyX + baddyVel drawGame() elif baddyX > x + 10:
drawGame()
baddyX = baddyX - baddyVel
elif baddyY < y - 10: baddyY = baddyY + baddyVel elif baddyY > y + 10:
baddyY = baddyY - baddyVel
else:
run = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= vel
if keys[pygame.K_RIGHT]:
x += vel
if keys[pygame.K_UP]:
y -= vel
if keys[pygame.K_DOWN]:
y += vel
draw_game()
pygame.quit()
پس از آن دکمه پخش را بزنید! باید با یک بازی مواجه شوید که به شما اجازه میدهد یک مربع سبز کوچک را روی صفحه کنترل کنید و سعی کنید از دست یک مربع قرمز فرار کنید. هیجانانگیز است!
هوش مصنوعی چیست؟ اجزای آن، انواع آن و همه نکات کاربردی
این کدها چیستند؟
تبریک میگویم! شما بهتازگی یاد گرفتید که چگونه یک بازی در پایتون بسازید! البته، احتمالاً نمیدانید که این کدها چه کار میکنند یا چرا به این روش نوشته شدهاند. پس بیایید با هم مرور کنیم، موافقید؟
ابتدا ماژول Pygame را با خط `import pygame` وارد میکنیم. احتمالاً این ماژول از قبل روی سیستم شما نصب شده است و بهصورت پیشفرض با نصب پایتون همراه بوده است. اگر نصب نشده باشد، میتوانید آن را با استفاده از pip نصب کنید. همچنین باید Pygame را با `()pygame.init` مقداردهی اولیه کنیم. سپس، یک پنجره برای نمایش بازی خود ایجاد میکنیم. دستور `set_caption` به ما اجازه میدهد عنوانی برای بازی خود تعیین کنیم که در بالای پنجره نمایش داده میشود.
import pygame
pygame.init()
win = pygame.display.set_mode((1280, 720))
pygame.display.set_caption("Squarey")
در بخش بعدی، مجموعهای از متغیرها را تعریف میکنیم که شامل مختصات خودمان و دشمن، سرعت خودمان و دشمن، و یک مقدار بولی (True یا False) است که نشان میدهد آیا بازی در حال اجرا است یا نه.
x = 100
y = 100
baddyX = 300
baddyY = 300
vel = 6
baddyVel = 4
run = True
تابع کوچکی به نام ()drawGame در ادامه وجود دارد. در این تابع، ابتدا صفحه را با یک رنگ خالی (سیاه) پر میکنیم. این کار باعث میشود بتوانیم موقعیت شخصیتهای خود را جابجا کنیم بدون اینکه ردپایی به جا بماند. گزینه دیگر این است که شخصیتها را با رنگ سیاه روی خودشان بکشیم.
سپس دو مربع را رسم میکنیم. ما آنها را داخل پنجره قرار میدهیم، به آنها کدهای رنگی RGB اختصاص میدهیم و سپس مختصات X و Y را قبل از اضافه کردن عرض و ارتفاع تنظیم میکنیم. به خاطر داشته باشید: در امتداد راهرو و پایین پلهها! فکر کردم منطقی است که آدم بد را کمی بزرگتر از آدم خوب بسازیم و او را با رنگ قرمز ترسناک کنیم!
در نهایت، تابع ()pygame.display.update را فراخوانی میکنیم تا این عناصر واقعاً روی صفحه نمایش داده شوند.
def draw_game():
win.fill((0, 0, 0))
pygame.draw.rect(win, (0, 0, 255), (x, y, 20, 20))
pygame.draw.rect(win, (255, 0, 0), (baddyX, baddyY, 40, 40))
pygame.display.update()
چگونه یک حلقه بازی در پایتون ایجاد کنیم؟
قسمت بعدی کد جایی است که واقعاً سرگرمی شروع میشود. این قسمت، "الگوی پایهای" است که در بسیاری از پروژههای Pygame خواهید دید. اساساً، این یک حلقه است که تا زمانی که مقدار run برابر با True باشد، ادامه خواهد داشت.
در خط اول این حلقه، یک تأخیر کوتاه ایجاد میکنیم. این تأخیر باعث میشود تا "نرخ فریم" تنظیم شده و از وقوع سریع اتفاقات که ممکن است قابل مشاهده نباشند، جلوگیری کند.
while run:
pygame.time.delay(100)
آموزش کامل هوش مصنوعی: آموزش هوش مصنوعی از صفر تا صد با 14 درس+ جزوه
در این حلقه، تمام کارهایی که میخواهیم به صورت مکرر انجام شوند، قرار میگیرند. اولین کاری که اینجا انجام میدهیم، تعیین رفتار دشمن است. از دستورات if و elif (else if) استفاده میکنیم تا جریان کد را کنترل کنیم. اگر مختصات بازیکن بیشتر از مختصات دشمن باشد، دشمن به سمت بازیکن حرکت میکند. از آنجا که شخصیتها با هر حرکت چند پیکسل جابجا میشوند (که با متغیرهای vel و baddyVel تعریف شدهاند)، کمی فضای خطا در نظر گرفتهایم.
if baddyX < x - 10: baddyX = baddyX + baddyVel drawGame() elif baddyX > x + 10:
drawGame()
baddyX = baddyX - baddyVel
elif baddyY < y - 10: baddyY = baddyY + baddyVel elif baddyY > y + 10:
baddyY = baddyY - baddyVel
else:
3 مهارت برتر مهندسان کامپیوتر! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی عالی با هک، متلب و برنامه نویسی... دانلود:
run = False
اگر مختصاتها در محدوده 10 پیکسل از بازیکن قرار بگیرند، بازی تمام میشود! مقدار run به False تنظیم شده و برنامه از حلقه خارج میشود. در نهایت، دستور پایانی بعد از حلقه بازی را خاتمه میدهد.
البته هنوز کمی ناخوشایند است، زیرا مختصاتها گوشه بالای سمت چپ مربع را تنظیم میکنند، نه مرکز آن را. این باعث میشود تشخیص برخورد دقیق نباشد و اگر واقعاً در حال ساخت یک بازی بودید، باید محاسباتی انجام دهید تا مطمئن شوید بازی وقتی که شخصیتها با هم تماس پیدا میکنند، تمام شود.
توجه کنید که هر بار دشمن موقعیت خود را تغییر میدهد، تابع ()drawGame را فراخوانی کرده و صفحه را تازه میکنیم.
در نهایت، باید ورودی بازیکن را دریافت کرده و شخصیت بازیکن را بر اساس آن حرکت دهیم. خوشبختانه، Pygame این کار را بسیار آسان کرده است:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= vel
if keys[pygame.K_RIGHT]:
x += vel
if keys[pygame.K_UP]:
y -= vel
if keys[pygame.K_DOWN]:
y += vel
draw_game()
همانطور که ممکن است متوجه شده باشید، قسمت اول این کد همچنین به بازیکن اجازه میدهد با کلیک روی دکمه ضربدر از بازی خارج شود.
در نهایت، وقتی حلقه تمام شد، از بازی خارج میشویم!
بلد باشید: ماشین لرنینگ و هوش مصنوعی و یادگیری عمیق (مقایسه کامل)
ساخت بازیهای سهبعدی با Panda3D
Panda3D یک موتور بازیسازی سهبعدی است که توسط شرکت دیزنی توسعه یافته و به صورت بازمتن منتشر شده است. این موتور امکان توسعه بازیهای سهبعدی با استفاده از پایتون را فراهم میکند. با استفاده از Panda3D، توسعهدهندگان میتوانند بازیهای پیچیده و واقعگرایانهای بسازند که بر روی پلتفرمهای مختلف اجرا میشوند. این موتور نه تنها از قدرت بالای پایتون بهره میبرد بلکه امکاناتی چون رندرینگ سهبعدی پیشرفته، مدیریت منابع و فیزیک واقعی را نیز در اختیار کاربران قرار میدهد.
ایجاد اولین بازی سهبعدی
بارگذاری مدلهای سهبعدی
برای شروع ساخت یک بازی سهبعدی با Panda3D، ابتدا نیاز داریم تا مدلهای سهبعدی را بارگذاری کنیم. مدلهای سهبعدی، اجسام یا شخصیتهایی هستند که در بازی استفاده میشوند. این مدلها میتوانند توسط ابزارهای مختلفی چون Blender، Maya یا 3ds Max ساخته شوند و سپس به فرمتهای مورد پشتیبانی Panda3D مانند .egg یا .bam تبدیل شوند.
from direct.showbase.ShowBase import ShowBase
class MyGame(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.environ = self.loader.loadModel("models/environment")
self.environ.reparentTo(self.render)
self.environ.setScale(0.25, 0.25, 0.25)
self.environ.setPos(-8, 42, 0)
game = MyGame()
game.run()
در این مثال، یک مدل سهبعدی از یک محیط بارگذاری و در صحنه بازی قرار داده میشود.
مدیریت دوربین و حرکتها
مدیریت دوربین در بازیهای سهبعدی بسیار مهم است. دوربین تعیین میکند که بازیکن از چه زاویهای و چه فاصلهای به محیط بازی نگاه کند. Panda3D ابزارهای قدرتمندی برای مدیریت دوربین فراهم کرده است.
self.camera.setPos(0, -10, 10)
self.camera.lookAt(self.environ)
ین کد دوربین را در موقعیت مشخصی قرار داده و آن را به سمت محیط بازی تنظیم میکند.
افزودن نورپردازی و افکتها
نورپردازی یکی از عناصر کلیدی در بازیهای سهبعدی است که به ایجاد واقعگرایی و جذابیت بصری کمک میکند. Panda3D امکاناتی برای افزودن انواع نورپردازیها و افکتهای نوری فراهم میکند.
from panda3d.core import PointLight
plight = PointLight('plight')
plight.setColor((1, 1, 1, 1))
plnp = self.render.attachNewNode(plight)
plnp.setPos(10, 20, 0)
self.render.setLight(plnp)
در این مثال، یک نور نقطهای به صحنه بازی اضافه میشود.
یادگیری ماشین با پایتون با 12 درس+ کتاب یادگیری ماشین
تعامل با اشیاء سهبعدی
تعامل با اشیاء سهبعدی شامل مواردی چون کلیک کردن، حرکت دادن و تغییر ویژگیهای آنها میشود. Panda3D ابزارهایی برای مدیریت این تعاملات فراهم کرده است.
self.picker = CollisionTraverser()
self.pq = CollisionHandlerQueue()
self.pickerNode = CollisionNode('mouseRay')
self.pickerNP = self.camera.attachNewNode(self.pickerNode)
self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
self.picker.addCollider(self.pickerNP, self.pq)
این کد بخشی از تنظیمات برای تعامل با اشیاء سهبعدی از طریق ماوس است.
پروژه نمونه: بازی ماجراجویی سهبعدی
طراحی محیط و شخصیتها
در این بخش، محیط و شخصیتهای بازی طراحی و پیادهسازی میشوند. محیط بازی شامل زمین، ساختمانها، درختان و سایر اجسام است که بازیکن در آن حرکت میکند. شخصیتها شامل بازیکن و دشمنان یا دوستانی هستند که در بازی وجود دارند.
self.character = self.loader.loadModel("models/character")
self.character.reparentTo(self.render)
self.character.setScale(0.5, 0.5, 0.5)
self.character.setPos(0, 0, 0)
این کد یک شخصیت را بارگذاری کرده و آن را در محیط بازی قرار میدهد.
فوق العاده ضروری: آموزش 0 تا 100 برنامه نویسی اندروید با پایتون (16 درس)
پیادهسازی سیستم حرکت و مبارزه
برای پیادهسازی سیستم حرکت، نیاز به مدیریت ورودیهای بازیکن (مانند کلیدهای کیبورد) و واکنش شخصیت به این ورودیها داریم.
def updateTask(task):
dt = globalClock.getDt()
if self.keyMap["forward"]:
self.character.setY(self.character, 10 * dt)
if self.keyMap["backward"]:
self.character.setY(self.character, -10 * dt)
if self.keyMap["left"]:
self.character.setX(self.character, -10 * dt)
if self.keyMap["right"]:
self.character.setX(self.character, 10 * dt)
return task.cont
self.taskMgr.add(updateTask, "update")
این کد ورودیهای کلیدهای کیبورد را برای حرکت شخصیت در جهات مختلف مدیریت میکند.
افزودن پازلها و چالشها
برای افزودن جذابیت به بازی، میتوانیم پازلها و چالشهایی در بازی ایجاد کنیم که بازیکن باید آنها را حل کند یا بر آنها غلبه کند. این چالشها میتوانند شامل حل معماها، یافتن اشیاء مخفی یا شکست دادن دشمنان باشند.
def checkCollision(task):
entries = list(self.pq.getEntries())
for entry in entries:
if entry.getIntoNodePath().getName() == "goal":
self.showWinMessage()
return task.cont
self.taskMgr.add(checkCollision, "collisionCheck")
این کد بررسی میکند که آیا شخصیت با یک هدف خاص برخورد کرده است یا خیر و در صورت برخورد، پیغام پیروزی نمایش داده میشود.
آموزش بازی سازی از صفر تا صد (20 درس رایگان)
پیادهسازی رابط کاربری و سیستم امتیازدهی
رابط کاربری و سیستم امتیازدهی از جمله اجزای مهم یک بازی هستند که تجربه کاربری را بهبود میبخشند. Panda3D امکاناتی برای ساخت و نمایش رابطهای کاربری فراهم میکند.
from direct.gui.OnscreenText import OnscreenText
self.score = 0
self.scoreText = OnscreenText(text=f"Score: {self.score}", pos=(-1.2, 0.95), scale=0.07)
def updateScore(points):
self.score += points
self.scoreText.setText(f"Score: {self.score}")
این کد یک متن روی صفحه برای نمایش امتیاز بازیکن ایجاد کرده و تابعی برای بهروزرسانی امتیاز تعریف میکند.این مراحل و کدها تنها بخشی از امکانات و تواناییهای Panda3D برای ساخت بازیهای سهبعدی هستند. با ادامه یادگیری و استفاده از این موتور بازیسازی، میتوان بازیهای پیچیده و جذابتری را توسعه داد.
این نمونه ها رو ببینید: 6 اپلیکیشن های معروف ساخته شده با پایتون (و بازیهای پایتونی)
نتیجه گیری
در نتیجه، یادگیری ساخت بازیهای اندروید با استفاده از پایتون، چه به صورت دوبعدی و چه به صورت سهبعدی، یک مهارت ارزشمند و هیجانانگیز است که میتواند درهای جدیدی را به روی توسعهدهندگان باز کند. استفاده از کتابخانههایی مانند Pygame برای بازیهای دوبعدی و Panda3D یا Godot برای بازیهای سهبعدی، این امکان را فراهم میکند که با زبانی ساده و قدرتمند مانند پایتون، بازیهای خلاقانه و جذابی بسازیم.
این دوره آموزشی به شما نشان داد که چگونه میتوانید با مفاهیم پایهای برنامهنویسی بازیها، از طراحی اولیه تا پیادهسازی نهایی، یک بازی کامل ایجاد کنید. از تعریف متغیرها و حلقههای بازی گرفته تا مدیریت ورودی کاربر و برخوردهای فیزیکی، شما اکنون با اصول و تکنیکهای لازم برای ساخت بازیهای دوبعدی و سهبعدی آشنا هستید.
با ادامه تمرین و آزمایش، میتوانید مهارتهای خود را ارتقا داده و بازیهای پیچیدهتر و جذابتری بسازید. به خاطر داشته باشید که موفقیت در این راه نیازمند صبر، پشتکار و خلاقیت است. پس از همین امروز شروع کنید، ایدههای خود را به واقعیت تبدیل کنید و از فرآیند ساخت بازی لذت ببرید!