كيفية إضافة لاعب إلى لعبة Python بايثون "PyCharm"
اليك كيفية إضافة لاعب إلى لعبة Python الخاصة بك
هذا المقال هو الجزء الثالث من سلسلة حول بناء لعبة من الصفر باستخدام بايثون.
بالنسبة للمقال الأول من هذه السلسلة ، شرحت كيفية استخدام Python
لإنشاء لعبة نرد بسيطة تستند إلى النص. في الجزء الثاني ، أوضحت لك كيفية إنشاء
لعبة من الصفر ، بدءًا من إنشاء بيئة اللعبة . لكن كل لعبة تحتاج إلى لاعب ، وكل
لاعب يحتاج إلى شخصية قابلة للعب ، لذلك هذا ما ستفعله بعد ذلك في هذا الجزء الثالث من السلسلة.
في Pygame ، تسمى الأيقونة أو الصورة الرمزية التي يتحكم بها اللاعب كائنًا .
إذا لم يكن لديك أي رسومات لاستخدامها مع كائن لاعب حتى الآن ، فقم بتنزيل
من اللعبة الكلاسيكية مفتوحة المصدر Supertux وإعادة تسميتها hero1.png
أو البحث في OpenGameArt.org للحصول على خيارات أخرى.
بعد ذلك ، إذا لم تكن قد قمت بذلك بالفعل في المقالة السابقة ، فأنشئ دليلًا يسمى images
ضمن دليل مشروع Python. ضع الصور التي تريد استخدامها في لعبتك في images المجلد.
لجعل لعبتك مثيرة حقًا ، يجب عليك استخدام كائن متحرك لبطلك.
إذا كنت ترسم شخصياتك بنفسك ، فهذا يعني أنه يجب عليك رسم المزيد من الأصول ،
لكن هذا يحدث فرقًا كبيرًا. الرسوم المتحركة الأكثر شيوعًا هي دورة المشي ،
وهي سلسلة من الرسومات التي تجعلها تبدو وكأن شبحك يمشي. تتطلب النسخة
السريعة والقذرة من دورة المشي أربعة رسومات.
ملاحظة: نماذج التعليمات البرمجية في هذه المقالة تسمح
لكل من كائن لاعب ثابت وآخر متحرك.
قم بتسمية كائن اللاعب الخاص بك hero.png. إذا كنت تقوم بإنشاء كائن متحرك لدورة سير ،
فقم بإلحاق رقم بعد الاسم ، بدءًا من hero1.png. احفظ صورة البطل في
دليل يسمى images في دليل مشروع Python الخاص بك.
قم بإنشاء فئة بايثون
في Python ، عندما تنشئ كائنًا تريد أن يظهر على الشاشة ، فإنك تنشئ فصلًا دراسيًا.
بالقرب من أعلى نص Python الخاص بك ، في قسم الكائنات ، أضف الكود لإنشاء مشغل.
إذا كنت تستخدم صورة ثابتة بدون دورة سير ، فاستخدم هذا الرمز
(لاحظ أن هذا الرمز موجود في Objects قسم ملفك):
'''
Objects
'''
class Player(pygame.sprite.Sprite):
"""
Spawn a player
"""
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.images = []
img = pygame.image.load(os.path.join('images', 'hero.png')).convert()
self.images.append(img)
self.image = self.images[0]
self.rect = self.image.get_rect()
تنشئ كتلة التعليمات البرمجية هذه "كائنًا" افتراضيًا لتستخدمه Python
عند الإشارة إلى كائن بطلك. في البرمجة الشيئية ، يشار إلى "الكائن" بالفئة .
يتم توفير قالب الكائن (على وجه التحديد pygame.sprite.Sprite) بواسطة Pygame.
هذا ما يجعل من الممكن لك تحديد صورة لتمثيل شخصية اللاعب. إذا كان عليك
برمجة ذلك من البداية ، فسيتعين عليك معرفة المزيد عن Python قبل أن تتمكن
من البدء في إنشاء لعبة ، وهذه ميزة استخدام إطار عمل مثل Pygame.
إذا كانت لديك دورة سير لشخصيتك القابلة للعب ، فاحفظ كل رسم كملف
فردي تم استدعاؤه hero1.pngفي مجلد hero4.pngمشروعك . images
ثم استخدم حلقة لتخبر بايثون أن تتنقل بين كل ملف. هذه إحدى ميزات البرمجة الشيئية:
يمكن أن يكون لكل فئة مهام مخصصة لها على وجه الحصر ، والتي تحدث دون التأثير
على "العالم" من حولها. في هذه الحالة ، يتم برمجة كائن شخصية اللاعب الخاص بك
للتنقل بين أربع صور مختلفة لخلق وهم المشي ، ويمكن أن يحدث هذا بغض النظر عما يحدث حوله :
'''
Objects
'''
class Player(pygame.sprite.Sprite):
"""
Spawn a player
"""
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.images = []
for i in range(1, 5):
img = pygame.image.load(os.path.join('images', 'hero' + str(i) + '.png')).convert()
self.images.append(img)
self.image = self.images[0]
self.rect = self.image.get_rect()
أدخل اللاعب إلى عالم اللعبة
الآن بعد وجود فئة اللاعب ، يجب عليك استخدامها لإنتاج كائن لاعب في عالم لعبتك.
إذا لم تقم باستدعاء فئة "اللاعب" ، فلن يتم تشغيلها أبدًا ، ولن يكون هناك لاعب.
يمكنك اختبار ذلك عن طريق تشغيل لعبتك الآن. تعمل اللعبة بالشكل الذي كانت
عليه في نهاية المقالة السابقة ، مع نفس النتائج بالضبط: عالم لعبة فارغ.
لإحضار كائن لاعب إلى عالمك ، يجب "استدعاء" فئة المشغل لإنشاء كائن ثم إضافته
إلى مجموعة كائنات Pygame. أضف هذه الأسطر إلى قسم الإعداد الخاص بك:
player = Player() # spawn player
player.rect.x = 0 # go to x
player.rect.y = 0 # go to y
player_list = pygame.sprite.Group()
player_list.add(player)
حاول إطلاق لعبتك لترى ما سيحدث. تحذير: لن تفعل ما تتوقعه.
عند بدء مشروعك ، لا يظهر كائن اللاعب. في الواقع ، يتم إنتاجه ،
ولكن فقط لمدة مللي ثانية. كيف تصلح شيئًا يحدث فقط لجزء من الثانية؟
قد تتذكر من المقالة السابقة أنك بحاجة إلى إضافة شيء ما إلى الحلقة الرئيسية .
لجعل اللاعب يتكاثر لمدة أطول من ميلي ثانية ، أخبر بايثون برسمه مرة واحدة في كل حلقة.
غيّر عبارة الرسم للحلقة الرئيسية لتبدو كما يلي :
world.blit(backdrop, backdropbox)
player_list.draw(world) # draw player
pygame.display.flip()
clock.tick(fps)
ابدأ لعبتك الآن. لاعبك يولد!
مقالات ذات صلة :
ضبط قناة ألفا
اعتمادًا على كيفية إنشاء كائن المشغل الخاص بك ، قد يحتوي على كتلة ملونة حوله.
ما تراه هو المساحة التي يجب أن تشغلها قناة ألفا . من المفترض أن يكون
"لون" الاختفاء ، لكن بايثون لا تعرف كيف تجعله غير مرئي بعد. ما تراه ، إذن ،
هو المساحة الموجودة داخل المربع المحيط (أو "مربع الضرب" ، بمصطلحات الألعاب الحديثة) حول الكائن.
يمكنك إخبار Python بالألوان التي تجعلها غير مرئية عن طريق تعيين قناة ألفا واستخدام قيم RGB.
إذا كنت لا تعرف قيم RGB التي يستخدمها الرسم كألفا ، فافتح الرسم في Pinta أو
Inkscape واملأ المساحة الفارغة حول الرسم بلون فريد ، مثل # 00ff00 (أكثر أو أقل "خضراء خضراء").
لاحظ القيمة السداسية للون (# 00ff00 ، للشاشة الخضراء)
واستخدمها في نص Python الخاص بك كقناة ألفا.
يتطلب استخدام ألفا إضافة سطرين في كود إنشاء Sprite.
بعض إصدارات السطر الأول موجودة بالفعل في التعليمات البرمجية الخاصة بك. أضف السطرين الآخرين:
img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
img.convert_alpha() # optimise alpha
img.set_colorkey(ALPHA) # set alpha
لا تعرف Python ما يجب استخدامه كـ alpha إلا إذا أخبرته بذلك.
إذا كنت تعتقد أن صورتك تحتوي بالفعل على قناة ألفا ، فيمكنك محاولة تعيين
متغير ALPHAعلى 0 أو 255 ، وكلاهما مكانان شائعان لتخزين ألفا.
قد ينجح أحد هؤلاء ، ولكن ربما بسبب خلفيتي في إنتاج الأفلام ،
أفضل إنشاء قناة ألفا الخاصة بي وتعيينها بشكل صريح.
تعيين ألفا الخاصة بك
في قسم المتغير من التعليمات البرمجية الخاصة بك ، أضف هذا التعريف المتغير:
ALPHA = (0, 255, 0)
في رمز المثال هذا ، يتم استخدام 0،255،0 ، وهي نفس القيمة
في RGB مثل # 00ff00 في سداسي عشري.
يمكنك الحصول على كل قيم الألوان هذه من تطبيق رسومات جيد مثل GIMP أو
Krita أو Inkscape. بالتناوب ، يمكنك أيضًا اكتشاف قيم الألوان باستخدام
منتقي ألوان جيد على مستوى النظام ، مثل KColorChooser أو ColourPicker .
إذا كان تطبيق الرسومات الخاص بك يعرض خلفية الكائن الخاص بك كقيمة أخرى ،
فاضبط قيم متغير ألفا حسب الحاجة. بغض النظر عن القيمة التي قمت بتعيينها ،
ستكون "غير مرئية". قيم RGB صارمة للغاية ، لذلك إذا كنت بحاجة إلى
استخدام 000 لـ alpha ، لكنك تحتاج إلى 000 للخطوط السوداء للرسم ،
فقم فقط بتغيير خطوط الرسم إلى 111 ، وهو قريب بدرجة كافية من اللون الأسود
بحيث لا يستطيع أي شخص سوى الكمبيوتر لاحظ الفرق.
ابدأ لعبتك لترى النتائج.
هذا هو الكود بكامله حتى الآن:
#!/usr/bin/env python3
# by Seth Kenlon
# GPLv3
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from typing import Tuple
import pygame
import sys
import os
'''
Variables
'''
worldx = 960
worldy = 720
fps = 40 # frame rate
ani = 4 # animation cycles
world = pygame.display.set_mode([worldx, worldy])
BLUE = (25, 25, 200)
BLACK = (23, 23, 23)
WHITE = (254, 254, 254)
ALPHA = (0, 255, 0)
'''
Objects
'''
class Player(pygame.sprite.Sprite):
"""
Spawn a player
"""
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.images = []
for i in range(1, 5):
img = pygame.image.load(os.path.join('images', 'hero' + str(i) + '.png')).convert()
img.convert_alpha() # optimise alpha
img.set_colorkey(ALPHA) # set alpha
self.images.append(img)
self.image = self.images[0]
self.rect = self.image.get_rect()
'''
Setup
'''
backdrop = pygame.image.load(os.path.join('images', 'stage.png'))
clock = pygame.time.Clock()
pygame.init()
backdropbox = world.get_rect()
main = True
player = Player() # spawn player
player.rect.x = 0 # go to x
player.rect.y = 0 # go to y
player_list = pygame.sprite.Group()
player_list.add(player)
'''
Main Loop
'''
while main:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
try:
sys.exit()
finally:
main = False
if event.type == pygame.KEYDOWN:
if event.key == ord('q'):
pygame.quit()
try:
sys.exit()
finally:
main = False
world.blit(backdrop, backdropbox)
player_list.draw(world)
pygame.display.flip()
clock.tick(fps)
في الجزء الرابع من هذه السلسلة ، سأوضح لك كيفية تحريك كائنك.