2017-08-09 19 views
2

我需要在我的實習中爲這個客戶添加一個字庫(對於沒有任何編程背景的人)。下面顯示的pygame是我所擁有的骨架(顯然不能向互聯網顯示內部代碼),我需要一個函數,它需要2個文本對象,並將它們放置在一個單獨的區域中,像歷史測試中的一個字庫一樣以垂直方式放置或者其他的東西。如何添加一個wordbank區域到pygame

如何使用pygame庫將此GUI類型元素實現到此代碼中?

本質上下面的這個遊戲運行時會填充兩個文本框對象,以便在用戶屏幕上拖動。我想要一個指定的(內部或外部)區域來放置這些單詞,這樣當遊戲加載時,這些單詞將在列中排列在窗口的邊上。

import sys 
import pygame as pg 


pg.init() 
FONT = pg.font.Font(None, 42) 


class Text(pg.sprite.Sprite): 

    def __init__(self, text, pos, color, *groups): 
     super().__init__(*groups) 
     self.image = FONT.render(text, True, color) 
     self.rect = self.image.get_rect(center=pos) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group(
     Text('hello', (100, 300), pg.Color('steelblue1')), 
     Text('world', (250, 300), pg.Color('sienna1')), 
     ) 

    selected = None 
    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEBUTTONDOWN: 
       for sprite in all_sprites: 
        if sprite.rect.collidepoint(event.pos): 
         selected = sprite 
         break 
      elif event.type == pg.MOUSEBUTTONUP: 
       selected = None 
      elif event.type == pg.MOUSEMOTION: 
       if selected: 
        selected.rect.center = event.pos 

     all_sprites.update() 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 
+0

你的「我需要一個函數,它需要2個文本對象並將它們放置在一個單獨的區域以垂直方式」太含糊。請[編輯]你的問題,並更詳細地解釋,以及這與你目前的問題中的代碼有什麼關係。 – martineau

+1

編輯幫助嗎? – supahoopa95

+0

是的,那樣更好。 'pygame'本身不會執行多個窗口。可以使用多處理並創建一個也可以使用它並運行自己的主顯示循環的子任務,但是它和主進程需要使用[IPC]進行通信(https://en.wikipedia.org/wiki/Inter -process_communication),這會變得複雜。在一個單獨的「pygame」程序中,您可以將一列字詞作爲一組精靈,這將允許您執行一些操作,例如集體移動它們。用戶/程序與他們的互動到底是什麼? – martineau

回答

0

下面是一個示例,演示了我在評論中提到的內容。我只是使用area矩形來定義一個區域,您可以在其中放置文本對象並將它們附加到text_objects列表中。如果我選擇這些對象中的一個,我只是將它們從列表中刪除。

import sys 
import pygame as pg 


pg.init() 
FONT = pg.font.Font(None, 42) 


class Text(pg.sprite.Sprite): 

    def __init__(self, text, pos, color, *groups): 
     super().__init__(*groups) 
     self.image = FONT.render(text, True, color) 
     self.rect = self.image.get_rect(center=pos) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group(
     Text('hello', (300, 300), pg.Color('steelblue1')), 
     Text('world', (450, 300), pg.Color('sienna1')), 
     ) 

    area = pg.Rect(100, 70, 100, 300) 
    text_objects = [] 
    selected = None 
    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEBUTTONDOWN: 
       for sprite in all_sprites: 
        if sprite.rect.collidepoint(event.pos): 
         selected = sprite 
         if selected in text_objects: 
          text_objects.remove(selected) 
         break 
      elif event.type == pg.MOUSEBUTTONUP: 
       if selected and selected.rect.colliderect(area): 
        selected.rect.centerx = area.centerx 
        text_objects.append(selected) 
       selected = None 
      elif event.type == pg.MOUSEMOTION: 
       if selected: 
        selected.rect.center = event.pos 

     all_sprites.update() 

     screen.fill((30, 30, 30)) 
     pg.draw.rect(screen, (190, 120, 20), area, 2) 
     for y, sprite in enumerate(text_objects): 
      sprite.rect.y = y * sprite.rect.h + area.top 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 
相關問題