Skip to content Skip to sidebar Skip to footer

Start Event When Button Is Clicked With Pygame

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 game,loadgame,optio

Solution 1:

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 = 1defmagnitude(v):
    return math.sqrt(sum(v[i]*v[i] for i inrange(len(v))))

defadd(u, v):
    return [ u[i]+v[i] for i inrange(len(u)) ]

defsub(u, v):
    return [ u[i]-v[i] for i inrange(len(u)) ]    

defdot(u, v):
    returnsum(u[i]*v[i] for i inrange(len(u)))

defnormalize(v):
    vmag = magnitude(v)
    return [ v[i]/vmag  for i inrange(len(v)) ]

screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()  



classBall(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')    @propertydefpos(self):
        return self.x, self.y

# for drawing, we need the position as tuple of ints# so lets create a helper property    @propertydefint_pos(self):
        returnmap(int, self.pos)

    @propertydeftarget(self):
        return self.t_x, self.t_y

    @propertydefint_target(self):
        returnmap(int, self.target)   

    defnext_target(self):
        self.set_target(self.pos)
        self.set_target(next(self.path))

    defset_target(self, pos):
        self.t_x, self.t_y = pos

    defupdate(self):
    # if we won't move, don't calculate new vectorsif 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 pointsif 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)

    defdraw(self):
        screen.blit(self.img, self.int_pos)
        #pygame.mixer.music.play()classOption:



    def__init__(self, text, pos):
        self.hovered = False
        self.text = text
        self.pos = pos
        self.set_rect()
        self.draw()

    defdraw(self):
        self.set_rend()
        screen.blit(self.rend, self.rect)

    defset_rend(self):
        self.rend = menu_font.render(self.text, True, self.get_color())

    defget_color(self):
        if self.hovered:
            return (255, 255, 255)
        else:
            return (100, 100, 100)

    defset_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

whilenot 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 = Trueif 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)

Post a Comment for "Start Event When Button Is Clicked With Pygame"