如何解决使精灵在点击时消失
我正在使用 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 举报,一经查实,本站将立刻删除。