使用pygame单击按钮时启动事件

时间:2014-07-02 05:39:30

标签: python pygame bounce pygame-surface

嘿,伙计们是pygame的新手。我开发了一个简单的游戏,其中球相互反弹。它运作良好。

我添加了一个带有按钮的ui,其中包含new gameloadgameoptions等选项。

我需要的是当用户点击new game button时,他必须看到球弹跳。我的代码是

import pygame
import math
from itertools import cycle

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('ball.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:


hovered = False

def __init__(self, text, pos):
    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))]

while not quit:

pygame.event.pump()
screen.fill((0, 0, 0))
for option in options:
    if option.rect.collidepoint(pygame.mouse.get_pos()):
        option.hovered = True
    else:
        option.hovered = False
    option.draw()
pygame.display.update()

quit = pygame.event.get(pygame.QUIT)
pygame.event.poll()

map(Ball.update, balls)

screen.fill((0, 0, 0))

map(Ball.draw, balls)

pygame.display.flip()
clock.tick(60)

当我尝试这个代码时,球反弹并且起始ui工作正常,但是当我点击新按钮图标时它没有显示任何内容。

我需要的是当用户点击new game按钮时,它必须重定向到球弹跳屏幕。

我已经尝试过pygame.mouse.get_pressed,但它并没有帮助我。

希望你们能帮帮我。

提前完成

1 个答案:

答案 0 :(得分:0)

所以你的问题是,首先你总是画球,然后你不检查鼠标点击。一个简单的方法是检查pygame.event.get([pygame.MOUSEBUTTONDOWN]),检查鼠标位置是否超过其中一个选项。如果它返回的内容不是None,则停止显示选项并开始显示球。

所以你会做那样的事情:     导入pygame     导入数学     来自itertools导入周期

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)