pygame 飞机大战碰撞检查的运用(一)菜单

目标:实现菜单的点击相应

思路,在特定位置设定菜单(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()

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88613902