pygame应用

一、pygame事件

import pygame      #导入pygame模块

if __name__ == '__main__':
    #初始化
    pygame.init()
   #创建长为600,高为400的窗口
    screen=pygame.display.set_mode((600,400))
    #给窗口填充颜色为白色
    screen.fill((255,255,255))
    #设置窗口标题
    pygame.display.set_caption('游戏事件')
    #显示以上所有内容
    pygame.display.flip()

    """
    QUIT:关闭按钮被点击事件
    MOUSEBUTTONDOWN: 鼠标按下事件
    MOUSEBUTTONUP: 鼠标按下弹起
    MOUSEMOTION:鼠标移动
    鼠标相关事件关心事件产生的位置
    
    KEYDOWN: 键盘按下
    KEYUP: 键盘弹起
    """
    while True:
        #每次循环检测有没有事件发生()
                for event in pygame.event.get():
            # 不同类型的事件对应的type值不一样
            if event.type == pygame.QUIT:
                exit()

            # 鼠标相关事件
            #鼠标按下
            if event.type == pygame.MOUSEBUTTONDOWN:
                print('打印鼠标按下', event.pos)
            # 鼠标弹起
            if event.type == pygame.MOUSEBUTTONUP:
                print('鼠标弹起', event.pos)
            # 鼠标移动事件
            if event.type == pygame.MOUSEMOTION:
                print('鼠标移动', event.pos)

            #键盘相关事件
            #key属性,被按得按键对应的编码
            if event.type==pygame.KEYDOWN:
                print('键盘被按下',chr(event.key))
            if event.type==pygame.KEYUP:
                print('键盘弹起',chr(event.key))
1-1.gif

二、鼠标键盘应用

import pygame
from random import randint

def rand_color():
    """
    产生随机颜色
    """
    return randint(0, 255), randint(0, 255), randint(0, 255)

def draw_ball(screen, pos):
    pygame.draw.circle(screen, rand_color(), pos, randint(10, 20))
    # 只要屏幕上的内容有更新,都需要调用下面这两个方法中的一个
    # pygame.display.flip()
    pygame.display.update()


# 写一个函数,判断指定的点是否在指定的矩形范围中
def is_in_rect(point, rect):
    x, y = point
    rx, ry, rw, rh = rect
    if (rx <= x <= rx+rw) and (ry <= y <= ry+rh):
        return True
    return False


# 写一个函数,画一个按钮
def draw_button(screen, bth_color, title_color):
    # 画个按钮
    """矩形框"""
    pygame.draw.rect(screen, bth_color, (100, 100, 100, 60))
    """文字"""
    font = pygame.font.SysFont('Times', 30)
    title = font.render('clicke', True, title_color)
    screen.blit(title, (120, 120))

# 按钮坐标

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((600, 400))
    screen.fill((255,255,255))
    pygame.display.set_caption('鼠标事件')

    # 画个按钮
    draw_button(screen, (0, 255, 0), (255, 0, 0))
    # """矩形框"""
    # pygame.draw.rect(screen,(0, 255, 0),(100, 100, 100, 60))
    # """文字"""
    # font = pygame.font.SysFont('Times', 30)
    # title = font.render('clicke',True,(255, 0, 0))
    # screen.blit(title, (120, 120))
    pygame.display.flip()

    while True:
        for event in pygame.event.get():
            # 退出
            if event.type == pygame.QUIT:
                exit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                # 在指定的坐标处画一个球
                # draw_ball(screen, event.pos)
                if is_in_rect(event.pos, (100, 100, 100, 60)):
                    draw_button(screen, (0, 100, 0), (100, 0, 0))
                    pygame.display.update()

            if event.type == pygame.MOUSEBUTTONUP:
                if is_in_rect(event.pos, (100, 100, 100, 60)):
                    draw_button(screen, (0, 255, 0),(255, 0, 0))
                    pygame.display.update()

            if event.type == pygame.MOUSEMOTION:
                screen.fill((255, 255, 255))
                draw_button(screen, (0, 255, 0), (255, 0, 0))
                draw_ball(screen, event.pos)

效果如下:


2-1.gif

三、鼠标事件应用2

要求:先在屏幕上显示一张图片,鼠标按下移动的时候,拽着图片跟着一起动,鼠标弹起就不动了

import pygame

#写一个函数,判断一个点是否在某个范围内
# 点(x,y)
# 范围 rect(x,y,w,h)
def is_in_rect(pos,rect):
    x,y=pos
    rx,ry,rw,rh=rect
    if (rx<=x<=rx+rw) and (ry<=y<=ry+rh):
        return True
    return False

if __name__ == '__main__':
    pygame.init()
    screen=pygame.display.set_mode((800,800))
    screen.fill((255,255,255))
    pygame.display.set_caption('图片拖拽')


    #显示一张图片
    image = pygame.image.load('./赵丽颖2.jpg')
    # image_size = image.get.size()
    # print(image_size)
    image_x=100
    image_y=100
    #显示在屏幕上
    screen.blit(image,(image_x,image_y))

    pygame.display.flip()

    #用来储存图片是否可以移动
    is_move=False

    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                exit()

            #鼠标按下,让状态变成可以移动
            if event.type==pygame.MOUSEBUTTONDOWN:
                w,h=image.get_size()
                if is_in_rect(event.pos,(image_x,image_y,w,h)):
                    is_move=True

            #鼠标弹起,让状态变成不可以移动
            if event.type==pygame.MOUSEBUTTONUP:
                is_move=False

            #鼠标移动对应的事件
            if event.type == pygame.MOUSEMOTION:
                if is_move:
                    screen.fill((255, 255, 255))
                    x, y = event.pos
                    image_w, image_h = image.get_size()
                    # 保证鼠标在图片的中心
                    image_y = y-image_h/2
                    image_x = x-image_w/2
                    screen.blit(image, (image_x, image_y))
                    pygame.display.update()

效果如下:

3.gif

四、动画效果

"""
动画原理:不断刷新界面上的内容(一帧一帧的画)

"""

import pygame
from random import randint

def static_page(screen):
    """
    页面上的静态显示
    :param screen:
    :return:
    """
    #静态文字
    font=pygame.font.SysFont('times',40)
    title=font.render('welcome',True,(0,0,0))
    screen.blit(title,(200,100))

def animation_title(screen):
    """
    字体颜色发生改变
    :param screen:
    :return:
    """

    font = pygame.font.SysFont('times', 40)
    title = font.render('python', True, (randint(0,255),randint(0,255),randint(0,255)))
    screen.blit(title, (200,200))

if __name__ == '__main__':
    pygame.init()
    screen=pygame.display.set_mode((600,400))
    screen.fill((255,255,255))
    pygame.display.set_caption('动画效果')

    static_page(screen)

    pygame.display.flip()



    while True:
        #for里面的代码只有事件发生后才会执行
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                exit()

        #在下面去写每一帧要显示的内容
        #程序执行到这个位置,线程在这阻塞指定的时间(毫秒)1000ms=1s
        pygame.time.delay(300)

        #动画前要将原来的内容全部清空
        screen.fill((255,255,255))
        static_page(screen)
        animation_title(screen)

        #内容展示完,要显示更新到屏幕上
        pygame.display.update()

效果如下:


4-1.gif

五、ballgame


import pygame

def draw_ball(place,color,pos):
    """
    画球
    :param place:
    :return:
    """
    pygame.draw.circle(place,color,pos,20)

#方向对应的值
Up=273
Down=274
Left=276
Right=275

if __name__ == '__main__':
    pygame.init()
    screen=pygame.display.set_mode((1000,600))
    screen.fill((255,255,255))

    pygame.display.flip()

    #保存初始坐标
    ball_x=100
    ball_y=100
    x_speed=1
    y_speed=0

    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                exit()

            #通过上下左右键控制球的方向
            if event.type==pygame.KEYDOWN:
                if event.key==Up:
                    y_speed=-1
                    x_speed=0
                if event.key==Down:
                    y_speed=1
                    x_speed=0
                if event.key==Right:
                    y_speed=0
                    x_speed=1
                if event.key==Left:
                    y_speed=0
                    x_speed=-1


            # if event.type==pygame.KEYDOWN:
            #     print(event.key)

        #刷新屏幕
        screen.fill((255,255,255))

        #每次循环让球的x和y坐标变化
        ball_x+=x_speed
        ball_y+=y_speed

        #边界检测
        if ball_x+20>=600 or ball_x<=20 or ball_y+20>=400 or ball_y<=20:
            print('游戏结束')
            exit()
            # # ball_x=600-20
            # x_speed*=-1
        draw_ball(screen,(255,0,0),(ball_x,ball_y))

        pygame.display.update()

效果如下:


5-1.gif

六、多个球动起来

import pygame
import random

random_color=random.randint(0,255),random.randint(0,255),random.randint(0,255) #声明一个变量同时赋多个值,相当于一个元祖

if __name__ == '__main__':
    pygame.init()
    screen=pygame.display.set_mode((1000,700))
    screen.fill((255,255,255))
    pygame.display.flip()

    #all_balls中保存多个球
    #每个球要保存:半径、圆心坐标、颜色、x速度、y速度
    all_balls=[{'r':random.randint(10,20),
                'pos':(100,100),
                'color':random_color,
                'x_speed':random.randint(-3,3),
                'y_speed':random.randint(-3,3)},
               {'r':random.randint(10,20),
                'pos':(300,300),
                'color':random_color,
                'x_speed':random.randint(-3,3),
                'y_speed':random.randint(-3,3)},
               {'r':random.randint(10,20),
                'pos':(200,200),
                'color':random_color,
                'x_speed':random.randint(-3,3),
                'y_speed':random.randint(-3,3)}
               ]


    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                exit()

            if event.type==pygame.MOUSEBUTTONDOWN:
                random_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
                ball={
                    'r':random.randint(10,25),
                    'pos':event.pos,
                    'color':random_color,
                    'x_speed':random.randint(-3,3),
                    'y_speed':random.randint(-3,3)
                }
                #保存球
                all_balls.append(ball)

        #刷新界面
        screen.fill((255,255,255))

        for ball_dict in all_balls:
            #取出x和y坐标以及他们的速度
            x,y=ball_dict['pos']
            x_speed=ball_dict['x_speed']
            y_speed=ball_dict['y_speed']

            x+=x_speed
            y+=y_speed
            pygame.draw.circle(screen,ball_dict['color'],(x,y),ball_dict['r'])

            #重新跟新球对应的坐标
            ball_dict['pos']=x,y

        pygame.display.update()

效果如下:


6.gif

你可能感兴趣的:(pygame应用)