سؤال

إليك كيفية تنفيذ ألعاب pygames البسيطة الخاصة بي الآن:

import pygame, sys
from pygame.locals import *

def run_game():
    pygame.init()

    SIZE = (640, 400)
    BG_COLOUR = (0, 0, 0)
    LINE_COLOUR = (255, 255, 255)

    screen = pygame.display.set_mode(SIZE)
    clock = pygame.time.Clock()

    while True:
        time_passed = clock.tick(30)
        for event in pygame.event.get():
                if event.type == QUIT:
                        exit_game()

        screen.fill(BG_COLOUR)
        pygame.draw.aaline(screen, LINE_COLOUR, (1, 1), (639, 399))
        pygame.display.flip()

def exit_game():
    sys.exit()

if __name__ == "__main__"
    run_game()

لقد رأيت أيضًا أ keeprunning يتم استخدام العلامة للخروج من حلقة الحدث الرئيسية بدلاً من ذلك، بالإضافة إلى استخدام pygame.event.poll() بدلا من التكرار من خلال pygame.event.get().هل هناك أي اقتراحات، مثل الحالة/تسمية المتغيرات، أو أي شيء لجعلها أكثر فعالية أو قابلية للقراءة؟

هل كانت مفيدة؟

المحلول

ومهما يوصي الكتاب pygame، أقترح تجنب from ... import *: إلا أنه يجعل التعليمات البرمجية من الصعب قراءة (كما على القارئ أن تفقد كل barename للتحقق ما إذا كان تم تعيينه فعلا محليا أو يأتي من * deuced). تغيير ذلك إلى import pygame.locals as pygl، ويقول، وجعل كل استخدام اسم من أن يكون واحد مؤهل (على ما أظن في التعليمات البرمجية هذا يعني مجرد تغيير QUIT إلى pygl.QUIT). ما اسم باختصار بالضبط اخترت استخدام بدلا من pygl لا يهم كثيرا، ولكن هذا الهيكل العام أوصي بشدة. تذكر: النطاقات هي فكرة عظيمة التزمير - دعونا نفعل أكثر من تلك -)

استخدم المسافات البادئة 4-الفضاء في كل مكان، كما يقول PEP 8: يبدو أنك يمكن خلط بعض المسافات البادئة 4-الفضاء مع الآخر التي هي 8 مساحة أو علامات التبويب - <م> لا

وعدم تعيين المتغيرات كنت أبدا ستعمل من أي وقت مضى استخدام، كما كنت أفعل ذلك من أجل time_passed.

ورمز مثل:                 إذا event.type == QUIT:                         الخروج من اللعبة() على ما يرام طالما كنت اختبار واحد أو عدد قليل جدا من الاحتمالات (مع if / elif)، ولكن لا "تصعيد" كثيرا، سواء في القراءة أو الكفاءة. عندما كنت في حاجة لتغطية العديد من الحالات، استخدام ديكت التي يمكنك إعداد قبل الحلقة:

dispatch = {pygl.QUIT: exit_game, # whatever else
           }

وبدلا من if / elif / else، الاستخدام:

f = dispatch.get(event.type)
if f is None:  # the "else" case"
   ...
else: f()

نصائح أخرى

المثال الخاص بك هو جيد جدا.ولكن إذا رأيت كيفية عمل "pygame.event.poll()" فراجع هذا المثال البسيط:

event = pygame.event.poll()
    while "ok":
        event = pygame.event.wait()
        cursor = pygame.mouse.get_pos()
        if event.type == QUIT:  raise SystemExit
            if event.type == MOUSEBUTTONUP and pygame.mouse.get_pressed()[0]:
               print "up"
        if event.type == MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
               print "down"
        if event.type == KEYDOWN and event.key == K_SPACE: print "space key"
        if event.type == KEYDOWN and event.key == K_BACKSPACE:
               print "backspace key"

يمكنك استخدام جميع الأحداث من pygame:

  • pygame.event.get - احصل على أحداث من قائمة الانتظار الحصول على أحداث من قائمة الانتظار
  • pygame.event.poll - احصل على حدث واحد من قائمة الانتظار احصل على حدث واحد من قائمة الانتظار
  • pygame.event.wait - انتظر حدث واحد من قائمة الانتظار

أو

  • pygame.event.clear ([pygame.quit ، pygame.activeevent ، pygame.keydown ، pygame.keyup ، pygame.mousemotion ، pygame.joybuttonup ، pygame.userevent]) لإزالة جميع الأحداث من قائمة الانتظار

بشكل أساسي، يمكنك إنشاء وظائف لهذه الأحداث واستخدامها.مثله :

def click_down():
    #print "Event queue:", pygame.event.peek()
    return pygame.event.peek(pygame.MOUSEBUTTONDOWN)

def is_click():
    if not click_down():
        return None

    clicks = pygame.event.get(pygame.MOUSEBUTTONDOWN)
    pygame.event.get(pygame.MOUSEBUTTONUP)
    return clicks[0].pos
def quiting():
    return pygame.event.peek(pygame.QUIT)
def keyboard():
    pygame.event.pump()
    pygame.event.get(pygame.KEYDOWN)

أو منع بعض الأحداث مثل:

pygame.event.set_blocked((pygame.JOYAXISMOTION))

والطبقة pygame.Color() هي لطيفة لاستخدام:

from pygame import Color

# example: text is 20% gray. gray100 = (255,255,255)
text_fg = Color('gray20')
text_bg = Color('gray80')

# many names are defined
Color("red")

# rgb, rgba
Color(100, 100, 100)
Color(100, 100, 100, 20)

#hex
Color("fefefe")
Color("fefefe00")

وهذا يبدو وكأنه أساسا في كل مثال آخر رأيته في حياتي. ربما قد ترغب في العثور على بعض الألعاب المفتوحة المصدر مكتوب في pygame.

وأنا لست متأكدا إذا كان هذا هو نوع من الإجابة التي تبحث عنها، ولكن بعد
pygame.draw.aaline (الشاشة، LINE_COLOUR، (1، 1)، (639، 399))
يجب عليك ان تضع
pygame.display.flip ()
وهذا هو الحال أن العرض الذي يرى لاعب في الواقع سوف تحصل على تحديثها كل إطار. إذا قمت بتشغيل هذا الرمز، ثم كل ما سوف تراه هو شاشة سوداء، مع عدم وجود خط كما يتم تحديث الشاشة أبدا.

وبكل بساطة من الاختبارات التجريبية يبدو أن لديها خط:

pygame.quit()

والمفقودين قبل sys.exit ()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top