簡體   English   中英

Pygame 畫一條線我就是看不到?

[英]Is Pygame Drawing a Line and I Just Can't See It?

我是 OOP 的新手,並試圖了解使用類和方法的要點。 在這種特殊情況下,我使用 class 創建了兩個紅色節點,並設法通過我的 class 使用MOUSEBUTTONDOWN

但是,當我嘗試使用MOUSEBUTTONDOWN事件繪制一條線時,似乎什么也沒有發生。 我在多個地方使用了測試打印語句,以確保我“到達”我的 class 並且該方法正在執行。 然而,似乎沒有什么能讓我的紅線出現。

我還將 draw 語句從方法中移出,接近我的游戲循環的末尾並且它正確顯示。

我對類和方法有什么誤解?

import pygame

    class Rnode():
        def __init__(self, x, y, image_rednode):
          self.x = x
          self.y = y
          self.image_rednode = image_rednode
          self.rect = self.image_rednode.get_rect()
          self.rect.topleft = (x, y)
          self.clicked = False
          self.wired = False
         
         # draw node line
    
        def put(self):
          
            screen.blit(self.image_rednode, (self.x, self.y))
    
          #get mouse position
            pos = pygame.mouse.get_pos()
          
          
          #check mouseover and clicked
            if self.rect.collidepoint(pos):
               if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                  self.clicked = True
                  print('gotcha' + str(self))
                  self.wired = True
            
             
             
               if pygame.mouse.get_pressed()[0] == 0:
                  self.clicked = False
    
        def draw_line(self):
            if pygame.mouse.get_pressed()[0]:
               self.pos = pygame.mouse.get_pos()
               pygame.draw.line(screen,red,(self.x + 15, self.y + 15),(self.pos), 3)
            
            
    
    # these are the colors 
    green = (48, 141, 70) 
    grey = (211, 211, 211)
    lime = (201, 223, 202)
    purplish = (116,137,192)
    orange = (234,168,0)
    brown = (59,47,47)
    blue = (0,91,150)
    red = (255,8,0)
    
    screen = pygame.display.set_mode((1280, 720))
    pygame.display.set_caption('Classy, Baby!')
    running = 1
    xb = pygame.image.load(r'xb7white.png').convert_alpha()
    rednode = pygame.image.load('redhole.svg').convert_alpha()
    rednode = pygame.transform.scale(rednode, (100, 100))
    
    # make node instances
    
    r1 = Rnode(300, 300, rednode)
    r2 = Rnode(500, 300, rednode)
    
    
    while running:
         screen.fill((0, 0, 0))
         event = pygame.event.poll()
         if event.type == pygame.QUIT:
             running = 0
         if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        pygame.quit()
        #  if event.type == pygame.MOUSEBUTTONDOWN: # if the user pressed a mouse button 
        #    pos = pygame.mouse.get_pos() # get the mouse pos 
        #    if g1.rect.collidepoint(pos):
          
          
         r1.put()
         r2.put()
         
         if r1.wired:
             r1.draw_line()
    
         
         pygame.display.flip()

pygame.mouse.get_pressed()不是一個事件,而是給出鼠標按鈕的當前 state。 Rnode代表一個節點,不應該畫線或處理事件。 在事件循環中處理事件並將行添加到列表中:

import pygame

class Rnode():
    def __init__(self, x, y, image_rednode):
        self.image_rednode = image_rednode
        self.rect = self.image_rednode.get_rect(center = (x, y))
    def put(self):
        screen.blit(self.image_rednode, self.rect)

class Line():
    def __init__(self, nodeFrom, nodeTo):
        self.form = nodeFrom
        self.to = nodeTo
    def draw(self):
        p1 = self.form.rect.center
        p2 = self.to.rect.center
        pygame.draw.line(screen, "yellow", p1, p2, 3)

screen = pygame.display.set_mode((300, 300))
pygame.display.set_caption('Classy, Baby!')
clock = pygame.time.Clock()

#rednode = pygame.image.load('redhole.svg').convert_alpha()
#rednode = pygame.transform.scale(rednode, (100, 100))
rednode = pygame.Surface((40, 40), pygame.SRCALPHA)
pygame.draw.circle(rednode, "red", (20, 20), 20)

nodes = [
    Rnode(100, 100, rednode), Rnode(200, 100, rednode),
    Rnode(100, 200, rednode), Rnode(200, 200, rednode)]
lines = []
start = None

running = 1
while running:
    clock.tick(60)
        
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = 0
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = 0
        
        if event.type == pygame.MOUSEBUTTONDOWN:
            for node in nodes:
                if node.rect.collidepoint(event.pos):
                    if start and start != node:
                        lines.append(Line(start, node))
                        start = None
                    else:
                        start = node
                    break

                
    screen.fill((0, 0, 0))
    for line in lines:
        line.draw()
    if start:
        pygame.draw.line(screen, "yellow", start.rect.center, pygame.mouse.get_pos(), 3)  
    for node in nodes:
        node.put()
    pygame.display.flip()

pygame.quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM