Python之pygame

这篇博客介绍了Python的pygame库,通过实例展示了如何进行图形绘制,包括矩形、多边形、圆形、椭圆、弧线和线段的绘制,同时也提到了抗锯齿技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

素材提取
链接:https://pan.baidu.com/s/1Kb9xRrbHTM7yTvLdESI6xg
提取码:dkqi

初识pygame

这是一个可控制的鸭子在画面中移动的例子:

import pygame
import sys
from pygame.locals import *

#初始化pygame
pygame.init()

size = width,height =800,500
speed = [-2 ,1]
bg = (255,255,255)

#创建指定大小的窗口
screen = pygame.display.set_mode(size)
#设置窗口标题
pygame.display.set_caption("这是我pygame的第一个尝试")

#加载图片
cat = pygame.image.load("duck.jpg")
#获取图像的位置矩形
position = cat.get_rect()

l_head = cat
r_head = pygame.transform.flip(cat,True,False)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                cat =l_head
                speed = [-1,0]
            if event.key == pygame.K_RIGHT:
                cat = r_head
                speed = [1,0]
            if event.key == pygame.K_UP:
                speed = [0,-1]
            if event.key == pygame.K_DOWN:
                speed = [0,1]

    #移动图像
    position = position.move(speed)

    if position.left < 0 or position.right > width:
        #翻转图像
        cat = pygame.transform.flip(cat,True,False)
        #反向移动
        speed[0] = -speed[0]

    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    #填充背景
    screen.fill(bg)
    #更新图像
    screen.blit(cat,position)
    #更新界面
    pygame.display.flip()
    #延迟10毫秒
    pygame.time.delay(10)

界面显示用户当前操作,并记录在文件中:

import pygame
import sys

#初始化pygame
pygame.init()

size = width,height =800,500
screen = pygame.display.set_mode(size)
pygame.display.set_caption("黑客帝国")
bg = (0,0,0)

position = 0
font = pygame.font.Font(None,20)
line_height = font.get_linesize()
screen.fill(bg)

f = open("record.txt","w")
while True:
    for event in pygame.event.get():
        f.write(str(event) + '\n')
        if event.type == pygame.QUIT:
            f.close()
            sys.exit()

        screen.blit(font.render(str(event),True,(0,255,0)),(0,position))
        position += line_height

        if position > height:
            position = 0
            screen.fill(bg)

    pygame.display.flip()

这是一个最终版的小乌龟移动例子:

import pygame
import sys
from pygame.locals import *

pygame.init()

pygame.mixer.init()
pygame.mixer.music.load("music.ogg")
pygame.mixer.music.set_volume(0.1)
pygame.mixer.music.play(-1)

# 获得当前显示器支持的分辨率
size = pygame.display.list_modes()
size_i = 3
width, height = size[size_i]

# speed_x 和 speed_y 用于控制速度
speed_x, speed_y = 1, 1

# 控制小乌龟方向
dir_x, dir_y = -1, 0

# 设置透明度
transparent = 255

clock = pygame.time.Clock()

screen = pygame.display.set_mode(size[size_i])
pygame.display.set_caption("FishC Demo")
fullscreen = False

# 设置放大缩小比率
ratio = 1.0

# 为了避免多次缩放导致图片模糊
# 设置 obg 为原始背景图,background 为实际使用背景图
obg = pygame.image.load("background.jpg")
background = obg
# 同上
oturtle = pygame.image.load("turtle.png")
turtle = oturtle
oturtle_rect = oturtle.get_rect()
position = turtle_rect = oturtle_rect

l_head = turtle
r_head = pygame.transform.flip(turtle, True, False)


def blit_alpha(target, source, location, opacity):
    x = location[0]
    y = location[1]
    temp = pygame.Surface((source.get_width(), source.get_height())).convert()
    temp.blit(target, (-x, -y))
    temp.blit(source, (0, 0))
    temp.set_alpha(opacity)
    target.blit(temp, location)


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

        if event.type == MOUSEBUTTONDOWN:

            # 鼠标按键分别表示增加、恢复、减少游戏速度
            if event.button == 1:
                if speed_x < 30 and speed_y < 30:
                    speed_x += 1
                    speed_y += 1
            if event.button == 2:
                speed_x, speed_y = 1, 1
            if event.button == 3:
                if speed_x > 0 and speed_y > 0:
                    speed_x -= 1
                    speed_y -= 1

            # 鼠标滚轮往上、下滚修改小乌龟透明度
            if event.button == 4:
                if transparent < 255:
                    transparent += 5
            if event.button == 5:
                if transparent > 0:
                    transparent -= 5

        if event.type == KEYDOWN:

            # 控制小乌龟移动方向(方向键)
            if event.key == K_LEFT:
                dir_x = -1
                dir_y = 0
                turtle = l_head
            if event.key == K_RIGHT:
                dir_x = 1
                dir_y = 0
                turtle = r_head
            if event.key == K_UP:
                dir_y = -1
                dir_x = 0
            if event.key == K_DOWN:
                dir_y = 1
                dir_x = 0

            # 放大、缩小屏幕(CTRL + BSif event.key == K_b and event.mod & KMOD_CTRL:
                if size[size_i] != size[0]:
                    size_i -= 1
                width, height = size[size_i]
                screen = pygame.display.set_mode(size[size_i])
                background = pygame.transform.scale(obg, size[size_i])
            if event.key == K_s and event.mod & KMOD_CTRL:
                if size[size_i] != size[-1]:
                    size_i += 1
                width, height = size[size_i]
                screen = pygame.display.set_mode(size[size_i])
                background = pygame.transform.scale(obg, size[size_i])

            # 全屏(F11if event.key == K_F11:
                fullscreen = not fullscreen
                if fullscreen:
                    width, height = size[0]
                    screen = pygame.display.set_mode(size[0], FULLSCREEN | HWSURFACE)
                    background = pygame.transform.scale(obg, size[0])
                else:
                    width, height = size[size_i]
                    screen = pygame.display.set_mode(size[size_i])
                    background = pygame.transform.scale(obg, size[size_i])

            # 放大、缩小小乌龟(=-),空格恢复原始尺寸
            if event.key == K_EQUALS or event.key == K_MINUS or event.key == K_SPACE:
                # 最大只能放大一倍,缩小50%
                if event.key == K_EQUALS and ratio < 2:
                    ratio += 0.1
                if event.key == K_MINUS and ratio > 0.5:
                    ratio -= 0.1
                if event.key == K_SPACE:
                    ratio = 1
                turtle = l_head = pygame.transform.smoothscale(oturtle, (
                int(oturtle_rect.width * ratio), int(oturtle_rect.height * ratio)))
                r_head = pygame.transform.flip(turtle, True, False)
                if dir_x == 1:
                    turtle = r_head

                turtle_rect = turtle.get_rect()
                position.width, position.height = turtle_rect.width, turtle_rect.height

    # 移动小乌龟
    position = position.move(dir_x * speed_x, dir_y * speed_y)

    if position.left < 0 or position.right > width:
        # 翻转图像
        turtle = pygame.transform.flip(turtle, True, False)
        # 反方向移动
        dir_x = -dir_x
        # 防止小乌龟卡在边缘
        if position.right > width:
            position[0] = width - turtle_rect.width
        else:
            position[0] = 0

    if position.top < 0 or position.bottom > height:
        dir_y = -dir_y
        if position.bottom > height:
            position[1] = height - turtle_rect.height
        else:
            position[1] = 0

    screen.blit(background, (0, 0))
    blit_alpha(screen, turtle, position, transparent)
    pygame.display.flip()

    clock.tick(30)

pygame的图形绘制

1.矩形绘制:rect(Surface,color,Rect,width=0)

import pygame
import sys
from pygame.locals import *

pygame.init()

WHITE = (255,255,255)
BLACK = (0,0,0)

size = width , height = 640 , 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("master_Z")

clock = pygame.time.Clock()

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

    pygame.draw.rect(screen,BLACK,(50,50,150,50),0)
    pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)
    pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)

    pygame.display.flip()

    clock.tick(10)

2.多边形绘制:polygon(Surface,color,pointlist,width=0)

import pygame
import sys
from pygame.locals import *

pygame.init()

WHITE = (255,255,255)
GREEN = (0,255,0)

points = [(200,100),(250,50),(300,100),(350,50),(400,100),(300,200)]

size = width , height = 640 , 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("master_Z")

clock = pygame.time.Clock()

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

    pygame.draw.polygon(screen,GREEN,points,0)

    pygame.display.flip()

    clock.tick(10)

3.绘制圆形:circle(Surface,color,pos,radius,width=0)

import pygame
import sys
from pygame.locals import *

pygame.init()

WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)

size = width , height = 640 , 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("master_Z")

position = size[0]//2 , size[1]//2
r = 50
moving = False

clock = pygame.time.Clock()

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

        if event.type == MOUSEBUTTONDOWN:
            if event.button == 4:
                r += 5
            elif event.button == 5 and r > 5:
                r -= 5
            elif event.button == 1:
                moving = True

        if event.type == MOUSEBUTTONUP:
            moving = False

        if moving:
            position = pygame.mouse.get_pos()

    screen.fill(WHITE)
    pygame.draw.circle(screen, RED, position, r, 1)
    pygame.draw.circle(screen, GREEN, position, r*2, 1)
    pygame.draw.circle(screen, BLUE, position, r*3, 1)

    pygame.display.flip()

4.绘制椭圆形:ellipse(Surface,color,Rect, width=0)

import pygame
import sys
from pygame.locals import *

pygame.init()

BLACK = (0,0,0)
WHITE = (255,255,255)

size = width , height = 640 , 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("master_Z")

clock = pygame.time.Clock()

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

    screen.fill(WHITE)
    pygame.draw.ellipse(screen, BLACK, (100, 100, 400, 100), 1)
    pygame.draw.ellipse(screen, BLACK, (250, 100, 100, 100), 1)

    pygame.display.flip()

5.绘制弧线:arc(Surface,color,Rect,start_angle,stop_angle,width=1)

import pygame
import sys
from math import *
from pygame.locals import *

pygame.init()

BLACK = (0,0,0)
WHITE = (255,255,255)

size = width , height = 640 , 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("master_Z")

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

    screen.fill(WHITE)
    pygame.draw.arc(screen, BLACK, (100, 100, 400, 100), 0, pi, 1)
    pygame.draw.arc(screen, BLACK, (250, 100, 100, 100), pi, 2*pi, 1)

    pygame.display.flip()

6.绘制线段:line(Surface,color,start_pos,end_pos,width=1)
lines(Surface,color,closed,pointlist,width=1)
抗锯齿
aaline(Surface,color,startpos,endpos,blend=1)
aalines(Surface,color,closed,pointlist,blend=1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唱戏先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值