zoukankan      html  css  js  c++  java
  • Python游戏编程-初步认识pygame

    Python游戏编程-初步认识pygame

    一、总结

    一句话总结:

    Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发。
    Pygame 允许你在 Python 程序中创建功能丰富的游戏和多媒体程序,Pygame 是一个高可移植性的模块可以支持多个操作系统。用它来开发小游戏非常适合

    二、【Python游戏编程01--初步认识pygame】

    转自或参考:【Python游戏编程01--初步认识pygame】 - 尘封~~ - 博客园
    https://www.cnblogs.com/frankruby/p/10597192.html

    一、pygame简介

    Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发。允许你在 Python 程序中创建功能丰富的游戏和多媒体程序,Pygame 是一个高可移植性的模块可以支持多个操作系统。用它来开发小游戏非常适合

    二、pygame的使用

    第一步是把pygame导入到Python程序中,

    import pygame

    然后需要引入pygame中所有常量

    from pygame.locals import *

    在经过初始化以后,我们就可以正常的使用pygame了

    pygame.ini()

    通常来说我们需要创建一个窗口,方便我们与程序就行交互,下面创建一个600 x 500的窗口

    screen=pygame.display.set_mode((600,500))

    1、打印字体

    pygame支持使用pygame.font将文打印到窗口,要打印一个文本的话首先需要创建一个文本对象,即:创建字体,None:默认字体,60:字体大小

    myfont = pygame.font.Font(None,60)

    这个文本是个重量级的进程,比较耗费时间,常用的做法是先在内存中创建文本对象,然后将文本当做一个图像来渲染,即:创建一个可以使用screen.blit()绘制的平面

    white= 255,255,255
    blue = 0,0,200
    textImage = myfont.render("hello Pygame",True,white)

    textImage对象可以使用screen.blit()来绘制,上面的render函数第一个参数是文本,第二个参数是抗锯齿字体,第三个参数是一个颜色值(RGB值)
    要绘制文本,通常的过程是清屏,绘制,刷新,即:进行绘制

    screen.blit()需要两个参数,绘制的对象及其(左上角顶点)坐标

    screen.fill(blue)
    screen.blit(textImage,(100,100))
    pygame.display.update()

    如果此时运行程序的话,会出现一个窗口一闪而过,为了让他长时间显示,需要把他放入一个循环中

    import pygame
    from pygame.locals import *
    import sys
    white = 255,255,255
    blue = 0,0,200
    
    pygame.init()
    screen = pygame.display.set_mode((600,400))
    
    myfont = pygame.font.Font(None,60)
    textImage = myfont.render("Hello World",True,white)
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    
        screen.fill(blue)
        screen.blit(textImage,(100,100))
        pygame.display.update()

    执行结果:

    pygame除了能打印字体,仍然可以绘制各种图像

    2、绘制一个圆形

     使用pygame.draw.cicle()方法,该方法需要传递圆的大小,颜色和参数

      color    (0,0,0)给定颜色
        radius圆半径
        position     (0,0)给定圆心坐标
        width线条宽度

    import pygame,sys
    
    pygame.init()
    screen = pygame.display.set_mode((600,400))
    
    #设置圆形的位置和移动的速度变量
    pos_x = 300
    pos_y = 250
    vel_x = 2
    vel_y = 1
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        screen.fill((0, 0, 200))
    
        #移动圆形
        pos_x += vel_x
        pos_y += vel_y
    
        #让圆形保持在窗口内
        if pos_x > 500 or pos_x < 0:
            vel_x = -vel_x
        if pos_y > 400 or pos_y <0:
            vel_y = -vel_y
    
        color = 255, 255, 0
        position = 300, 250
        radius = 80  # 半径
        width = 0
        pos = pos_x,pos_y
        #print(pos)
        pygame.draw.circle(screen,color,pos,radius,width)
    
        pygame.display.update()

    执行结果

    3、绘制一个矩形

    绘制一个可以移动的矩形,而非简单的显示在屏幕中间

    首先需要设置pos_x,pos_y两个变量来记录矩形的位置信息,然后在创建一堆速度变量(vel_x,vel_y),在while循环中不断变化矩形的位置,当矩形移动到屏幕边缘的时候,将速度变量取返,这样就可以产生碰撞的效果

     position      (pos_x,pos_y,100,100)给定左上角顶点的坐标、长和宽

    from pygame.locals import *
    import pygame
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((600,400))
    title = pygame.display.set_caption("Drawing Rectangles")
    
    #记录矩形的位置信息,记录移动速度的位置信息
    pos_x = 300
    pos_y = 250
    vel_x = 2
    vel_y = 1
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    
        screen.fill((0,0,200))
    
        #移动矩形
        pos_x += vel_x
        pos_y += vel_y
    
        #使矩形保持在窗口内
        if pos_x > 500 or pos_x <0:
            vel_x = -vel_x
        if pos_y >400 or pos_y < 0:
            vel_y = -vel_y
    
        #绘制矩形
        color = 255,255,0
        width = 0
        pos = pos_x,pos_y,100,100
        pygame.draw.rect(screen,color,pos,width)
    
    
        pygame.display.update()

     执行结果:

    4、绘制线条

    使用pygame.draw.line()方法,该方法需要传递起点和终点,还有线条的颜色和宽度

    (0,0)(100,100)负责给定线段的两个端点

    import pygame
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((600,400))
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    
        screen.fill((0,0,255))
    
        color = 255,255,0
        width = 5
        pygame.draw.line(screen,color,(100,100),(500,300),width)
    
        pygame.display.update()

    执行结果:

    5、绘制弧形

    弧形是圆形的一部分,可以使用pygame.draw.arc方法绘制它,由于这个形状相对比较复杂,需要用到的知识比前面的知识要多

    首先,需要一个矩形来表示弧形的边界(需提供矩形左上角的位置,宽度和高度)弧形就绘制在这个矩形当中

    然后需要提供弧形的起始角度和结束角度,平常我们在生活中都是用度为单位衡量一个角度,但在几何三角形中,通常使用的单位是弧度

    将角度转换成弧度的函数是math.redians()它包含在math库中,因此使用之前一定要引入math库

    #x,y表示弧形所在的圆的圆心坐标,radius表示半径

    start_angle起始角度 指向正右侧的半径开始逆时针旋转就是0到360
    end_angle结束角度

    import math
    import pygame
    from pygame.locals import *
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((600,500))
    title = pygame.display.set_caption("Drawing Arcs")
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    
        screen.fill((0,0,200))
    
        #绘制弧形
        color = 255,0,255
        position = 200,150,200,200
        start_angle = math.radians(0)
        stop_angle = math.radians(180)
        print(start_angle,stop_angle)
        width =8
        pygame.draw.arc(screen,color,position,start_angle,stop_angle,width)
    
        pygame.display.update()

    执行结果:

     二、实践:绘制大饼游戏(当按下1,2,3,4相应的按钮时,就会在程序中绘制相应的饼块,当整个饼块绘制完成以后,颜色变成亮绿色)

    import pygame
    from pygame.locals import *
    import math
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((600,600))
    title = pygame.display.set_caption("The Pie Game")
    
    myfont = pygame.font.Font(None,60)
    
    color = 200,80,60
    width = 4
    x = 300
    y = 250
    radius = 200
    position = x-radius,y-radius,radius*2,radius*2
    
    
    #设置按键1,2,3,4变量
    piece1 = False
    piece2 = False
    piece3 = False
    piece4 = False
    
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == KEYUP:
                if event.key == pygame.K_ESCAPE:
                    sys.exit()
                elif event.key == pygame.K_1:
                    piece1 = True
                elif event.key == pygame.K_2:
                    piece2 = True
                elif event.key == pygame.K_3:
                    piece3 = True
                elif event.key == pygame.K_4:
                    piece4 = True
        #清屏
        screen.fill((0,0,200))
    
        #绘制4个数字
        textImage1 = myfont.render("1",True,color)
        text1=screen.blit(textImage1,(x+radius/2-20,y-radius/2))
        #print("text1==",text1)
        textImage2 = myfont.render("2",True,color)
        text2=screen.blit(textImage2,(x-radius/2,y-radius/2))
        #print("text2==", text2)
        textImage3 = myfont.render("3",True,color)
        text3=screen.blit(textImage3,(x-radius/2,y+radius/2-20))
        #print("text3==", text3)
        textImage4 = myfont.render("4",True,color)
        text4=screen.blit(textImage4,(x+radius/2-20,y+radius/2-20))
        #print("text4==", text4)
    
        #判断是否绘制饼
        if piece1:
            start_angle = math.radians(0)
            end_angle = math.radians(90)
            arc1=pygame.draw.arc(screen,color,position,start_angle,end_angle,width)
            print("arc1==",arc1)
            line1=pygame.draw.line(screen,color,(x,y),(x,y-radius),width)
            print("line1==",line1)
            line2=pygame.draw.line(screen,color,(x,y),(x+radius,y),width)
            print("line2==",line2)
        if piece2:
            start_angle = math.radians(90)
            end_angle = math.radians(180)
            pygame.draw.arc(screen,color,position,start_angle,end_angle,width)
            pygame.draw.line(screen,color,(x,y),(x,y-radius),width)
            pygame.draw.line(screen,color,(x,y),(x-radius,y),width)
        if piece3:
            start_angle = math.radians(180)
            end_angle = math.radians(270)
            pygame.draw.arc(screen,color,position,start_angle,end_angle,width)
            pygame.draw.line(screen,color,(x,y),(x-radius,y),width)
            pygame.draw.line(screen,color,(x,y),(x,y+radius),width)
        if piece4:
            start_angle = math.radians(270)
            end_angle = math.radians(360)
            pygame.draw.arc(screen,color,position,start_angle,end_angle,width)
            pygame.draw.line(screen,color,(x,y),(x,y+radius),width)
            pygame.draw.line(screen,color,(x,y),(x,y+radius),width)
    
        #是否4个饼都绘制完成
        if piece1 and piece2 and piece3 and piece4:
            color = 0,255,0
    
        pygame.display.update()

    执行结果

    三、绘制椭圆

    采用pygame.draw.ellipse()函数

     
  • 相关阅读:
    ORM查询相关的操作
    分享一些珍藏和网上搜集的一些接码平台
    DRF: serializers ModelSerializer的序列化中model在有外键的情况下显示name代替显示id的几种方式
    Django Rest framework中序列化A表时怎么获取B表的数据
    10步入门Django Rest framework后端接口框架
    Django Rest framework后端接口框架,常用的子类视图
    redis学习(九)——数据持久化
    Java8之lambda表达式
    Java多线程(九)—— interrupt()和线程终止方式
    redis学习(八)——redis应用场景
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13157984.html
Copyright © 2011-2022 走看看