يوفر Pygame العديد من الوظائف المضمنة لاكتشاف التصادم بين كائنات اللعبة. هذه لا تقدر بثمن لأن تحديد متى وكيف تتداخل الأجسام المتحركة بالضبط يمكن أن يكون مهمة معقدة.
تعرف على كيفية إضافة الفيزياء الأساسية والتصادمات في لعبتك باستخدام وحدة pygame.
وظائف الكشف عن الاصطدام المدمجة في Pygame
أبسط وظيفة مدمجة للكشف عن الاصطدام هي spritecollide. يأخذ كائنًا ، ومجموعة من النقوش المتحركة ، وقيمة منطقية تشير إلى ما إذا كان يجب أن 'تموت' (تتم إزالتها) عند الاصطدام أم لا. تقوم هذه الوظيفة بإرجاع قائمة من النقوش المتحركة التي اصطدمت. فيما يلي مثال على كيفية استخدامه:
collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)
وظيفة أخرى مفيدة للكشف عن الاصطدام هي groupcollide ، والتي تأخذ مجموعتين من النقوش المتحركة وقيمة منطقية أيضًا. تقوم هذه الوظيفة بإرجاع قاموس به نقوش متحركة متصادمة كمفاتيح والعفاريت التي اصطدمت بها كقيم. فيما يلي مثال على كيفية استخدامه:
collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)
إنشاء لعبة منصات أساسية باستخدام وظيفة spritecollide
لإنشاء لعبة منصات أساسية باستخدام Pygame ، ستحتاج إلى إنشاء كائن لاعب يمكن للمستخدم التحكم فيه وعفريت منصة ليقف عليها اللاعب. يمكنك استخدام وظيفة spritecollide لاكتشاف متى يصطدم كائن اللاعب بكائن النظام الأساسي ويمنع اللاعب من السقوط عبر المنصة.
للبدأ، قم بتثبيت وحدة pygame باستخدام نقطة :
pip install pygame
بعد ذلك، إنشاء فصول بسيطة للاعب والنظام الأساسي ، وكلاهما يجب أن يرث من فئة العفريت في Pygame. يجب أن يكون لفئة اللاعب طريقة تحديث للتعامل مع موضع اللاعب بناءً على السرعة. أيضًا ، يجب أن يكون لها متغير y_velocity لتطبيق تأثير الجاذبية. يجب أن يكون لفئة النظام الأساسي طريقة __init__ تأخذ إحداثيات المنصة وتخلق سطحًا بهذا الحجم.
لقد وجدت هاتف iPhone كيف يمكنني فتحه
فئة اللاعب
يمكنك إنشاء فئة لاعب باستخدام وحدة pygame.sprite.Sprite. ستعمل هذه الفئة على تهيئة اللاعب بإحداثيات x و y معينة. بعد ذلك ، ستعمل طريقة التحديث على تحديث موضع اللاعب عن طريق زيادة قيمة y_velocity.
import pygame
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0
def update(self):
self.rect.y += self.y_velocity
فئة المنصة
تستخدم فئة النظام الأساسي أيضًا وحدة pygame.sprite.Sprite. ستعمل هذه الفئة على تهيئة النظام الأساسي بإحداثيات س و ص ، بالإضافة إلى العرض والارتفاع.
class Platform(pygame.sprite.Sprite):
def __init__(self, x, y, width, height):
super().__init__()
self.image = pygame.Surface((width, height))
self.rect = self.image.get_rect(topleft=(x, y))
حلقة اللعبة
ستتيح لك حلقة اللعبة إنشاء نافذة بحجم 640 × 480. بعد ذلك ، سيتم تشغيل حلقة للتحقق من وجود أي أحداث ، مثل أمر quit. ستتحقق أيضًا من أي تصادمات بين المشغل والمنصة. أخيرًا ، سيملأ الشاشة باللون الأبيض ، ويرسم المشغل والمنصة ، ثم يقلب الشاشة.
player = Player(100, 300)
player_group = pygame.sprite.Group()
player_group.add(player)
platform = Platform(50, 400, 100, 20)
platform_group = pygame.sprite.Group()
platform_group.add(platform)
# Initialize pygame and create window
pygame.init()
screen = pygame.display.set_mode((640, 480))
# Main game loop
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player_group.update()
collided = pygame.sprite.spritecollide(player, platform_group, False)
if collided:
player.y_velocity = 0
screen.fill((255, 255, 255))
player_group.draw(screen)
platform_group.draw(screen)
pygame.display.flip()
pygame.quit()
أدناه هو الإخراج:
تنفيذ سلوك الجاذبية والقفز
لتنفيذ سلوك الجاذبية والقفز في لعبة المنصات الخاصة بك ، ستحتاج إلى إضافة سرعة y إلى كائن لاعبك وتحديث موقعه y في كل إطار. للقيام بذلك ، يمكنك استخدام طريقة التحديث داخل فئة المشغل وإضافة مقتطف الشفرة التالي:
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0
def update(self):
self.rect.y += self.y_velocity
self.y_velocity += GRAVITY # Apply gravity to y velocity
الآن في كل مرة تقوم فيها باستدعاء طريقة التحديث ، ستقوم بتحديث موضع المشغل وفقًا للسرعة والجاذبية.
مؤشر الكتابة على facebook لا يعمل
لجعل كائن اللاعب يقفز ، يمكنك ربط إجراء القفز بمفتاح أو زر معين وتحديث السرعة y للاعب بقيمة سالبة. مقتطف الشفرة التالي هو مثال على كيفية القفز عندما يضغط اللاعب على مفتاح المسافة.
JUMP_VELOCITY = -10
# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
player.y_velocity = JUMP_VELOCITY
لاحظ أنك ستحتاج إلى التحقق من event.type للتأكد من أن الحدث هو حدث KEYDOWN قبل التحقق من قيمة المفتاح.
إضافة الفيزياء الأساسية مثل الاحتكاك والتسارع
لإضافة الفيزياء الأساسية مثل الاحتكاك والتسارع إلى لعبة المنصات الخاصة بك ، ستحتاج إلى تحديث السرعة x لكائن اللاعب الخاص بك في كل إطار. يمكنك إضافة سرعة x إلى فئة اللاعب وتحديثها بنفس طريقة سرعة y. لتنفيذ الاحتكاك ، يمكنك تقليل السرعة x لكائن اللاعب بمقدار صغير في كل إطار. على سبيل المثال ، يمكنك إضافة مقتطف الشفرة التالي داخل طريقة التحديث لفئة المشغل:
FRICTION = 0.9
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((32, 32))
self.rect = self.image.get_rect(topleft=(x, y))
self.y_velocity = 0
self.x_velocity = 0
def update(self):
self.rect.y += self.y_velocity
self.rect.x += self.x_velocity
self.y_velocity += GRAVITY # Apply gravity to y velocity
self.x_velocity *= FRICTION # Apply friction to x velocity
لتنفيذ التسارع ، يمكنك تعيين متغير ، player_movement ، للحركة الأفقية ، وتحديث السرعة x لكائن اللاعب وفقًا لقيمة player_movement. يمكنك القيام بذلك عن طريق ربط الحركة بمفاتيح أو أزرار محددة وتحديث السرعة x للاعب في حلقة الحدث ، على سبيل المثال:
ACCELERATION = 0.5
player_movement = 0
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_movement = -1
elif event.key == pygame.K_RIGHT:
player_movement = 1
elif event.type == pygame.KEYUP:
if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
player_movement = 0
player.x_velocity += player_movement * ACCELERATION
باستخدام هذه التقنيات ، يمكنك إنشاء لعبة منصات بسيطة وممتعة باستخدام وظائف الكشف عن الاصطدام المدمجة والفيزياء الأساسية في Pygame. بقليل من الإبداع والتجريب ، يمكنك استخدام هذه التقنيات لإنشاء مجموعة متنوعة من الألعاب وآليات اللعبة المختلفة.
يمكنك العثور على الكود الكامل في ملف مستودع جيثب .
أدناه هو الإخراج:
تحسين تفاعل المستخدم مع الاصطدامات
تتطلب العديد من الألعاب شكلاً من أشكال اكتشاف الاصطدام. يمكنك استخدام الاصطدامات لإنشاء مجموعة واسعة من ميكانيكا اللعبة ، من منصات بسيطة إلى عمليات المحاكاة المعقدة القائمة على الفيزياء.
يمكن أن يؤدي تطبيق الفيزياء الأساسية مثل الجاذبية والاحتكاك والتسارع إلى تحسين تفاعل المستخدم بشكل كبير ، وإضافة الواقعية والشعور بالثقل إلى كائنات اللعبة.