美文网首页
pygame里操作事件

pygame里操作事件

作者: 蘑菇plus | 来源:发表于2018-07-30 23:34 被阅读0次

    鼠标事件的应用

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @File  : 02-鼠标事件得应用.py
    # @Author: KingJX
    # @Date  : 2018/7/30 10:50
    """"""
    
    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 isInRect(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, btn_color, title_color):
    
        # 画个按钮
        """矩形框"""
        pygame.draw.rect(screen, btn_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.display.flip()
    
        while True:
            for event in pygame.event.get():
    
                if event.type == pygame.QUIT:
                    exit()
    
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if isInRect(event.pos,(100,100,100,60)):
                        draw_button(screen,(0,100,0),(0,0,100))
                        pygame.display.update()
    
                if event.type == pygame.MOUSEBUTTONUP:
                    if isInRect(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)
                    # pygame.display(screen,event.pos)
    

    图片拖拽

    # encoding = utf - 8
    # # Time: 2018 / 7 / 26
    # # 20: 23
    # # Author: 蘑菇plus
    # # Email: 497392071 @ qq.com
    # # File: 显示图形.py
    # # Software: PyCharm
    import pygame
    from random import randint
    #写一个函数,判断一个点是否在某个范围内
    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__':
        pass
    pygame.init()
    screen=pygame.display.set_mode((600,400))
    screen.fill((255,255,255))
    pygame.display.set_caption('图片拖拽')
    #显示图片
    image=pygame.image.load('./gg1.png')
    image_x=100
    image_y=100
    screen.blit(image, (image_x, image_y))
    pygame.display.flip()
    #默认为false
    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,(x-image_w/2,y-image_h/2))
                    pygame.display.update()
    

    画球

    # encoding = utf - 8
    # Time: 2018 / 7 / 26
    # 20: 23
    # Author: 蘑菇plus
    # Email: 497392071 @ qq.com
    # File: 显示图形.py
    # Software: PyCharm
    import pygame
    #方向对应的key值
    up=273
    down=274
    left=276
    right=275
    #画球
    def draw_ball(place,color,pos):
        #画球
        pygame.draw.circle(place,color,pos,10)
    if __name__ == '__main__':
        pygame.init()
        screen=pygame.display.set_mode((600,400))
        screen.fill((255,255,255))
        pygame.display.flip()
        #保存初始坐标
        ball_x=0
        ball_y=10
        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
            elif event.key==down:
                y_speed=1
                x_speed=0
            elif event.key==right:
                x_speed=1
                y_speed=0
            elif event.key==left:
                x_speed=-1
                y_speed=0
        #刷新屏幕
        screen.fill((255,255,255))
        #每次循环让球的x和y坐标变化
        pygame.time.delay(10)
        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:
        draw_ball(screen, (255, 0, 0), (ball_x, ball_y))
        if ball_x + 10 >= 600:
        # print('游戏结束')
        # exit()
            ball_x = 600 - 10
            x_speed *= -1
            # ball_x -= 1
            # draw_ball(screen, (255, 0, 0), (ball_x, ball_y))
        elif ball_x-10<=0:
            ball_x=0+10
            x_speed *= -1
            # draw_ball(screen,(255,0,0),(ball_x,ball_y))
        pygame.display.update()
    

    多个球一起动

    # encoding = utf - 8
    # Time: 2018 / 7 / 26
    # 20: 23
    # Author: 蘑菇plus
    # Email: 497392071 @ qq.com
    # File: 显示图形.py
    # Software: PyCharm
    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((600,400))
        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),
             }
        ]
    
        while True:
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    exit()
                # if event.type==pygame.MOUSEBUTTONDOWN:
                #     #点一下鼠标创建一个球
                #     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()
    

    动画效果

    # encoding = utf - 8
    # Time: 2018 / 7 / 26
    # 20: 23
    # Author: 蘑菇plus
    # Email: 497392071 @ qq.com
    # File: 显示图形.py
    # Software: PyCharm
    """
    动画原理:不断刷新界面上的内容(一帧一帧的画)
    
    """
    
    import pygame
    from random import randint
    def static_page(screen):
        #静态文字
        font=pygame.font.SysFont('Times',40)
        title=font.render('welcome',True,(0,0,0))
        screen.blit(title,(200,200))
        #动态文字
    def animation_title(screen):
        font=pygame.font.SysFont('Times',40)
        title=font.render('python',True,(randint(0,255),89,74))
        screen.blit(title,(120,140))
    if __name__ == '__main__':
    
        pygame.init()
        screen=pygame.display.set_mode((600,400))
        screen.fill((255,255,255))
    
        static_page(screen)
        pygame.display.flip()
    
        while True:
            #for循环里的只有事件发生后才会执行
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
            #在下面去写每一帧要显示的内容
            #程序执行到这个位置,cpu休息一段时间在执行后面的代码(线程在这里阻塞指定的事件)
            pygame.time.delay(60)
            #动画前要将原来的内容全部清空
            screen.fill((255,255,255))
            static_page(screen)
            animation_title(screen)
            #内容展示完成后,要更新到屏幕上
            pygame.display.update()
    

    相关文章

      网友评论

          本文标题:pygame里操作事件

          本文链接:https://www.haomeiwen.com/subject/pngqvftx.html