2012-06-19 18 views
6

Tôi đang tạo một trò chơi nhỏ và tôi muốn tạo một cửa sổ khác riêng biệt với cửa sổ chính của mình.Hiển thị nhiều trong Pygame

Tôi có trò chơi chính trong cửa sổ chính và tôi muốn mở một cửa sổ mới và thực hiện một hoạt ảnh nhỏ khi người dùng làm điều gì đó.

Trong mã ví dụ của tôi bên dưới, khi người dùng nhấn "a" tôi muốn nó mở một cửa sổ mới và nhấp vào đó.

Ở đây tôi thành lập hai cửa sổ: (Tôi biết việc doesnt này, nó những gì tôi hỏi làm thế nào để làm)

SCREEN_X = 400 
SCREEN_Y = 400 
BSCREEN_X = 240 
BSCREEN_Y = 160 

BATTLE_SCENE = pygame.display.set_mode((BSCREEN_X, BSCREEN_Y)) 
SCREEN = pygame.display.set_mode((SCREEN_X, SCREEN_Y)) 

và sau đó chương trình:

def run_ani(): 
    #Do animation, blitting to BATTLE_SCENE 
    return 

def main_game(): 
    ending=False 
    while ending==False: 
     clock.tick(30) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: ending=True 
      if event.type == KEYDOWN: # key down or up? 
       if event.key == K_ESCAPE: 
        ending=True # Time to leave 
        print("Stopped Early by user") 
       elif event.key == K_a: 
        run_ani() 
     #Normal screen motion, blitting to SCREEN 
     if ending: pygame.quit() 
    return 

Cho đến nay những gì này làm là rút ra màn hình chính, sau đó khi A được nhấn, nó dừng vẽ hình động màn hình chính, nhưng vẫn vẽ các hình động khác trên màn hình chính và vẽ ở góc trên cùng bên trái.

Tôi chắc chắn nó thực hiện điều này vì tôi đang thiết lập BATTLE_SCENE nhỏ hơn màn hình chính, do đó khi blitting đến BATTLE_SCENE nó sẽ chuyển sang khu vực tôi đã tạo (240x160) ở góc trên cùng của màn hình chính.

Tuy nhiên tôi muốn BATTLE_SCENE là một cửa sổ riêng biệt, vì vậy khi tôi nhấn 'a' nó sẽ bật lên, làm điều của nó, sau đó đóng hoặc ít nhất là đi phía sau màn hình chính.

Cách thực hiện việc này? Thậm chí có thể không?

+0

Bạn không nên làm điều này anyway –

+0

Điều đó có nghĩa là có cách tôi nên làm? giải thích một chút sẽ tốt hơn :) – hammythepig

+0

Tạo một khu vực trong cửa sổ hiện có cho hoạt ảnh. –

Trả lời

8

Bạn có thực sự cần nhiều cửa sổ không? Ý tôi là, bạn có thực sự cần chúng không?

Nếu có, thì có thể bạn nên sử dụng pyglet/cocos2d để thay thế.

Để có nhiều cửa sổ trong pygame, bạn cần nhiều quy trình (một cho mỗi cửa sổ). Trong khi điều này là doable, nó không có giá trị efford. Bạn sẽ cần IPC để trao đổi dữ liệu giữa các cửa sổ và tôi đoán mã của bạn sẽ trở nên dễ bị lỗi và xấu xí.

Đi với pyglet khi bạn cần nhiều hơn một cửa sổ.

Giải pháp tốt hơn có thể là chia trò chơi của bạn thành cảnh. Tạo nhiều cảnh để mỗi cảnh tượng trưng cho một giai đoạn của trò chơi, giống như MenuScene, MainScene, BattleScene, GameOverScene, OptionScene, v.v.

Sau đó, hãy để mỗi cảnh xử lý đầu vào/bản vẽ của phần chính của trò chơi đó.

  • MenuScene xử lý bản vẽ và đầu vào vv của menu của trò chơi
  • MainScene xử lý bản vẽ và đầu vào vv của trò chơi chạy
  • BattleScene handle vẽ và đầu vào vv của bất cứ điều gì bạn làm trong run_ani

Trong vòng chính của bạn, chỉ cần chuyển quyền kiểm soát sang cảnh hiện tại bằng cách triển khai các phương pháp draw(), handle_event()update().

Một số mã ví dụ để có được những ý tưởng:

scenes = {'Main': MainScene(), 
      'Battle': BattleScene()} #etc 

scene = scenes['Main'] 

class MainScene(): 
    ... 
    def handle_event(self, event): 
    if event.type == KEYUP: 
     if event.key == K_a: 
     scene = scenes['Battle'] 
    ... 

class BattleScene(): 
    ... 
    def draw(self): 
    # draw your animation 

    def update(self): 
    # if animation is over: 
    scene = scenes['Main'] 

... 

def main_game(): 
    ending=False 
    While Not ending: 
     clock.tick(30) 
     for event in pygame.event.get(): 
     scene.handle_event(event) 
     scene.update() 
     scene.draw() 

Đây là một cách dễ dàng để sạch tách logic trò chơi và cho phép chuyển đổi ngữ cảnh.

+0

Ồ, tôi thấy, sử dụng một số lớp học. Tôi không bao giờ thích các lớp học khiến họ trông rất khó hiểu, nhưng tôi hiểu những gì bạn đã viết ở đó. Tôi nghĩ rằng tôi thậm chí sẽ xem xét các lớp học nhiều hơn và học hỏi nhiều điều hơn. Bây giờ tôi đang trả lời bạn, điều này dường như là một cách đơn giản và hiệu quả để làm những gì tôi muốn, cảm ơn rất nhiều! :) – hammythepig

+0

đó là một ý tưởng thông minh, chia sẻ kiến ​​thức của bạn về những điều như vậy. Tôi thích học tất cả những thứ này, thú vị và thú vị cùng một lúc. – hammythepig

1

====================================== Chỉnh sửa ======= ==================================

Thực ra nó sẽ không hoạt động. Appgly pygame chỉ hỗ trợ một màn hình hiển thị, và khi bạn khởi tạo một màn hình khác, nó sẽ đóng đầu tiên. Bạn sẽ ở lại với hai biến thể, mà trên thực tế là cùng một bề mặt. Bạn có thể có thay vì trò chơi tăng kích thước cửa sổ và chơi cảnh chiến đấu ở phía bên của nó, để làm điều này, bạn có thể gọi pygame.display.set_mode() một lần nữa với các giá trị khác nhau. Biến thể tham chiếu đến màn hình hiển thị vẫn có thể sử dụng được, vì nó thay đổi tham chiếu của nó thành hình mới. Sau khi cảnh quay kết thúc, bạn có thể giảm cửa sổ ngược lại.

============================================== ====================================

Điều cơ bản xảy ra là bạn chạy vòng lặp và mỗi lần lặp của nó sẽ hiển thị và hiển thị một khung hình mới. Khi bạn gọi một hàm bên trong một vòng lặp, nó không tiếp tục chạy cho đến khi bạn kết thúc chạy hàm.

Một cách để giải quyết problen này chỉ là tiếp tục gọi chức năng cập nhật cảnh chiến đấu trong vòng lặp chính. Một cách khác là sử dụng luồng. Threading về cơ bản đang chạy nhiều script ("Threads") trong cùng một thời điểm.

May mắn thay, python đã thực hiện điều này cho chúng tôi với mô-đun luồng. Quá dài để tôi giải thích mô-đun ở đây, nhưng bạn có thể tìm hiểu nó here. Nó có thể là một chút phức tạp nếu bạn chưa sử dụng các chủ đề trước đây, nhưng sau một thời gian nó sẽ dễ dàng hơn. Và nếu bạn muốn tìm hiểu thêm về luồng, bạn có thể truy cập here.

Cụ thể ở đây, bạn có thể có hai luồng, một cho mỗi vòng lặp/cửa sổ và chạy chúng cùng một lúc.

Hy vọng tôi đã giúp bạn!