本节我们再将鼠标的事件引入到这个动画中,要做什么呢?就是在动画中,如果按下鼠标左键,小球会停止移动,如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动;如果按下鼠标左键不放,移动鼠标,小球就会跟随鼠标移动,感觉是鼠标在拖动小球一样,鼠标松开,小球继续之前的运动。

分解:

一、如果按下鼠标左键,小球会停止移动

(1)判断鼠标按下事件:event.type == pygame.MOUSEBUTTONDOWN

怎么知道是左键还是右键?event.button = 鼠标按下键编号 (取值为整数,左键为1,右键为3)

(2)让小球停止运动,这个怎么做,其实很简单,我们需要新建一个变量isstop=False,在主循环中,如果isstop==true我们就停止执行小球对象的move()方法即可。

二、如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动

(1)鼠标松开事件;event.type == pygame.MOUSEBUTTONUP

(2)小球移动到鼠标,继续运动。继续运动很简单,只要将我们上一步的变量isstop设置为false。

(3)怎么移动到鼠标呢?这里需要通过一个简单的计算,如图。

用python和pygame游戏编程入门-弹球[鼠标控制]

小球的坐标x、y也就是它距左边和顶部的距离( ballrect.left,ballrect.top),鼠标的当前坐标(event.pos[0],event.pos[1]),因此小球要到鼠标的位置就要在x方向上移动event.pos[0] - ballrect.left;y周方向移动event.pos[1] - ballrect.top。

三、如果按下鼠标左键不放,移动鼠标,小球就会跟随鼠标移动

(1)判断鼠标移动移动事件event.type == pygame.MOUSEMOTION

(2)进一步判断是哪个键被按下,event.buttons[0,0,0] 对应鼠标的三个键,鼠标移动时,这三个件处于按下状态,对应的位置值为1

(3)小球移动到鼠标位置,跟第二部完全相同。

四、控制小球暂停还是运动

在监视显示器是否是活动状态来控制游戏是否暂停还是继续的代码处,增加一个监视isstop是否暂停的条件,找到if pygame.display.get_active(),修改为:if pygame.display.get_active() and not isstop:

完整的程序代码:

import pygame, sys  # 引入pygame sys	
pygame.init()  # 初始化  对pygame内部各功能模块进行初始化创建及变量设置,默认调用
size = width, height = 600, 400
isstop = False
speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)  
pygame.display.set_caption("弹球")  # 设置窗口标题
ball = pygame.image.load("img/ball.png")  # pygame.image.load(filename) 将filename路径下的图像载入游戏,支持13种常用图片格式
ballrect = ball.get_rect()              # surface对象 ball.get_rect() pygame使用内部定义
fps = 300  # Frame per second 每秒帧率参数
fclock = pygame.time.Clock()  # pygame.time.Clock() 创建一个Clock对象,用于操作时间surface对象表示所有载入的图像,其中.get_rect()方法返回一个覆盖图像的矩形(图像的外接矩形)rect对象rect中top, bottom, left, right表示上下左右,width, height表示宽度,高度
bgcolor = pygame.Color("black")
def RGBchannel(a):
	#当a<0时 返回值为0,当a>255时 返回值为255,当0255 else int(a))

while True:  # 执行死循环
    for event in pygame.event.get():  # 从事件队列中取出事件,并从队列中删除该事件
        if event.type == pygame.QUIT:  # pygame.QUIT是Pygame中定义的退出时间常量
            sys.exit()      # sys.exit()用于退出结束游戏并退出
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
               sys.exit()   # sys.exit()用于退出结束游戏并退出
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] - 1
            elif event.key == pygame.K_RIGHT:
                speed[0] = speed[0] + 1
            elif event.key == pygame.K_DOWN:
                speed[1] = speed[1] + 1 
            elif event.key == pygame.K_UP:
                speed[1] = speed[1] - 1
        elif event.type == pygame.MOUSEBUTTONDOWN:      #按下鼠标事件
            if event.button == 1:           # event.button = 鼠标按下键编号 (取值为整数,左键为1,右键为3)
                isstop = True
        elif event.type == pygame.MOUSEBUTTONUP:        #释放鼠标事件
            isstop = False
            if event.button == 1:            #当为释放的鼠标按键为左键时
                 ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
        elif event.type == pygame.MOUSEMOTION:          #移动鼠标事件
            if event.buttons[0] == 1:                   #event.buttons[0,0,0] 对应鼠标的三个键,鼠标移动时,这三个件处于按下状态,对应的位置值为1,繁值0.
                ballrect = ballrect.move(event.pos[0] - ballrect.left,event.pos[1] - ballrect.top )        #鼠标移动时按下左键,小球移动到鼠标现在的位置

    if pygame.display.get_active() and not isstop:     #当显示器上处于活动状态并且没有暂替小球运动返回true,进一步判断后可以暂停游戏,改变响应模式等
        ballrect = ballrect.move(speed[0],speed[1])  # ballrect.move(x,y) 矩形移动一个偏移量(x,y)x,y为整数

    if ballrect.left < 0 or ballrect.right > width:
            speed[0] = -speed[0] 
    if ballrect.top < 0 or ballrect.bottom > height:
            speed[1] = -speed[1]  # 碰壁后速度取反
    print(isstop)	
    bgcolor.r = RGBchannel(ballrect.left*255/width)
    bgcolor.g = RGBchannel(ballrect.left * 255 / height)
    bgcolor.b = RGBchannel(min(speed[0],speed[1]) * 255 / max(speed[0],speed[1],1))
	#显示窗口背景填充为color颜色采用RGB色彩体系 由于图片不断运动,运动后原位置默认填充白色,因此需要不断刷新
    screen.fill(bgcolor)

    screen.blit(ball, ballrect)     # screnen,blit(src,dest)将图像绘制在另一个图像上,即将src绘制到dest位置上,通过rect对象引导对壁球的绘制
    pygame.display.update()      # 对显示窗口进行刷新,默认窗口全部重绘
    fclock.tick(fps)    # clock.tick(framerate) 控制帧速度,即窗口刷新速度。



本站内容未经许可,禁止任何网站及个人进行转载。