تطبيق الفيزياء الأساسية واكتشاف الاصطدام في Pygame

تطبيق الفيزياء الأساسية واكتشاف الاصطدام في Pygame
القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة. قراءة المزيد.

يوفر 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()

أدناه هو الإخراج:

  بسيطة لعبة منهاج باستخدام pygame

تنفيذ سلوك الجاذبية والقفز

لتنفيذ سلوك الجاذبية والقفز في لعبة المنصات الخاصة بك ، ستحتاج إلى إضافة سرعة 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. بقليل من الإبداع والتجريب ، يمكنك استخدام هذه التقنيات لإنشاء مجموعة متنوعة من الألعاب وآليات اللعبة المختلفة.

يمكنك العثور على الكود الكامل في ملف مستودع جيثب .

أدناه هو الإخراج:

  لعبة منهاج بسيطة مع الجاذبية والتسارع

تحسين تفاعل المستخدم مع الاصطدامات

تتطلب العديد من الألعاب شكلاً من أشكال اكتشاف الاصطدام. يمكنك استخدام الاصطدامات لإنشاء مجموعة واسعة من ميكانيكا اللعبة ، من منصات بسيطة إلى عمليات المحاكاة المعقدة القائمة على الفيزياء.

يمكن أن يؤدي تطبيق الفيزياء الأساسية مثل الجاذبية والاحتكاك والتسارع إلى تحسين تفاعل المستخدم بشكل كبير ، وإضافة الواقعية والشعور بالثقل إلى كائنات اللعبة.