Menu
CoddyTech

ورقة مرجعية pygame

آخر تحديث

الإعداد وحلقة اللعبة

كل برنامج pygame يفتح نافذة، ثم يكرر حلقة واحدة حتى يخرج اللاعب.

العمليةالكود
تثبيت pygame-cepython3 -m pip install pygame-ce
استيراد pygame وتشغيلهاimport pygame pygame.init()
فتح نافذةscreen = pygame.display.set_mode((640, 480))
تعيين عنوان النافذةpygame.display.set_caption("My Game")
إنشاء ساعةclock = pygame.time.Clock()
حلقة اللعبةrunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
الإغلاق بعد انتهاء الحلقةpygame.quit()

الشاشة

الشاشة هي Surface، ولا يظهر شيء حتى تستدعي flip.

العمليةالكود
عرض الإطار المكتملpygame.display.flip()
تحديث مناطق محددة فقطpygame.display.update([rect1, rect2])
مسح الشاشةscreen.fill((30, 30, 46))
حجم النافذةscreen.get_size(), screen.get_width()
الشاشة على شكل Rectscreen.get_rect()
نافذة قابلة لتغيير الحجمpygame.display.set_mode((640, 480), pygame.RESIZABLE)
ملء الشاشة بحجم سطح المكتبpygame.display.set_mode((0, 0), pygame.FULLSCREEN)

الألوان والرسم

دوال pygame.draw تأخذ سطحًا ولونًا وموضعًا. القيمة width=0 تملأ الشكل.

العمليةالكود
اللون بصيغة RGB(255, 140, 0)
اللون بالاسم أو بالصيغة الست عشرية"tomato", "#ff8c00", pygame.Color("gold")
مستطيلpygame.draw.rect(screen, "red", (x, y, w, h))
إطار وزوايا مستديرةpygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
دائرة (حسب مركزها)pygame.draw.circle(screen, "blue", (cx, cy), radius)
خطpygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
مضلعpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
قطع ناقص داخل مستطيلpygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

يخزّن Rect موضعًا وحجمًا بأعداد صحيحة.

العمليةالكود
إنشاء Rectplayer = pygame.Rect(x, y, width, height)
تحديد الموضع بأي نقطةplayer.center = (320, 240), player.bottom = 400
الحواف والزواياleft, right, top, bottom, topleft, midbottom
التحريك في المكانplayer.move_ip(dx, dy)
نسخة محرّكةmoved = player.move(dx, dy)
الإبقاء داخل الشاشةplayer.clamp_ip(screen.get_rect())
التكبير حول المركزbigger = player.inflate(20, 20)
مواضع عشرية (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

الصور وSurface وblit

حمّل الصور مرة واحدة قبل الحلقة، ثم ارسمها بـ blit في كل إطار.

العمليةالكود
تحميل صورة مع الشفافيةimg = pygame.image.load("player.png").convert_alpha()
تحميل صورة بلا شفافيةbg = pygame.image.load("sky.png").convert()
رسم صورةscreen.blit(img, (x, y))
الرسم في المنتصفscreen.blit(img, img.get_rect(center=(320, 240)))
Surface فارغ جديدpanel = pygame.Surface((200, 100))
Surface شفافlayer = pygame.Surface((200, 100), pygame.SRCALPHA)
جعل Surface كاملًا شبه شفافimg.set_alpha(128)
قص إطار من ورقة spritesframe = sheet.subsurface((0, 0, 32, 32))
حفظ لقطة شاشةpygame.image.save(screen, "shot.png")

التحويل

كل دالة تعيد Surface جديدًا، فحوّل الصورة الأصلية لا آخر نتيجة.

العمليةالكود
تغيير الحجمpygame.transform.scale(img, (64, 64))
التكبير بمعاملpygame.transform.scale_by(img, 2)
تغيير الحجم بنعومةpygame.transform.smoothscale(img, (64, 64))
التدوير (عكس عقارب الساعة، بالدرجات)pygame.transform.rotate(img, 45)
التدوير حول المركزrotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
قلب أفقيpygame.transform.flip(img, True, False)

الأحداث ولوحة المفاتيح

استخدم الأحداث للضغطات المفردة، وget_pressed() للمفاتيح التي تبقى مضغوطة.

العمليةالكود
قراءة أحداث هذا الإطارfor event in pygame.event.get():
أُغلقت النافذةevent.type == pygame.QUIT
ضُغط مفتاحevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
أُفلت مفتاحevent.type == pygame.KEYUP
الحرف المكتوبevent.unicode
المفاتيح المضغوطة الآنkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
الاتجاه من مفتاحينdx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
المفاتيح المضغوطة في هذا الإطار (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
ثوابت المفاتيحK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
اسم المفتاحpygame.key.name(event.key)
حدث مخصصHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

الفأرة

الأزرار: 1 الأيسر، 2 الأوسط، 3 الأيمن.

العمليةالكود
ضُغط زرevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
مكان الضغطevent.pos
موضع المؤشر الآنx, y = pygame.mouse.get_pos()
الأزرار المضغوطة الآنleft, middle, right = pygame.mouse.get_pressed()
تحركت الفأرةevent.type == pygame.MOUSEMOTION, event.rel
دارت العجلةevent.type == pygame.MOUSEWHEEL, event.y
نقر داخل زرbutton_rect.collidepoint(event.pos)
إخفاء المؤشرpygame.mouse.set_visible(False)

الـ Sprites والمجموعات

يحمل الـ sprite قيمتي image وrect، والمجموعة تحدّث الكثير منها وترسمها معًا.

العمليةالكود
صنف spriteclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
إنشاء مجموعةcoins = pygame.sprite.Group()
الإضافة إلى مجموعةcoins.add(Coin((100, 50)))
تحديث كل الـ spritescoins.update()
رسم كل الـ spritescoins.draw(screen)
إزالة sprite من كل المجموعاتcoin.kill()
مجموعة تحمل sprite واحدًاplayer = pygame.sprite.GroupSingle(Player())

التصادم

يتصادم Rect مع آخر عندما يتداخلان، أما الحواف المتلامسة فلا تُحسب.

العمليةالكود
مستطيلانa.colliderect(b)
نقطة بالداخلrect.collidepoint(x, y)
الأول من بين عدة مستطيلاتrect.collidelist(walls) # index or -1
sprite مقابل مجموعةhits = pygame.sprite.spritecollide(player, coins, True)
هل حدث أي تصادمpygame.sprite.spritecollideany(player, enemies)
مجموعة مقابل مجموعةpygame.sprite.groupcollide(bullets, enemies, True, True)
بدقة البكسلpygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
دوائرpygame.Vector2(a).distance_to(b) < r1 + r2

النص والخطوط

ارسم النص على Surface، ثم ضعه على الشاشة بـ blit.

العمليةالكود
الخط الافتراضيfont = pygame.font.Font(None, 36)
خط من النظامfont = pygame.font.SysFont("arial", 24)
ملف خطfont = pygame.font.Font("pixel.ttf", 32)
رسم النصtext = font.render("Score: 10", True, "white")
رسمه في المنتصفscreen.blit(text, text.get_rect(center=(320, 40)))
التفاف النص الطويل (pygame-ce)font.render(story, True, "white", None, 400)
معرفة الحجم دون رسمfont.size("Hello")
الخطوط المثبتةpygame.font.get_fonts()

الأصوات والموسيقى

حمّل الأصوات مرة واحدة. الموسيقى تُبث مقطعًا واحدًا من ملفه.

العمليةالكود
تحميل صوتjump = pygame.mixer.Sound("jump.ogg")
تشغيلهjump.play()
مستوى صوت المؤثرjump.set_volume(0.5)
تحميل الموسيقىpygame.mixer.music.load("theme.ogg")
تكرار الموسيقى بلا توقفpygame.mixer.music.play(-1)
الإيقاف المؤقت والاستئنافpygame.mixer.music.pause(), pygame.mixer.music.unpause()
إيقاف الموسيقىpygame.mixer.music.stop()

الوقت والمؤقتات

تُقاس النبضات (ticks) بالمللي ثانية.

العمليةالكود
تحديد معدل الإطاراتclock.tick(60)
الزمن بين الإطارات بالثوانيdt = clock.tick(60) / 1000
معدل الإطارات الحاليclock.get_fps()
المللي ثواني منذ initpygame.time.get_ticks()
حدث مؤقت متكررSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
مؤقت لمرة واحدةpygame.time.set_timer(SPAWN, 2000, loops=1)
إيقاف المؤقتpygame.time.set_timer(SPAWN, 0)

Vector2

أعداد عشرية للمواضع والسرعات.

العمليةالكود
إنشاء متجهpos = pygame.Vector2(100, 200)
التحريك بالسرعةpos += velocity * dt
الطولvelocity.length()
السرعة نفسها على الأقطارif direction.length() > 0: direction = direction.normalize()
المسافة بين نقطتينpos.distance_to(target)
التدويرvelocity.rotate(90)
التقدم نحو نقطة (pygame-ce)pos.move_towards_ip(target, 5)

هذه أكواد pygame التي تحتاجها عند صنع لعبة ثنائية الأبعاد بلغة Python، مرتبة حسب المهمة: حلقة اللعبة، والشاشة، والألوان والرسم، وRect، والصور وblit، وتغيير الحجم والتدوير، وإدخال لوحة المفاتيح والفأرة، والـ sprites والمجموعات، والتصادم، والنص، والصوت، والمؤقتات، وVector2. في كل صف مقتطف قصير جاهز للصق، ومعه ما يفعله.

كل ما هنا مكتوب لـ pygame-ce 2.5، وهي النسخة المجتمعية من pygame، وما زلت تستوردها بـ import pygame. الصفوف التي تحمل علامة pygame-ce تستخدم إضافاتها، وكل الصفوف الأخرى تعمل أيضًا في pygame الأصلية. جرّب أي مقتطف في ساحة تجربة pygame، التي تشغّل pygame في متصفحك دون أي تثبيت. هل أنت جديد على Python نفسها؟ ابدأ بـ الورقة المرجعية لـ Python.

أسئلة شائعة عن ورقة pygame المرجعية

هل هذه الورقة المرجعية لـ pygame مجانية؟

نعم. إنها مجانية ولا تحتاج إلى تسجيل. احفظها في المفضلة، أو اطبعها بصيغة PDF من متصفحك، وارجع إليها كلما احتجت إلى الاستدعاء الدقيق لمجموعة sprites أو صوت أو فحص تصادم.

هل تعمل هذه الورقة المرجعية مع pygame وpygame-ce؟
نعم. كلتاهما تُستوردان بـ import pygame وتتشاركان الواجهة البرمجية كلها تقريبًا. الصفوف التي تحمل علامة pygame-ce (FRect وscale_by وget_just_pressed والتفاف النص وmove_towards_ip) تحتاج إلى pygame-ce، وكل ما عداها يعمل على أي منهما.
لماذا لا تستجيب نافذة pygame عندي؟
لأن حلقة اللعبة لا تقرأ الأحداث. استدعِ pygame.event.get() مرة في كل إطار حتى لو تجاهلت الأحداث، واختم كل إطار بـ pygame.display.flip() وclock.tick(60).
هل أستخدم الأحداث أم key.get_pressed() للإدخال؟
استخدم حدث KEYDOWN للأفعال التي تحدث مرة واحدة مع كل ضغطة، مثل القفز أو فتح قائمة. واستخدم pygame.key.get_pressed() للأفعال التي تستمر ما دام المفتاح مضغوطًا، مثل المشي.
رسم توضيحي للغات البرمجة في Coddy

تعلّم Pygame مع Coddy

ابدأ الآن