2012-04-16 62 views
6

Tôi đang tạo trò chơi trong pygame và trên màn hình đầu tiên tôi muốn có các nút mà bạn có thể nhấn để (i) bắt đầu trò chơi, (ii) tải màn hình mới với hướng dẫn và (iii) thoát khỏi chương trình .Làm cách nào để tạo các nút trong python/pygame?

Tôi đã tìm thấy mã này trực tuyến để thực hiện nút, nhưng tôi không thực sự hiểu nó (tôi không giỏi về lập trình hướng đối tượng). Nếu tôi có thể nhận được một số lời giải thích như những gì nó đang làm đó sẽ là tuyệt vời. Ngoài ra, khi tôi sử dụng nó và cố gắng để mở một tập tin trên máy tính của tôi bằng cách sử dụng đường dẫn tập tin, tôi nhận được lỗi sh: filepath: Quyền bị từ chối, mà tôi không biết làm thế nào để giải quyết.

#load_image is used in most pygame programs for loading images 
def load_image(name, colorkey=None): 
    fullname = os.path.join('data', name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error, message: 
     print 'Cannot load image:', fullname 
     raise SystemExit, message 
    image = image.convert() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 
class Button(pygame.sprite.Sprite): 
    """Class used to create a button, use setCords to set 
     position of topleft corner. Method pressed() returns 
     a boolean and should be called inside the input loop.""" 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image('button.png', -1) 

    def setCords(self,x,y): 
     self.rect.topleft = x,y 

    def pressed(self,mouse): 
     if mouse[0] > self.rect.topleft[0]: 
      if mouse[1] > self.rect.topleft[1]: 
       if mouse[0] < self.rect.bottomright[0]: 
        if mouse[1] < self.rect.bottomright[1]: 
         return True 
        else: return False 
       else: return False 
      else: return False 
     else: return False 
def main(): 
    button = Button() #Button class is created 
    button.setCords(200,200) #Button is displayed at 200,200 
    while 1: 
     for event in pygame.event.get(): 
      if event.type == MOUSEBUTTONDOWN: 
       mouse = pygame.mouse.get_pos() 
       if button.pressed(mouse): #Button's pressed method is called 
        print ('button hit') 
if __name__ == '__main__': main() 

Cảm ơn mọi người có thể giúp tôi.

Trả lời

12

Tôi không có một ví dụ mã cho bạn, nhưng làm thế nào tôi sẽ làm điều đó là để:

  1. Tạo một lớp Button, với các văn bản để đi vào nút như một đối số nhà xây dựng
    1. Tạo một bề mặt Pygame, hoặc là một hình ảnh hoặc điền rect
    2. Render văn bản trên nó với những thứ Font.Render trong Pygame
  2. blit để chơi game màn hình, tiết kiệm rect đó.
  3. Kiểm tra, khi nhấp chuột, để xem mouse.get_pos() khớp với một điều phối ở trực tràng mà nó quay trở lại bằng dấu của nút đến bề mặt chính.

Điều đó tương tự như ví dụ của bạn, mặc dù vẫn khác nhau.

+0

Được rồi, tôi sẽ thử điều đó, cảm ơn sự giúp đỡ. – user1334014

0

'Mã' bạn đã tìm thấy trực tuyến không tốt. Tất cả bạn cần phải thực hiện một nút là điều này. Đặt mã này ở gần đầu mã của bạn:

def Buttonify(Picture, coords, surface): 
    image = pygame.image.load(Picture) 
    imagerect = image.get_rect() 
    imagerect.topright = coords 
    surface.blit(image,imagerect) 
    return (image,imagerect) 

Đặt nội dung sau vào vòng lặp trò chơi của bạn. Cũng ở đâu đó trong vòng lặp trò chơi của bạn:

Image = Buttonify('YOUR_PICTURE.png',THE_COORDS_OF_THE_BUTTON'S_TOP_RIGHT_CORNER, THE_NAME_OF_THE_SURFACE) 

cũng đặt này trong vòng lặp trò chơi của bạn bất cứ nơi nào bạn đã làm for event in pygame.event.get

if event.type == MOUSEBUTTONDOWN and event.button == 1: 
    mouse = pygame.mouse.getpos 
    if Image[1].collidrect(mouse): 
     #code if button is pressed goes here 

Vì vậy, buttonify tải hình ảnh đó sẽ là vào nút. Hình ảnh này phải là tệp .jpg hoặc bất kỳ tệp PICTURE nào khác trong cùng thư mục với mã. Hình ảnh là tên của nó. Tên phải có .jpg hoặc bất kỳ thứ gì khác sau tên và tên phải nằm trong dấu ngoặc kép. Tham số coords trong Buttonify là tọa độ trên cùng bên phải trên màn hình hoặc cửa sổ mở ra từ pygame. Bề mặt là điều này:

blahblahblah = pygame.surface.set_mode((WindowSize)) 
/|\ 
    | 
    Surface's Name 

Vì vậy, nó chức năng làm một cái gì đó gọi là 'image' mà là một bề mặt pygame, nó đặt một hình chữ nhật xung quanh nó gọi là 'imagerect' (để cài đặt nó tại một địa điểm và cho phần thứ hai tham số khi blitting,) và sau đó nó đặt vị trí của nó, và blits nó trên thứ hai để cuối cùng dòng cuối cùng.

Đoạn mã tiếp theo làm cho 'Hình ảnh' trở thành một bộ dữ liệu của cả 'hình ảnh' và 'imagerect'.

Mã cuối cùng có if event.type == MOUSEBUTTONDOWN and event.button == 1: về cơ bản có nghĩa là nếu nhấn nút chuột trái. Mã này PHẢI ở trong for event in pygame.event.get. Dòng tiếp theo làm cho chuột trở thành vị trí của chuột.Dòng cuối cùng kiểm tra nếu con chuột va chạm với Image [1] mà chúng ta biết là 'imagerect'. Các mã sau đó.

Hãy cho tôi biết nếu tôi cần giải thích thêm.

0

Vì vậy, bạn phải thực hiện chức năng có tên nút nhận 8 tham số. 1) Thông báo của nút 2) Vị trí X của góc trên bên trái của nút 3) Vị trí Y của góc trên cùng bên trái của nút 4) Chiều rộng của nút 5) Chiều cao của nút 6) Màu không hoạt động (màu nền)) 7) Nhiều màu (màu khi bạn di chuột) 8) Tên của hành động mà bạn muốn phí phạm

def button (msg, x, y, w, h, ic, ac, action=None): 
    mouse = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 

    if (x+w > mouse[0] > x) and (y+h > mouse[1] > y): 
     pygame.draw.rect(watercycle, CYAN, (x, y, w, h)) 
     if (click[0] == 1 and action != None): 
      if (action == "Start"): 
       game_loop() 
      elif (action == "Load"): 
       ##Function that makes the loading of the saved file## 
      elif (action == "Exit"): 
       pygame.quit() 

    else: 
     pygame.draw.rect(watercycle, BLUE, (x, y, w, h)) 
     smallText = pygame.font.Font("freesansbold.ttf", 20) 
     textSurf, textRect = text_objects(msg, smallText) 
     textRect.center = ((x+(w/2)), (y+(h/2))) 
     watercycle.blit(textSurf, textRect) 

Vì vậy, khi bạn tạo vòng lặp trò chơi của bạn và bạn gọi vào nút chức năng:

nút ("Bắt đầu", 600, 120, 120, 25, BLUE, CYAN, "Bắt đầu")

0

Đây là lớp dành cho nút tôi đã làm cách đây: https://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl=0 Nút này có kiểu cửa sổ 7 như tôi nhớ và tôi không thể thử nghiệm gần đây vì tôi không có pygame trên máy tính đang sử dụng. Hi vọng điêu nay co ich!

Các vấn đề liên quan