• Python游戏开发入门


    Pygame简介与安装

    1.Pygame安装

    pip install pygame
    2.检测pygame是否安装成功

    python -m pygame.examples.aliens
     

    Pygame最小开发框架及最小游戏

    import pygame,sys
    '''
    遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
    '''
    pygame.init()
    screen = pygame.display.set_mode((600,400))
    pygame.display.set_caption("Pygame壁球")

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

    pygame.display.update()


     

    壁球小游戏(展示型)与图像的基本使用

    screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    pygame.image.load(filename):将filename路径下的图像载入游戏,支持JPG,PNG,GIF(非动画)等13种常用图片格式

    Surface对象:

    ball.get_rect()

    Pygame使用内部的定义的Surface对象表示所有载入的图像,其中get_rect()方法返回一个覆盖图像的矩形Rect对象.

    Rect对象:

    Rect对象有一些重要的属性,例如:top,bottom,left,right表示上下左右

    width,height表示宽度和高度

    ballrect.move(x,y)

    矩形移动一个偏移量(x,y),即在横轴方向移动x像素,纵轴方向移动y像素,(x,y为整数)

    screen.fill(color)

    显示窗口背景填充为color颜色,采用RGB色彩体系.由于壁球不断运动,运动后原有位置将默认填充白色,因此需要不断刷新背景颜色.

    screen.blit(src,dest)

    将一个图像绘制在另一个图像上,即将src绘制到dest位置上.通过Rect对象引导对壁球的绘制.

    壁球小游戏(节奏型)与屏幕的帧率设置

    需求:壁球可以按照一定的速度运动

    import pygame,sys
    '''
    遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
    '''
    pygame.init()
    size = width,height=1200,800
    speed = [1,1]
    BLACK =0,0,0

    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    fps = 600
    fclock = pygame.time.Clock()

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    ballrect = ballrect.move(speed[0],speed[1])
    if ballrect.left < 0 or ballrect.right >
    speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(BLACK)
    screen.blit(ball,ballrect)
    pygame.display.update()
    fclock.tick(fps)
    fps = 600 #Frames per Secends 每秒帧率

    fclock = pygame.time.Clock()

    pygame.time.Clock()

    创建一个Clock对象,用于操作时间

    clock.tick(framerate)

    控制帧速度,即窗口刷新速度,例如:clock.tick(100)表示每秒钟100次帧刷新,视频中每次展示的静态图像称为帧.

    壁球小游戏(操控型)与键盘的基本使用

    键盘使用:如何获取键盘的操作事件

    熟读调节:根据对应按键调节壁球运动速度

    import pygame,sys

    pygame.init()
    size = width,height=600,400
    speed = [1,1]
    BLACK =0,0,0

    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    fps = 300
    fclock = pygame.time.Clock()

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
    elif event.key == pygame.K_RIGHT:
    speed[0]=speed[0]+1 if speed[0] > 0 else speed[0] - 1
    elif event.key == pygame.K_UP:
    speed[1] = speed[1] + 1 if speed[1]>0 else speed[1] - 1
    if event.key == pygame.K_DOWN:
    speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
    ballrect = ballrect.move(speed[0],speed[1])
    if ballrect.left < 0 or ballrect.right >
    speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(BLACK)
    screen.blit(ball,ballrect)
    pygame.display.update()
    fclock.tick(fps)
    Pygame屏幕绘制机制

    游戏全屏

    游戏屏幕大小可调节

    游戏屏幕无边框

    更改游戏标题栏内容

    屏幕尺寸和模式

    pygame.display.set_mode() 设置相关屏幕模式

    pygame.display.Info() 生成屏幕相关信息

    窗口标题和图标

    pygame.display.set_caption() 生成标题信息

    pygame.display.set_icon() 设置图标信息

    pygame.display.get_caption() 获得图标

    图标感知与刷新

    pygame.display.get_active()

    pygame.display.flip()

    pygame.display.update()

    Pygame屏幕尺寸和模式设置

    pygame.display.set_mode(r=(0,0),flags=0) 设置相关屏幕模式

    r是游戏屏幕的分辨率,采用(width,height)方式输入

    flags用来控制分辨率,可用|组合使用,常用显示标签如下:

    pygame.RESIZABLE 窗口大小可调

    注意:大小可调时要有尺寸变化的响应

    对扩张显示页面的刷新

    对扩张/缩小显示界面的游戏响应

    pygame.NOFRAME 窗口没有边界显示

    pygame.FULLSCREEN 窗口全屏显示

    注意:每种显示方式要配合相应的处理机制

    pygame.display.Info() 生成屏幕相关信息

    产生一个显示信息对象VideoInfo,表达当前屏幕的参数信息,在.set_mode()之前调用,则显示当前系统显示参数信息

    参数很多,其中有两个十分重要,如下:

    current_w: 当前显示模式或窗口的像素宽度

    current_h: 当前显示模式或窗口的像素高度

    import pygame,sys

    pygame.init()
    gInfo = pygame.display.Info()
    size = width,height=gInfo.current_w,gInfo.current_h
    speed = [1,1]
    BLACK =50,50,20


    screen = pygame.display.set_mode(size,pygame.FULLSCREEN)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    fps = 600
    fclock = pygame.time.Clock()

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
    elif event.key == pygame.K_RIGHT:
    speed[0]=speed[0]+1 if speed[0] > 0 else speed[0] - 1
    elif event.key == pygame.K_UP:
    speed[1] = speed[1] + 1 if speed[1]>0 else speed[1] - 1
    elif event.key == pygame.K_DOWN:
    speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
    elif event.key == pygame.K_ESCAPE:
    sys.exit()
    ballrect = ballrect.move(speed[0],speed[1])
    if ballrect.left < 0 or ballrect.right >
    speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]

    screen.fill(BLACK)
    screen.blit(ball,ballrect)
    pygame.display.update()
    fclock.tick(fps)
    Pygame.VIDEORESIZE:这是一种窗口大小更改的事件,事件发生后,返回event.size元组,包含新窗口的宽度和高度

    .size[0] 宽度,也可以使用event.w

    .size[1] 高度,也可以使用event.h

    返回参数仅在事件发生时有用

    elif event.type == pygame.VIDEORESIZE:
    size = width,height = event.w,event.h
    screen = pygame.display.set_mode(size,pygame.RESIZABLE)
     

    Pygame窗口标题和图标设置

    pygame.display.set_caption(title,icontitle=None)

    title设置窗口的标题内容

    icontitle设置图标化后的小标题,小标题可选,部分系统没有

    pygame.display.get_caption()

    返回当前设置窗口的标题及小标题内容

    返回结构为(title,icontitle)

    该函数与游戏交互逻辑配合,可以根据游戏情节修改标题内容

    pygame.display.set_icon()

    设置窗口的图标效果

    图标是一个Surface对象

    icon = pygame.image.load("PYG03-flower.png")
    pygame.display.set_icon(icon)
     

    Pygame窗口感知和刷新运用

    pygame.display.get_active()

    当窗口在系统中显示(屏幕绘制/非图标化)时返回True,否则返回False;

    该函数可以用来判断是否游戏窗口被最小化;

    进一步,判断后可以暂停游戏,或改变游戏响应模式

    pygame.display.flip() 整个屏幕重新绘制

    pygame.display.update() 仅重新绘制发生改变的部分,

    Pygame事件处理机制

    响应用户键盘,鼠标等外设操作

    响应屏幕的尺寸和模式变化

    响应游戏情节的特定触发条件

    产生一些触发事件......

    Pygame事件队列

    缓存并派发所有事件

    用户对事件逐一处理

    原则上先到先处理

    pygame.event.EventType

    本质上是一种封装后的数据类型(对象),是Pygame的一个类,表示事件类型

    事件类型只有属性,没有方法.

    用户可以自定义新的事件类型

    Pygame提供了6种类型的事件及相应的属性

    系统事件

      事件类型 属性
    系统事件 QUIT none
      ACTIVEEVENT gain,state
    键盘事件 KEYDOWN unicode,key,mod
      KEYUP key,mod
    鼠标事件 MOUSEMOTION pos,rel,buttons
      MOUSEBUTTONUP pos,button
      MOUSEBUTTONDOWN pos,button
    游戏杆 JOYAXISMOTION joy,axis,value
      JOYBALLMOTION joy,ball,rel
      JOYHATMOTION joy,hat,value
      JOYBUTTONUP joy,button
      JOYBUTTONDOWN joy,button
    窗口 VIDEORESIZE size,w,h
      VIDEOEXPOSE none
    用户定义 USEREVENT code
    实例:键盘落下事件及属性

    pygame.event.KEYDOWN

    event.unicode

    event.key

    event.mod

    处理事件

    pygame.event.get()

    pygame.event.poll()

    pygame.event.clear()

    操作事件队列

    pygame.event.set_blocked()

    pygame.event.get_blocked()

    pygame.event.set_allowed()

    生成事件

    pygame.event.post()

    pygame.event.Event()

    键盘事件及类型的使用

    键盘按下事件 pygame.event.KEYDOWN

    event.unicode 按键的Unicode码

    注意:Unicode码与平台相关,不推荐使用

    event.key 按键的常量名称

    event.mod 按键修饰符的组合值

    键盘释放事件 pygame.event.KEYUP

    event.key

    event.mod 修饰符的按位或运算

    event.mod = KMOD_ALT | KMOD_SHIFT

    import pygame,sys

    pygame.init()
    screen = pygame.display.set_mode((600,400))
    pygame.display.set_caption("Pygame事件处理")

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    if event.type == pygame.KEYDOWN:
    if event.unicode == "":
    print("[KEYDOWN]:","#",event.key,event.mod)
    else:
    print("[KEYDOWN]:", event.unicode, event.key, event.mod)
    pygame.display.update()
     

    鼠标事件及类型的使用

    pygame.event.MOUSEMOTION 鼠标移动事件

    event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

    event.rel 鼠标相对运动距离(X,Y),相对于上次事件

    event.buttons 鼠标按钮状态(a,b,c),相对于鼠标的三个键,鼠标移动时,这三个键处于按下状态,对应的位置值为1,反之则为0.

    pygame.event.MOUSEBUTTONUP 鼠标键释放事件

    event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

    event.button 鼠标按下键编号n,取值1/2/3,分别对应三个键

    pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件

    event.pos 鼠标当前坐标值(x,y),相对于窗口左上角

    event.button 鼠标按下键编号n,取值为整数,左键为1,中键为2,右键为3,设备相关

    壁球小游戏(鼠标型)

    import pygame,sys

    pygame.init()
    size = width,height=1200,800
    speed = [1,1]
    BLACK =50,50,20

    screen = pygame.display.set_mode(size,pygame.RESIZABLE)
    icon = pygame.image.load("PYG03-flower.png")
    pygame.display.set_icon(icon)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    fps = 600
    fclock = pygame.time.Clock()
    still = False

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
    elif event.key == pygame.K_RIGHT:
    speed[0]=speed[0]+1 if speed[0] > 0 else speed[0] - 1
    elif event.key == pygame.K_UP:
    speed[1] = speed[1] + 1 if speed[1]>0 else speed[1] - 1
    if event.key == pygame.K_DOWN:
    speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
    elif event.type == pygame.VIDEORESIZE:
    size = width,height = event.w,event.h
    screen = pygame.display.set_mode(size,pygame.RESIZABLE)
    elif event.type == pygame.MOUSEBUTTONDOWN:
    if event.button == 1:
    still = True
    elif event.type == pygame.MOUSEBUTTONUP:
    still = 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:
    ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
    if pygame.display.get_active() and not still:
    ballrect = ballrect.move(speed[0],speed[1])
    if ballrect.left < 0 or ballrect.right >
    speed[0] = -speed[0]
    if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
    speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]
    if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
    speed[1] = -speed[1]
    screen.fill(BLACK)
    screen.blit(ball,ballrect)
    pygame.display.update()
    fclock.tick(fps)
     

    Pygame事件处理函数

    处理事件

    pygame.event.get()

    从事件队列中获得事件列表,即获得所有被队列的事件

    for event in pygame.event.get():
    ifevent.type == pygame.QUIT:
    sys.exit()
    pygame.event.poll()

    从事件队列中获得一个事件,事件获取后将从事件队列中删除,如果事件队列为空,则返回 event.NOEVENT

    while True:
    event = pygame.event.poll()
    pygame.event.clear()

    从事件队列中删除事件,默认删除所有事件

    该函数与pygame.event.get()类似,区别仅是不对事件事件进行处理

    可以增加参数,删除某类或某些事件:

    pygame.event.clear(type)

    pygame.event.clear(typelist)

    事件队列同时仅能存储128个事件,当事件队列满时,更多事件将被丢弃

    操作事件队列

    设置事件队列能够缓存事件的类型

    pygame.event.set_blocked(type or typelist)

    控制哪些事件不允许被保存到事件队列中

    pygame.event.get_blocked(type)

    测试某个事件类型是否被事件队列所禁止,如果事件类型被禁止,则返回True,否则返回False

    pygame.event.set_allowed(type or typelist)

    控制哪些事件允许被保存到事件队列中

    生成事件

    pygame.event.post(Event)

    产生一个事件,并将其放入事件队列

    一般用于放置用户自定义事件(pygame.USEREVENT)

    也可用于放置系统定义事件(如鼠标或键盘等),给定参数

    pygame.event.Event(type,dict)

    创建一个给定类型的事件

    其中,事件的属性和值采用字典类型复制,属性名采用字符串形式,如果创建已有事件,属性需要一致

    Pygame色彩机制

    色彩表达 Pygame.Color

    Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选

    Color类可以用色彩名字,RGBA值,HTML色彩格式等方式定义.

    Color(name) 例如:Color("grey")

    Color(r,g,b,a) 例如:Color(190,190,190,255)

    Color(rgbvalue) 例如:Color("#BEBEBEFF")

    pygame.Color.r 获得Color类的红色值r

    pygame.Color.g 获得Color类的绿色值g

    pygame.Color.b 获得Color类的蓝色值b

    pygame.Color.a 获得Color类的alpha值a

    pygame.Color.normalize 将RGBA各通道值归一到0~1之间

    需求:根据壁球运动改变背景颜色

    import pygame,sys

    pygame.init()
    size = width,height=1200,800
    speed = [1,1]
    BLACK =50,50,20

    screen = pygame.display.set_mode(size,pygame.RESIZABLE)
    icon = pygame.image.load("PYG03-flower.png")
    pygame.display.set_icon(icon)
    pygame.display.set_caption("Pygame壁球")
    ball = pygame.image.load("PYG02-ball.gif")
    ballrect = ball.get_rect()
    fps = 600
    fclock = pygame.time.Clock()
    still = False
    bgcolor = pygame.Color("black")

    def RGBChannel(a):
    return 0 if a<0 else (255 if a>255 else int(a))
    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
    speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
    elif event.key == pygame.K_RIGHT:
    speed[0]=speed[0]+1 if speed[0] > 0 else speed[0] - 1
    elif event.key == pygame.K_UP:
    speed[1] = speed[1] + 1 if speed[1]>0 else speed[1] - 1
    if event.key == pygame.K_DOWN:
    speed[1] = speed[1] if speed[0] == 0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
    elif event.type == pygame.VIDEORESIZE:
    size = width,height = event.w,event.h
    screen = pygame.display.set_mode(size,pygame.RESIZABLE)
    elif event.type == pygame.MOUSEBUTTONDOWN:
    if event.button == 1:
    still = True
    elif event.type == pygame.MOUSEBUTTONUP:
    still = 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:
    ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
    if pygame.display.get_active() and not still:
    ballrect = ballrect.move(speed[0],speed[1])
    if ballrect.left < 0 or ballrect.right >
    speed[0] = -speed[0]
    if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
    speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
    speed[1] = -speed[1]
    if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
    speed[1] = -speed[1]
    bgcolor.r = RGBChannel(ballrect.left*255/width)
    bgcolor.g = RGBChannel(ballrect.top*255/height)
    bgcolor.b = RGBChannel(min(speed[0],speed[1])*255/max(speed[0],speed[1],1))
    screen.fill(bgcolor)
    screen.blit(ball,ballrect)
    pygame.display.update()
    fclock.tick(fps)
     

    Pygame图形绘制机制

    pygame.draw

    图形绘制后,返回一个矩形Rect类表示该形状

    pygame.Rect

    表达一个矩形区域的类,用于存储坐标和长度信息,矩形的左上角坐标以及长度宽度

    Pygame利用Rect类来操作图形/图像元素

    Rect类提供了如下属性,返回一个数值或一个代表坐标的元组

    x,y,w,h,size,width,height

    top,left,bottom,right

    topleft,bottomleft,topright,bottomright

    midtop,midleft,midbottom,midright

    center,centerx,centery

    Rect类提供了如下的方法,用来操作Rect类

    .copy(),.move(),.inflate(),.clamp(),.clip(),

    .union(),.unionall(),.fit(),

    .normalize(),.contains(),.collidepoint()

    .colliderect(),.collidelist(),.collidelistall(),

    .collidedict(),.collidedictall()

    pygame.draw

    .rect() 矩形, .line() 直线

    .polygon() 多边形, .lines() 连续多线

    .circle() 圆形, .aaline() 无锯齿线

    .ellipse() 椭圆形, .aalines() 连续无锯齿线

    .arc() 椭圆弧形

    pygame.draw.rect(Surface,color,Rect,width=0)
    #Surface 矩形的绘制屏幕
    #Color 矩形的绘制颜色
    #Rect 矩形的绘制区域
    #width=0 绘制边缘的宽度,默认为0,即填充图形
    pygame.draw.polygon(Surface,color,pointlist,width=0)
    #Surface 多边形的绘制屏幕
    #Color 多边形的绘制颜色
    #pointlist 多边形顶点坐标列表
    #width=0 绘制边缘的宽度,默认为0,即填充图形
    pygame.draw.circle(Surface,color,pos,radius,width=0)
    #Surface 圆形的绘制屏幕
    #Color 圆形的绘制颜色
    #pos 圆形圆心坐标
    #radius 圆形半径
    #width=0 绘制边缘的宽度,默认为0,即填充图形
    pygame.draw.ellipse(Surface,color,Rect,width=0)
    #Surface 椭圆形的绘制屏幕
    #Color 椭圆形的绘制颜色
    #Rect 椭圆形的绘制区域(椭圆形外切矩形)
    #width=0 绘制边缘的宽度,默认为0,即填充图形
    pygame.draw.arc(Surface,color,Rect,start_angle,stop_angle,width=0)
    #Surface 椭圆弧线的绘制屏幕
    #Color 椭圆弧线的绘制颜色
    #Rect 椭圆弧线的绘制区域
    #start_angle椭圆弧线绘制的起始角度(横向右侧为0度)
    #stop_angle 椭圆弧线绘制的结束角度
    #width=0 绘制边缘的宽度,默认为0,即填充图形
    pygame.draw.line(Surface,color,start_pos,stop_pos,width=1)
    #Surface 直线的绘制屏幕
    #Color 直线的绘制颜色
    #start_pos 直线绘制的起始点
    #stop_pos 直线绘制的结束点
    #width=0 绘制边缘的宽度,默认为1,
    pygame.draw.lines(Surface,color,closed,pointlist,width=1)
    #Surface 连续多线的绘制屏幕
    #Color 连续多线的绘制颜色
    #closed 如果为True,起止节点间自动增加闭合直线
    #pointlist 连续多线的顶点坐标列表
    #width=0 绘制边缘的宽度,默认为1
    pygame.draw.aaline(Surface,color,start_pos,stop_pos,blend=1)
    #Surface 无锯齿线的绘制屏幕
    #Color 无锯齿线的绘制颜色
    #start_pos 无锯齿线绘制的起始点
    #stop_pos 无锯齿线绘制的结束点
    #blend=1 不为0时,与线条所在背景颜色进行混合
    pygame.draw.aalines(Surface,color,closed,pointlist,blend=1)
    #Surface 连续无锯齿线的绘制屏幕
    #Color 连续无锯齿线的绘制颜色
    #closed 如果为True,起止节点间自动增加闭合直线
    #pointlist 连续无锯齿线的顶点坐标列表
    #blend=1 不为0时,与线条所在背景颜色进行混合
    import pygame,sys
    from math import pi

    pygame.init()
    screen = pygame.display.set_mode((600,400))
    pygame.display.set_caption("Pygame图形绘制")
    GOLD = 255,251,0
    RED = pygame.Color("red")
    WHITE = 255,255,255
    GREEN = pygame.Color("green")

    #r1rect = pygame.draw.rect(screen,GOLD,(100,100,200,100),5)
    #r2rect = pygame.draw.rect(screen,RED,(210,210,200,100),0)

    e1rect = pygame.draw.ellipse(screen,GREEN,(50,50,500,300),3)
    c1rect = pygame.draw.circle(screen,GOLD,(200,180),50,5)
    c2rect = pygame.draw.circle(screen,RED,(400,180),30)

    plist = [(295,170),(285,250),(260,280),(340,280),(315,250),(305,170)]
    l1rect = pygame.draw.lines(screen,GREEN,True,plist,2)
    a1rect = pygame.draw.arc(screen,GOLD,(200,220,200,100),1.4*pi,1.9*pi,3)

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

    Pygame文字绘制机制

    pygame.freetype

    向屏幕上绘制特定字体的文字

    文字不能直接print(),而是用像素根据字体点阵图绘制

    pygame.freetype额外import引用

    import pygame,sys
    import pygame.freetype
    pygame.freetype.font

    根据字体和字号生成一个Font对象

    Font.render_to()

    Font.render()

    使用Font对象的render*方法绘制具体文字

    Font类型

    pygame.freetype.Font(file,size=0)
    #file 字体类型名称或路径
    #size 字体的大小
    Font类的绘制方法

    Font.render_to(surf,dest,text,fgcolor=None,bgcolor=None,rotation=0,size=0)
    #返回一个rect类型
    #surf 绘制字体的平面,Surface对象
    #dest 在平面中具体的位置
    #text 绘制的文字内容
    #fgcolor文字颜色
    #bgcolor背景颜色
    #rotation逆时针的旋转角度,取值0-359,部分字体可旋转
    #size 字体大小,赋值该参数嘉庆覆盖Font中的设定值
    import pygame,sys
    import pygame.freetype

    pygame.init()
    screen = pygame.display.set_mode((600,400))
    pygame.display.set_caption("Pygame文字绘制")
    GOLD = 255,251,0

    f1 = pygame.freetype.Font("C:WindowsFontsygyxsziti2.0.ttf",36)
    f1.render_to(screen,(200,160),"Hello,World!",fgcolor=GOLD,size=50)

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

    pygame.display.update()
     

    Font.render(text,fgcolor=None,bgcolor=None,rotation=0,size=0)
    #(Surface,Rect)
    #text 绘制的文字内容
    #fgcolor文字颜色
    #bgcolor背景颜色
    #rotation逆时针的旋转角度,取值0-359,部分字体可旋转
    #size 字体大小,赋值该参数嘉庆覆盖Font中的设定值
    import pygame,sys
    import pygame.freetype

    pygame.init()
    screen = pygame.display.set_mode((600,400))
    pygame.display.set_caption("Pygame文字绘制")
    GOLD = 255,251,0

    f1 = pygame.freetype.Font("C:WindowsFontsygyxsziti2.0.ttf",36)
    f1surf,f1rect=f1.render("世界和平!",fgcolor=GOLD,size=50)

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

    screen.blit(f1surf,(200,160))

    pygame.display.update()
     

    Pygame绘图机制原理精髓

    pygame.Surface

    绘图层,或绘图平面,或图层

    用于表示图形,文字或图像的绘制效果
    与当前屏幕主图层可以并列存在
    如果不绘制在主图层上,则不会被显示
    每一个游戏只有一个主图层
    pygame.Rect

    矩形区域

    对应于当前主图层的某个具体区域
    相当于某个矩形区域的指针或标识信息
    可以指定图层绘制在某个矩形区域中
    主图层

    由pygame.display.set_mode()生成的Surface对象
    size = width,height=1200,800
    screen = pygame.display.set_mode(size)
    在主图层上绘制其他图层是用blit()方法
    screen.blit(ball,ballrect)
    ball ---> pygame.Surface
    ballrect---> pygame.Rect
     

    壁球小游戏(文字型)

    import pygame,sys
    import pygame.freetype

    pygame.init()
    size = width,height=1200,800
    speed = [1,1]
    GOLD = 250,251,0
    BLACK =50,50,20
    pos = [230,160]
    fps =300
    fclock = pygame.time.Clock()

    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Pygame文字绘制")
    #ball = pygame.image.load("PYG02-ball.gif")
    #ballrect = ball.get_rect()
    f1 = pygame.freetype.Font("C:WindowsFontshakuyoxingshu7000.TTF",36)
    f1rect = f1.render_to(screen,pos,"壁球",fgcolor=GOLD,size=50)


    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    if pos[0] < 0 or pos[0] + f1rect.width >
    speed[0] = -speed[0]
    if pos[1] < 0 or pos[1] + f1rect.height > height:
    speed[1] = -speed[1]
    pos[0] = pos[0] + speed[0]
    pos[1] = pos[1] + speed[1]


    screen.fill(BLACK)
    #screen.blit(ball,ballrect)
    f1rect = f1.render_to(screen,pos,"壁球",fgcolor=GOLD,size=50)
    pygame.display.update()
    fclock.tick(fps)
     

    import pygame,sys
    import pygame.freetype

    pygame.init()
    size = width,height=1200,800
    speed = [1,1]
    GOLD = 250,251,0
    BLACK =50,50,20
    pos = [230,160]
    fps =300
    fclock = pygame.time.Clock()

    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("Pygame文字绘制")
    #ball = pygame.image.load("PYG02-ball.gif")
    #ballrect = ball.get_rect()
    f1 = pygame.freetype.Font("C:WindowsFontshakuyoxingshu7000.TTF",36)
    f1surf,f1rect = f1.render("壁球",fgcolor=GOLD,size=50)


    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    if pos[0] < 0 or pos[0] + f1rect.width >
    speed[0] = -speed[0]
    if pos[1] < 0 or pos[1] + f1rect.height > height:
    speed[1] = -speed[1]
    pos[0] = pos[0] + speed[0]
    pos[1] = pos[1] + speed[1]


    screen.fill(BLACK)
    #screen.blit(ball,ballrect)
    f1surf, f1rect = f1.render("壁球", fgcolor=GOLD, size=50)
    screen.blit(f1surf,(pos[0],pos[1]))
    pygame.display.update()
    fclock.tick(fps)

  • 相关阅读:
    向对象数组中添加新的属性 Jim
    vuecli3.0 postcsspxtoviewport将px转化为vwvh适配/Web 端屏幕适配方案 Jim
    js深拷贝与浅拷贝 Jim
    行业死亡案例汇总(客观记录不做评价)
    wins和linux 系统不同编码格式导致的.py执行问题: bad interpreter: No such or file directory
    Pyhon之类学习1
    How to handle error In $.get()
    sql 修改列名及表名
    程序设计类网站
    数据类型
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10965797.html
Copyright © 2020-2023  润新知