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"