一、碰到效果实现思路
1.坐标检测
时刻检测鼠标的坐标,有没有移到目标图片的坐标范围内,此方法无法准确描述不规则图像的坐标范围。
2.精灵碰撞检测
创建一个鼠标精灵类,创建鼠标对象,一直跟着鼠标移动,鼠标对象==鼠标指针
检测鼠标对象精灵,有没有和其他精灵碰撞即可。
二、碰到效果代码实现
1.案例说明
一个飞机精灵 (方向键可控制移动).
一个鼠标精灵,鼠标精灵跟随鼠标。
检测两个精灵对象有无碰撞,碰撞就退出。
2.代码
import pygame,syspygame.init()#pygame库的初始化root_sf = pygame.display.set_mode((480,600))#创建窗口,设置大小'''
1.初始化 __init__
2.重写update
3.image、rect属性或变量
'''
#战斗机
class Plane(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((50,50))self.image.fill('green')self.rect = self.image.get_rect()#rect移动的方式更多self.rect.center = (220,550)#初始化位置,updata方法会将突破移到这个位置def update(self):keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] and self.rect.left > 0:self.rect = self.rect.move((-10,0))elif keys[pygame.K_RIGHT] and self.rect.right < root_sf.get_width():self.rect = self.rect.move((10,0))elif keys[pygame.K_UP] and self.rect.top > 0:self.rect = self.rect.move((0,-10))elif keys[pygame.K_DOWN] and self.rect.bottom < root_sf.get_height():self.rect = self.rect.move((0,10))root_sf.blit(self.image,self.rect)#鼠标类
class Mouse(pygame.sprite.Sprite):def __init__(self):self.image = pygame.Surface((1,1))self.image.fill('red')self.rect = self.image.get_rect()self.rect.center = pygame.mouse.get_pos()#初始位置到鼠标指针def update(self):self.rect.center = pygame.mouse.get_pos()#移到鼠标指针位置root_sf.blit(self.image, self.rect)#创建鼠标精灵
mouse = Mouse()wj_plane = Plane()clock = pygame.time.Clock()
while True:#阻止窗口关闭#事件判断for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()#更新画面root_sf.fill('black')mouse.update()wj_plane.update()#检测玩家飞机是否碰到鼠标指针if pygame.sprite.collide_mask(mouse, wj_plane):sys.exit()#玩家飞机碰到鼠标指针,就退出#刷新屏幕pygame.display.flip()clock.tick(30)
三、点击效果
碰到鼠标 且 鼠标点击 == 图片被点击
1.代码实现
import pygame,syspygame.init()#pygame库的初始化root_sf = pygame.display.set_mode((480,600))#创建窗口,设置大小'''
1.初始化 __init__
2.重写update
3.image、rect属性或变量
'''
#战斗机
class Plane(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface((50,50))self.image.fill('green')self.rect = self.image.get_rect()#rect移动的方式更多self.rect.center = (220,550)#初始化位置,updata方法会将突破移到这个位置def update(self):keys = pygame.key.get_pressed()if keys[pygame.K_LEFT] and self.rect.left > 0:self.rect = self.rect.move((-10,0))elif keys[pygame.K_RIGHT] and self.rect.right < root_sf.get_width():self.rect = self.rect.move((10,0))elif keys[pygame.K_UP] and self.rect.top > 0:self.rect = self.rect.move((0,-10))elif keys[pygame.K_DOWN] and self.rect.bottom < root_sf.get_height():self.rect = self.rect.move((0,10))root_sf.blit(self.image,self.rect)#鼠标类
class Mouse(pygame.sprite.Sprite):def __init__(self):self.image = pygame.Surface((1,1))self.image.fill('red')self.rect = self.image.get_rect()self.rect.center = pygame.mouse.get_pos()#初始位置到鼠标指针def update(self):self.rect.center = pygame.mouse.get_pos()#移到鼠标指针位置root_sf.blit(self.image, self.rect)#创建鼠标精灵
mouse = Mouse()wj_plane = Plane()clock = pygame.time.Clock()
while True:#阻止窗口关闭#事件判断for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()#更新画面root_sf.fill('black')mouse.update()wj_plane.update()#检测玩家飞机是否碰到鼠标指针 且 鼠标点击if pygame.sprite.collide_mask(mouse, wj_plane) and pygame.mouse.get_pressed()[0]:sys.exit()#玩家飞机是否碰到鼠标指针 且 鼠标点击,就退出#刷新屏幕pygame.display.flip()clock.tick(30)
2.鼠标点击事件参考
pygame.mouse — pygame v2.1.1 documentation