美文网首页
Day10-pygame相关

Day10-pygame相关

作者: 周zau1 | 来源:发表于2018-07-30 20:40 被阅读44次

1、pygame事件

# 鼠标相关事件
            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('键盘按键弹起', event.key)

2、鼠标事件的应用

# Jay
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('Click Me', True, title_color)
    screen.blit(title, (100, 100))


if __name__ == '__main__':
    a = 0
    pygame.init()
    screen = pygame.display.set_mode((1024, 600))
    screen.fill((255, 255, 255))
    # 设置窗口标题
    pygame.display.set_caption('鼠标事件')

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

    pygame.display.flip()

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

            if event.type == pygame.MOUSEBUTTONDOWN:
                # # pygame.draw.circle(screen, rand_color(), event.pos, randint(10, 20))
                # #
                # # # 只要屏幕上的内容有更新,都需要调用下面这两个方法中的一个
                # # # pygame.display.flip()
                # # pygame.display.update()
                # draw_ball(screen, event.pos)
                if isInRect(event.pos, (100, 100, 100, 60)):
                    a += 1
                    print('已点击%d次' % a)
                    draw_button(screen, (100, 0, 0), (100, 100, 100))
                    pygame.display.update()

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

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

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


# 写一个函数,判断一个点是否在某个范围内
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


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

    # 显示一张图片
    image = pygame.image.load('./jay.jpg')
    image_x = 0
    image_y = 0
    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 isInRect(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()

图片拖动

3、动画效果

# Jay
"""
动画原理:不断的刷新界面上的内容(一帧一帧的画)
"""
import pygame
from random import randint


def static_page(screen):
    """
    页面上的静态内容
    """
    # 静态文字
    font = pygame.font.SysFont('Times', 40)
    title = font.render('Welcome', True, (255, 0, 0))
    screen.blit(title, (500, 280))


def animation_title(screen):
    font = pygame.font.SysFont('Times', 40)
    title = font.render('Python!!', True, (randint(0, 255), randint(0, 255), randint(0, 255)))
    screen.blit(title, (500, 400))


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

    pygame.display.flip()

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

        # 在下面去写变化的内容。。。。
        """程序执行到这个位置,cpu休息一段时间再执行后面的代码(线程在这儿阻塞)
        单位:毫秒 (1000ms == 1s)
        """
        pygame.time.delay(0)

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

        static_page(screen)
        animation_title(screen)

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

闪烁效果

4、控制球的移动

# Jay
import pygame


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

Up = 273
Down = 274
Right = 275
Left = 276


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

    pygame.display.flip()

    # 保存球的初始坐标
    ball_x = 512
    ball_y = 300
    x_speed = 0
    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 = -5
                    x_speed = 0
                elif event.key == Down:
                    y_speed = 5
                    x_speed = 0
                elif event.key == Right:
                    y_speed = 0
                    x_speed = 5
                elif event.key == Left:
                    y_speed = 0
                    x_speed = -5


        # 刷新屏幕
        screen.fill((255, 255, 255))
        ball_x += x_speed
        ball_y += y_speed

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

        pygame.display.update()
方向控制球体移动,边缘反弹

相关文章

网友评论

      本文标题:Day10-pygame相关

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