2015-11-23 56 views
-1

代碼:pygame的創建曲面

#!/usr/bin/python 

import pygame, time, sys, random, os 
from pygame.locals import * 
from time import gmtime, strftime 

pygame.init() 

w = 640 
h = 400 

screen = pygame.display.set_mode((w, h),RESIZABLE) 
clock = pygame.time.Clock() 
x = y = 100 

def starting(): 
    basicfont = pygame.font.SysFont(None, 48) 
    text = basicfont.render('Starting...', True, (255, 255, 255), (0, 0, 255)) 
    textrect = text.get_rect() 
    textrect.centerx = screen.get_rect().centerx 
    textrect.centery = screen.get_rect().centery 
    screen.fill((0, 0, 255)) 
    screen.blit(text, textrect) 

def taskbar(): 
    basicfont = pygame.font.SysFont(None, 24) 
    taskbarrect = pygame.Rect((0, int(h-40)), (int(w), int(h))) 
    text = basicfont.render(strftime("%Y-%m-%d", gmtime()), True, (0, 0, 0)) 
    text2 = basicfont.render(strftime("%H:%M:%S", gmtime()), True, (0, 0, 0)) 
    taskbarrect.blit(text, (w - 100, h - 37)) 
    taskbarrect.blit(text2, (w - 100, h - 17)) 
    pygame.display.update() 

starting() 
screen.fill((255,255,255)) 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
     elif event.type==VIDEORESIZE: 
      w = event.dict['size'][0] 
      h = event.dict['size'][1] 
      screen=pygame.display.set_mode(event.dict['size'],RESIZABLE) 
    taskbar() 

因爲我想讓我的代碼運行速度更快,我想在它們上面創建曲面和塊傳送rects,這樣我可以做pygame.display.update(taskbarrect),加快我的代碼。但是,我不知道如何創建多個曲面。我試過taskbarrect=(xcoordinate, ycoordinate, width, length)然後blitting一個圖像或文字或任何,但嘗試它說tuple object has no attribute blit。嘗試代碼中的方法(由@elegent建議)給出'pygame.Rect' object has no attribute 'blit'

我在做什麼錯?

+0

僅供參考,it's努力幫助你,當你不提供我們一些代碼在錯誤實際發生。 ;) – elegent

+0

我加了代碼。 –

+0

你不需要創建一個新的Surface;只需將文本粘貼到主屏幕上(請參閱我的更新回答)。 – elegent

回答

3

Pygame使用surfaces來表示任何形式的圖像。這可能是要麼

  • 您的主屏幕表面,它是由pygame.dispaly.set_mode()功能

    myDispaly = pygame.dispaly.set_mode((500, 300)) 
    
  • 退回或裝箱的pygame.Surface類的對象:

    #create a new Surface 
    myNewSurface = Surface((500, 300)) 
    
    #change its (background) color 
    myNewSurface.fill((55,155,255)) 
    
    #blit myNewSurface onto the main screen at the position (0, 0) 
    myDisplay.blit(myNewSurface, (0, 0)) 
    
    #update the sreen to display the changes 
    dispaly.update() #or dispaly.flip) 
    

現在 - 正如你試圖做的 - Pygames dispaly.update()方法允許的您只需通過向其中一個或一列pygame.Rect對象更新屏幕的某些部分即可。爲此,我們也可以撥打:

myUpdateRect= pygame.Rect((500, 300), (0, 0)) 
dispaly.update(myUpdateRect) 

無論如何,我建議使用pygame.draw模塊繪製簡單的形狀像rects多邊形到表面,因爲所有的這些函數返回一個矩形代表變化的像素的邊界區域。

這使您可以將此信息傳遞給update()功能,所以pygame的只更新剛剛繪製的形狀的像素:

myDispaly = pygame.dispaly.set_mode((500, 300)) 

myRect= pygame.Rect((100, 200), (50, 100)) 
pygame.update(pygame.draw(myDispaly, (55, 155, 255), myRect)) 

如果要繪製多個rects,你可以將信息存儲在一個列表,之後傳遞給update()功能:

updateRectList = [] 

updateRectList.append(pygame.draw(myDispaly, (55, 155, 255), myRect)) 
updateRectList.append(pygame.draw(myDispaly, (155, 55, 255), myRect)) 
updateRectList.append(pygame.draw(myDispaly, (55, 255, 155), myRect)) 

pygame.update(updateRectList) 

更新:

def taskbar(): 
    basicfont = pygame.font.SysFont(None, 24) 

    text = basicfont.render(strftime("%Y-%m-%d", gmtime()), True, (0, 0, 0)) 
    text2 = basicfont.render(strftime("%H:%M:%S", gmtime()), True, (0, 0, 0)) 

    screen.fill((55, 155, 255)) 

    screen.blit(text, (w - 100, h - 37)) 
    screen.blit(text2, (w - 100, h - 17)) 

    pygame.display.update() 

希望這有助於:)

+0

回溯(最近通話最後一個): 文件 「桌面/ opsys.py」 45行,在 任務欄() 文件 「桌面/ opsys.py」,第27行,在任務欄 taskbarrect = pygame的。表面((0,INT(H-40)),(INT(W),INT(H))) 類型錯誤:一個整數需要 –

+0

@YuBinLee:正如我在答覆所提到的,該'pygame的的構造.Surface'類需要一個代表表面大小(即分辨率)的元組。要創建一個'pygame.Rect'對象:'taskbarrect = pygame.' **'Rect' **'((0,INT(H-40)),(INT(W),INT(H))) ' – elegent

+0

回溯(最近通話最後一個): 文件 「C:\用戶\廚師\桌面\ opsys.py」 45行,在 任務欄() 文件「C:\用戶\廚師\桌面\ OPSYS。 PY」,線路30,在任務欄 taskbarrect.blit(文本,(W - 100,H - 37)) AttributeError的: 'pygame.Rect' 對象沒有屬性的blit –