一、碰到效果实现思路
1.坐标检测
时刻检测鼠标的坐标,有没有移到目标图片的坐标范围内,此方法无法准确描述不规则图像的坐标范围。
2.精灵碰撞检测
创建一个鼠标精灵类,创建鼠标对象,一直跟着鼠标移动,鼠标对象==鼠标指针
检测鼠标对象精灵,有没有和其他精灵碰撞即可。
二、碰到效果代码实现
1.案例说明
一个飞机精灵 (方向键可控制移动).
一个鼠标精灵,鼠标精灵跟随鼠标。
检测两个精灵对象有无碰撞,碰撞就退出。
2.代码
import pygame,sys
pygame.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,sys
pygame.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
|