ผลต่างระหว่างรุ่นของ "Oop lab/pygame1"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 57: แถว 57:
 
* ทำงานใน update/render ลูป
 
* ทำงานใน update/render ลูป
 
* จัดการกับ event
 
* จัดการกับ event
 +
 +
ถ้าเราพิจารณาจากโค้ด จะแบ่งเป็นส่วน ๆ ได้ตามด้านล่างนี้
 +
 +
<syntaxhighlight lang="python">
 +
def main():
 +
    # ------------------------ init -------------------------------------
 +
    pygame.init()
 +
    clock = pygame.time.Clock()
 +
    # ...
 +
    player = Player(color=pygame.Color('green'),pos=100)
 +
 +
    # ------------------ event loop ------------------------------------
 +
    while not game_over:
 +
 +
        # ----------------------- event processing -------------------------
 +
        for event in pygame.event.get(): # process events
 +
            # ...
 +
 +
        if pygame.key.get_pressed()[K_UP]:
 +
            player.pos -= 5
 +
        elif pygame.key.get_pressed()[K_DOWN]:
 +
            player.pos += 5
 +
 +
        # ---------------------------- render & update ---------------------------------------
 +
        display.fill(BLACK)  # clear screen
 +
        display.blit(score_image, (10,10))  # draw score
 +
        player.draw(display)  # draw player
 +
        ball.move(1./FPS, display, player)  # move ball
 +
        ball.draw(display)  # draw ball
 +
 +
        pygame.display.update()  # redraw the screen
 +
 +
        # ---------------------------- wait inside loop ----------------------------
 +
        clock.tick(FPS)  # wait to limit FPS requirement
 +
</syntaxhighlight>
 +
  
 
เราจะเริ่มจากส่วน init และ update/render ลูปก่อน
 
เราจะเริ่มจากส่วน init และ update/render ลูปก่อน
 +
 +
=== คลาส SimpleGame ===
 +
มาวางแผนกันก่อน...
 +
 +
 +
 +
เราจะเขียนคลาสดังกล่าวไว้ในไฟล์ gamelib.py ซึ่งจะเป็นโมดูลย่อยของเกมของเรา

รุ่นแก้ไขเมื่อ 14:47, 16 พฤศจิกายน 2557

หน้านี้เป็นส่วนหนึ่งของ oop lab

ไลบรารีที่เราจะใช้ในการพัฒนาเกมบน Python คือ PyGame อย่างไรก็ตาม ตัว Pygame นั้นไม่ได้มีโครงสร้างที่เป็นเชิงวัตถุมากนัก ใน Tutorial นี้เราจะสร้างกรอบงานเชิงวัตถุครอบ Pygame อีกครั้ง โดยจะพยายามอ้างอิงโครงสร้างจาก Slick2D เพื่อความคุ้นเคย

โค้ดเริ่มต้น

เราจะเริ่มจากโค้ด squash.py จากหน้า สร้างเกมด้วย Pygame โดยเราจะเริ่มจากการแกะส่วนแก่นของเกมในฟังก์ชัน main แยกออกมาเป็นคลาส

โค้ดที่เราสนใจอยู่ในส่วนต่อไปนี้

def main():
    global game_over,font,score,score_image

    pygame.init()
    clock = pygame.time.Clock()
    display = pygame.display.set_mode(WINDOW_SIZE)
    pygame.display.set_caption('Squash')
    game_over = False
    font = pygame.font.SysFont("monospace", 20)
    score = 0
    score_image = None
    render_score()

    ball = Ball(speed=(200,50))
    player = Player(color=pygame.Color('green'),pos=100)

    while not game_over:
        for event in pygame.event.get(): # process events
            if (event.type == QUIT) or \
               (event.type == KEYDOWN and event.key == K_ESCAPE):
                game_over = True

        if pygame.key.get_pressed()[K_UP]:
            player.pos -= 5
        elif pygame.key.get_pressed()[K_DOWN]:
            player.pos += 5

        display.fill(BLACK)  # clear screen
        display.blit(score_image, (10,10))  # draw score
        player.draw(display)  # draw player
        ball.move(1./FPS, display, player)  # move ball
        ball.draw(display)  # draw ball

        pygame.display.update()  # redraw the screen
        clock.tick(FPS)  # wait to limit FPS requirement

if __name__=='__main__':
    main()
    print "Game Over! Total score is %d." % score
    pygame.quit()

หน้าที่หลักของฟังก์ชัน main ถ้ามองในแง่ของเกมแล้ว มีดังนี้

  • ตั้งค่าเริ่มต้น (init)
  • ทำงานใน update/render ลูป
  • จัดการกับ event

ถ้าเราพิจารณาจากโค้ด จะแบ่งเป็นส่วน ๆ ได้ตามด้านล่างนี้

def main():
    # ------------------------ init -------------------------------------
    pygame.init()
    clock = pygame.time.Clock()
    # ...
    player = Player(color=pygame.Color('green'),pos=100)

    # ------------------ event loop ------------------------------------
    while not game_over:

        # ----------------------- event processing -------------------------
        for event in pygame.event.get(): # process events
            # ...

        if pygame.key.get_pressed()[K_UP]:
            player.pos -= 5
        elif pygame.key.get_pressed()[K_DOWN]:
            player.pos += 5

        # ---------------------------- render & update ---------------------------------------
        display.fill(BLACK)  # clear screen
        display.blit(score_image, (10,10))  # draw score
        player.draw(display)  # draw player
        ball.move(1./FPS, display, player)  # move ball
        ball.draw(display)  # draw ball

        pygame.display.update()  # redraw the screen

        # ---------------------------- wait inside loop ----------------------------
        clock.tick(FPS)  # wait to limit FPS requirement


เราจะเริ่มจากส่วน init และ update/render ลูปก่อน

คลาส SimpleGame

มาวางแผนกันก่อน...


เราจะเขียนคลาสดังกล่าวไว้ในไฟล์ gamelib.py ซึ่งจะเป็นโมดูลย่อยของเกมของเรา