微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使精灵在点击时消失

如何解决使精灵在点击时消失

我正在使用 python 制作泡泡点击游戏。游戏的主要目标是点击屏幕上的一些气泡。目前,屏幕上出现了 3 行,每行 10 个气泡。

游戏目前没有交互性,我想添加一些。但问题是我不知道如何让每个单独的气泡检测到鼠标按下。

这里是游戏主程序的代码Clicking_Game.py

import pygame

from pyfiles.bubble import Bubble
from pyfiles.settings import Settings
import pyfiles.game_functions as gf


def run_game():
    """ Main Function """

    pygame.init()

    # Initialize settings
    clock = pygame.time.Clock()
    settings = Settings()
    FPS = settings.FPS

    # Importing classes and displaying
    display = pygame.display.set_mode((settings.screen_width,settings.screen_height))  # flags=pygame.NOFRAME
    bubble = Bubble(display)

    # displaying caption,icon and background image
    version = 'v1.0.0'
    icon = pygame.image.load('pyfiles/images/bubble.png')
    background_image = pygame.image.load('pyfiles/images/background_image.jpg')

    pygame.display.set_caption(f'Clicking Game {version}') # displaying caption
    pygame.display.set_icon(icon) # displaying icon
    display.blit(background_image,(0,0)) # displaying background image

    while True:
        # Checking for events
        gf.check_events()

        clock.tick(FPS)

        # displaying Items
        gf.bubble_action(bubble)

        # Updating
        gf.update_screen()


run_game()

这是 game_functions.py代码

import pygame,sys

def check_events():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

def bubble_action(bubble):
    global all_sprites

    global row

    columns = 3
    rows = 10

    for column in range(1,50 * columns,50):
        for row in range(1,60 * rows,60):
            bubble.blitme(row,column)

def update_screen():
    pygame.display.flip()

最后,这里是 bubbles.py代码

import pygame

class Bubble(pygame.sprite.Sprite):
    def __init__(self,screen):
        pygame.sprite.Sprite.__init__(self)

        self.screen = screen
        self.image = pygame.image.load('./pyfiles/images/bubble.png')

        # Locate all of the bubbles on screen
        self.bubble_positions = []

    def blitme(self,x,y):
        self.image_x = x
        self.image_y = y

        self.screen.blit(self.image,(self.image_x,self.image_y))

以我目前拥有的,我可以添加(或删除)什么来使玩家点击气泡时单独消失?

解决方法

为了检测气泡何时被点击,您需要首先检测某物何时被点击,然后检查该点击是否发生在气泡内。这需要在您的实现中加入一些新的东西。首先,您需要能够检测点击,然后是删除气泡的函数,这将需要一种存储气泡的方法,您有一个数组用于存储气泡,但您从不使用它

您可以将其添加到 check_events 以检测点击次数:

def check_events(bubble): # needs to have a reference to the bubble object so it can call a function to remove bubbles
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        
        if event.type == pygame.MOUSEBUTTONDOWN : # check if a mouse button has been pressed on this specific frame
            click_pos = mygame.mouse.get_pos()
            bubble.check_collision(click_pos) # new function in Bubble.py,see below         

现在将这段代码添加到 Bubble.__init__() 中:

def __init__(self,screen,bubble_positions): # new addition to __init__() to store bubble positions
    pygame.sprite.Sprite.__init__(self)

    self.screen = screen
    self.image = pygame.image.load('./pyfiles/images/bubble.png')

    # Locate all of the bubbles on screen
    self.bubble_positions = bubble_positions # change this to store the bubble positions
    

并将其添加到您创建 bubble 对象的部分:

bubble_positions = [(x * 10 + 10,y * 3 + 3) for x in range(10) for y in range(3)] # generate all bubble positions using list comprehension
bubble = Bubble(display,bubble_positions)

既然您有一个可以更改的气泡列表,您需要从列表中绘制气泡,而不是使用硬编码的 for 循环。相应地更改 bubble_action()

def bubble_action(bubble):
    for b in bubble.bubble_positions :
        bubble.blitme(b[0],b[1])

现在我们需要一个新函数来检测某个位置是否有气泡。此实现假设气泡是一个中心在 (x,y) 且半径为 5 的完美圆(如果半径不同,您可以更改此设置)。在Bubble

def check_collision(pos) :
    r = 5
    for b in self.bubble_positions :
        if (b[0] - pos[0])**2 + (b[1] - pos[1])**2 > r**2) : # checks if pos is inside bubble at position b
            self.bubble.positions.remove(b) # delete the bubble
            break

现在我们拥有了检测气泡何时被点击并删除它的所有必要函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。