Start event when button is clicked with pygame

前端 未结 1 844
旧时难觅i
旧时难觅i 2021-01-29 06:29

Hey guys am new to pygame.I have developed a simple game in which the ball bounce each other.It works fine.

I have added a ui with buttons with options like new ga

1条回答
  •  孤街浪徒
    2021-01-29 07:09

    So your problem is that, first you always draw the balls and second you don't check for a mouse click. An easy way to do this check is to call pygame.event.get([pygame.MOUSEBUTTONDOWN]) right where you check if the mouse position is over one of the options. If it returns something else than None stop displaying the options and start displaying the balls.

    So you would do something like that: import pygame import math from itertools import cycle

    OPTIONS = 0
    BALLS = 1
    
    def magnitude(v):
        return math.sqrt(sum(v[i]*v[i] for i in range(len(v))))
    
    def add(u, v):
        return [ u[i]+v[i] for i in range(len(u)) ]
    
    def sub(u, v):
        return [ u[i]-v[i] for i in range(len(u)) ]    
    
    def dot(u, v):
        return sum(u[i]*v[i] for i in range(len(u)))
    
    def normalize(v):
        vmag = magnitude(v)
        return [ v[i]/vmag  for i in range(len(v)) ]
    
    screen = pygame.display.set_mode((300, 300))
    clock = pygame.time.Clock()  
    
    
    
    class Ball(object):
        def __init__(self, path):
            self.x, self.y = (0, 0)
            self.img = pygame.image.load('/home/wastl/Documents/DSC_0051.JPG')
            self.speed = 2.5
            self.color = (200, 200, 200)
            self.path = cycle(path)
            self.set_target(next(self.path))
            #self.sound = pygame.mixer.music.load('yeah.mp3')
    
    
        @property
        def pos(self):
            return self.x, self.y
    
    # for drawing, we need the position as tuple of ints
    # so lets create a helper property
        @property
        def int_pos(self):
            return map(int, self.pos)
    
        @property
        def target(self):
            return self.t_x, self.t_y
    
        @property
        def int_target(self):
            return map(int, self.target)   
    
        def next_target(self):
            self.set_target(self.pos)
            self.set_target(next(self.path))
    
        def set_target(self, pos):
            self.t_x, self.t_y = pos
    
        def update(self):
        # if we won't move, don't calculate new vectors
            if self.int_pos == self.int_target:
                return self.next_target()
    
            target_vector = sub(self.target, self.pos) 
    
        # a threshold to stop moving if the distance is to small.
        # it prevents a 'flickering' between two points
            if magnitude(target_vector) < 2: 
                return self.next_target()
    
        # apply the balls's speed to the vector
            move_vector = [c * self.speed for c in normalize(target_vector)]
    
        # update position
            self.x, self.y = add(self.pos, move_vector)
    
        def draw(self):
            screen.blit(self.img, self.int_pos)
            #pygame.mixer.music.play()
    
    class Option:
    
    
    
        def __init__(self, text, pos):
            self.hovered = False
            self.text = text
            self.pos = pos
            self.set_rect()
            self.draw()
    
        def draw(self):
            self.set_rend()
            screen.blit(self.rend, self.rect)
    
        def set_rend(self):
            self.rend = menu_font.render(self.text, True, self.get_color())
    
        def get_color(self):
            if self.hovered:
                return (255, 255, 255)
            else:
                return (100, 100, 100)
    
        def set_rect(self):
            self.set_rend()
            self.rect = self.rend.get_rect()
            self.rect.topleft = self.pos
    
    pygame.init()
    quit = False
    path = [(26, 43),(105, 110),(45, 225),(145, 295),(266, 211),(178, 134),(250,5),(147,12)] 
    
    path2 = [(26, 43),(105, 10),(45, 125),(150, 134),(150, 26),(107, 12)]
    
    
    ball = Ball(path)
    
    ball.speed = 1.9
    
    ball2 = Ball(path2)
    
    ball2.color = (200, 200, 0)
    
    balls = [ball, ball2]
    
    
    screen = pygame.display.set_mode((480, 320))
    
    menu_font = pygame.font.Font(None, 40)
    
    options = [Option("NEW GAME", (140, 105)), Option("LOAD GAME", (135, 155)),
           Option("OPTIONS", (145, 205))]
    
    STATE = OPTIONS
    
    while not quit:
    
        pygame.event.pump()
        screen.fill((0, 0, 0))
    
        if STATE == OPTIONS:
    
            for option in options:
                if option.rect.collidepoint(pygame.mouse.get_pos()):
                    option.hovered = True
                    if pygame.event.get([pygame.MOUSEBUTTONDOWN]) and option.text == "NEW GAME":
                        STATE = BALLS
                else:
                    option.hovered = False
                option.draw()
                pygame.display.update()
    
        elif STATE == BALLS:
            map(Ball.update, balls)
    
            screen.fill((0, 0, 0))
    
            map(Ball.draw, balls)
    
            pygame.display.flip()
    
    
        quit = pygame.event.get(pygame.QUIT)
        pygame.event.poll()
    
        clock.tick(60)
    

    0 讨论(0)
提交回复
热议问题