目标:实现菜单的点击相应
思路,在特定位置设定菜单(image属性),鼠标点击后,得到鼠标点的坐标。
取得菜单的坐标点属性menu_rect,取得鼠标点的坐标 pos
比较坐标点pos是否位于菜单框内menu_rect,x和y 坐标,同时满足四次判断就在菜单内,不然就不是。
简单的例子,代码如下:
import pygame
from sys import exit
#定义屏幕类
class MainScene(object):
#初始化
def __init__(self):
pygame.init()
self.size = (480,860)
self.scene = pygame.display.set_mode(self.size)
pygame.display.set_caption("自学飞机大战--V0.98")
self.image = pygame.image.load('./images/bg.png')
self.quit_image = pygame.image.load('./images/quit.png')
self.restart_image = pygame.image.load('./images/restart.png')
self.quit_rect = self.quit_image.get_rect()
self.restart_rect = self.restart_image.get_rect()
#绘制各个元素
def drawElements(self):
self.scene.blit(self.image,(0,0))
self.scene.blit(self.restart_image,(150,150))
self.scene.blit(self.quit_image,(150,300))
#处理键盘和鼠标相应
def handleEvent(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
# 获得鼠标点击三个按钮的点击情况(1,0,0)
# 如果第一个参数为1,表示左键被按下
# 如果第二个参数为1,表示滚轮被按下
# 如果第三个参数为1,表示右键被按下
buttons = pygame.mouse.get_pressed()
# 我们只处理左键被按下的情况
if buttons[0]:
# 注释的代码为跟踪弹的实现方式
# 获得拖动鼠标的拖动位置
pos_mouse = pygame.mouse.get_pos()
print (self.quit_rect,pos_mouse)
if (self.quit_rect.left < pos_mouse[0] < self.quit_rect.right
and self.quit_rect.top < pos_mouse[1] < self.quit_rect.bottom):
print ("quit")
#运行主程序
def runScene(self):
while True:
self.drawElements()
self.handleEvent()
# self.bullet_sprite.update()
pygame.display.update()
# pygame.time.delay(100)
if __name__ == '__main__':
mainScene = MainScene()
mainScene.runScene()
运行结果不是想要的,看输出的结果,quite_rect的坐标x,y是 0,犯了一个常识性错误,图像的默认rect是针对图像自己的,
scent.blit里面的坐标是图像在屏幕上的显示位置,不能改变图像的坐标点。改下代码,让图像的坐标改变。
self.quit_rect.left, self.quit_rect.top = 150, 300
self.scene.blit(self.quit_image,self.quit_rect)
菜单的功能实现了。
不过,pygame自带的碰撞检查可以直接用下,不用这么多点位的判定。
- pygame.Rect.collidepoint() — 检测一个点是否包含在该 Rect 对象内
判断语句改为
if self.quit_rect.collidepoint(pos_mouse):
完整代码如下:
import pygame
from sys import exit
#定义屏幕类
class MainScene(object):
#初始化
def __init__(self):
pygame.init()
self.size = (480,860)
self.scene = pygame.display.set_mode(self.size)
pygame.display.set_caption("自学飞机大战--V0.98")
self.image = pygame.image.load('./images/bg.png')
self.quit_image = pygame.image.load('./images/quit.png')
self.restart_image = pygame.image.load('./images/restart.png')
self.quit_rect = self.quit_image.get_rect()
self.restart_rect = self.restart_image.get_rect()
#绘制各个元素
def drawElements(self):
self.scene.blit(self.image,(0,0))
self.restart_rect.left, self.restart_rect.top = 150,150
self.scene.blit(self.restart_image,self.restart_rect)
self.quit_rect.left, self.quit_rect.top = 150, 300
self.scene.blit(self.quit_image,self.quit_rect)
#处理键盘和鼠标相应
def handleEvent(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
# 获得鼠标点击三个按钮的点击情况(1,0,0)
# 如果第一个参数为1,表示左键被按下
# 如果第二个参数为1,表示滚轮被按下
# 如果第三个参数为1,表示右键被按下
buttons = pygame.mouse.get_pressed()
# 我们只处理左键被按下的情况
if buttons[0]:
# 注释的代码为跟踪弹的实现方式
# 获得拖动鼠标的拖动位置
pos_mouse = pygame.mouse.get_pos()
print (self.quit_rect,pos_mouse)
if self.quit_rect.collidepoint(pos_mouse):
print('quit')
if self.restart_rect.collidepoint(pos_mouse):
print('restart')
# if (self.quit_rect.left < pos_mouse[0] < self.quit_rect.right
# and self.quit_rect.top < pos_mouse[1] < self.quit_rect.bottom):
# print ("quit")
#运行主程序
def runScene(self):
while True:
self.drawElements()
self.handleEvent()
pygame.display.update()
# pygame.time.delay(100)
if __name__ == '__main__':
mainScene = MainScene()
mainScene.runScene()