Pygame的介绍

Pygame是被设计用来写游戏的python模块集合,Pygame是在优秀的SDL库之上开发的功能性包。使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。

安装库:pip install pygame 。如果安装速度慢,可以使用换源安装。

我们可以执行第一个pygame库自带的小游戏

pygame理解:

  • Python最经典的2D游戏开发第三方库,也支持3D游戏开发
  • Pygame适合用于游戏逻辑验证、游戏入门及系统演示验证
  • Pygame是一种游戏开发引擎,基本逻辑具有参考价值
  • Pygame有些"过时",但永远"不过时"
  • 使用Pygame可以开发出优秀的游戏!

最小开发框架

import pygame,sys #sys是python的标准库,提供Python运行时环境变量的操控pygame.init()  #内部各功能模块进行初始化创建及变量设置,默认调用
size = width,height = 800,600  #设置游戏窗口大小,分别是宽度和高度
screen = pygame.display.set_mode(size)  #初始化显示窗口
pygame.display.set_caption("小游戏程序")  #设置显示窗口的标题内容,是一个字符串类型
while True:  #无限循环,直到Python运行时退出结束for event in pygame.event.get():  #从Pygame的事件队列中取出事件,并从队列中删除该事件if event.type == pygame.QUIT:  #获得事件类型,并逐类响应sys.exit()   #用于退出结束游戏并退出          pygame.display.update()  #对显示窗口进行更新,默认窗口全部重绘

运行后

代码执行流程

#mermaid-svg-XkRAvcRHCBtPWVyG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .label text{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .node rect,#mermaid-svg-XkRAvcRHCBtPWVyG .node circle,#mermaid-svg-XkRAvcRHCBtPWVyG .node ellipse,#mermaid-svg-XkRAvcRHCBtPWVyG .node polygon,#mermaid-svg-XkRAvcRHCBtPWVyG .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-XkRAvcRHCBtPWVyG .node .label{text-align:center;fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .node.clickable{cursor:pointer}#mermaid-svg-XkRAvcRHCBtPWVyG .arrowheadPath{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-XkRAvcRHCBtPWVyG .flowchart-link{stroke:#333;fill:none}#mermaid-svg-XkRAvcRHCBtPWVyG .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-XkRAvcRHCBtPWVyG .edgeLabel rect{opacity:0.9}#mermaid-svg-XkRAvcRHCBtPWVyG .edgeLabel span{color:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-XkRAvcRHCBtPWVyG .cluster text{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-XkRAvcRHCBtPWVyG .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-XkRAvcRHCBtPWVyG text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-XkRAvcRHCBtPWVyG .actor-line{stroke:grey}#mermaid-svg-XkRAvcRHCBtPWVyG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-XkRAvcRHCBtPWVyG #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .sequenceNumber{fill:#fff}#mermaid-svg-XkRAvcRHCBtPWVyG #sequencenumber{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG #crosshead path{fill:#333;stroke:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .messageText{fill:#333;stroke:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-XkRAvcRHCBtPWVyG .labelText,#mermaid-svg-XkRAvcRHCBtPWVyG .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-XkRAvcRHCBtPWVyG .loopText,#mermaid-svg-XkRAvcRHCBtPWVyG .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-XkRAvcRHCBtPWVyG .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-XkRAvcRHCBtPWVyG .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-XkRAvcRHCBtPWVyG .noteText,#mermaid-svg-XkRAvcRHCBtPWVyG .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-XkRAvcRHCBtPWVyG .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-XkRAvcRHCBtPWVyG .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-XkRAvcRHCBtPWVyG .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-XkRAvcRHCBtPWVyG .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .section{stroke:none;opacity:0.2}#mermaid-svg-XkRAvcRHCBtPWVyG .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-XkRAvcRHCBtPWVyG .section2{fill:#fff400}#mermaid-svg-XkRAvcRHCBtPWVyG .section1,#mermaid-svg-XkRAvcRHCBtPWVyG .section3{fill:#fff;opacity:0.2}#mermaid-svg-XkRAvcRHCBtPWVyG .sectionTitle0{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .sectionTitle1{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .sectionTitle2{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .sectionTitle3{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-XkRAvcRHCBtPWVyG .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .grid path{stroke-width:0}#mermaid-svg-XkRAvcRHCBtPWVyG .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-XkRAvcRHCBtPWVyG .task{stroke-width:2}#mermaid-svg-XkRAvcRHCBtPWVyG .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .taskText:not([font-size]){font-size:11px}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-XkRAvcRHCBtPWVyG .task.clickable{cursor:pointer}#mermaid-svg-XkRAvcRHCBtPWVyG .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XkRAvcRHCBtPWVyG .taskText0,#mermaid-svg-XkRAvcRHCBtPWVyG .taskText1,#mermaid-svg-XkRAvcRHCBtPWVyG .taskText2,#mermaid-svg-XkRAvcRHCBtPWVyG .taskText3{fill:#fff}#mermaid-svg-XkRAvcRHCBtPWVyG .task0,#mermaid-svg-XkRAvcRHCBtPWVyG .task1,#mermaid-svg-XkRAvcRHCBtPWVyG .task2,#mermaid-svg-XkRAvcRHCBtPWVyG .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutside0,#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutside2{fill:#000}#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutside1,#mermaid-svg-XkRAvcRHCBtPWVyG .taskTextOutside3{fill:#000}#mermaid-svg-XkRAvcRHCBtPWVyG .active0,#mermaid-svg-XkRAvcRHCBtPWVyG .active1,#mermaid-svg-XkRAvcRHCBtPWVyG .active2,#mermaid-svg-XkRAvcRHCBtPWVyG .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-XkRAvcRHCBtPWVyG .activeText0,#mermaid-svg-XkRAvcRHCBtPWVyG .activeText1,#mermaid-svg-XkRAvcRHCBtPWVyG .activeText2,#mermaid-svg-XkRAvcRHCBtPWVyG .activeText3{fill:#000 !important}#mermaid-svg-XkRAvcRHCBtPWVyG .done0,#mermaid-svg-XkRAvcRHCBtPWVyG .done1,#mermaid-svg-XkRAvcRHCBtPWVyG .done2,#mermaid-svg-XkRAvcRHCBtPWVyG .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-XkRAvcRHCBtPWVyG .doneText0,#mermaid-svg-XkRAvcRHCBtPWVyG .doneText1,#mermaid-svg-XkRAvcRHCBtPWVyG .doneText2,#mermaid-svg-XkRAvcRHCBtPWVyG .doneText3{fill:#000 !important}#mermaid-svg-XkRAvcRHCBtPWVyG .crit0,#mermaid-svg-XkRAvcRHCBtPWVyG .crit1,#mermaid-svg-XkRAvcRHCBtPWVyG .crit2,#mermaid-svg-XkRAvcRHCBtPWVyG .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-XkRAvcRHCBtPWVyG .activeCrit0,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCrit1,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCrit2,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-XkRAvcRHCBtPWVyG .doneCrit0,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCrit1,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCrit2,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-XkRAvcRHCBtPWVyG .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-XkRAvcRHCBtPWVyG .milestoneText{font-style:italic}#mermaid-svg-XkRAvcRHCBtPWVyG .doneCritText0,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCritText1,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCritText2,#mermaid-svg-XkRAvcRHCBtPWVyG .doneCritText3{fill:#000 !important}#mermaid-svg-XkRAvcRHCBtPWVyG .activeCritText0,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCritText1,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCritText2,#mermaid-svg-XkRAvcRHCBtPWVyG .activeCritText3{fill:#000 !important}#mermaid-svg-XkRAvcRHCBtPWVyG .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-XkRAvcRHCBtPWVyG g.classGroup text .title{font-weight:bolder}#mermaid-svg-XkRAvcRHCBtPWVyG g.clickable{cursor:pointer}#mermaid-svg-XkRAvcRHCBtPWVyG g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-XkRAvcRHCBtPWVyG g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-XkRAvcRHCBtPWVyG .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-XkRAvcRHCBtPWVyG .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-XkRAvcRHCBtPWVyG .dashed-line{stroke-dasharray:3}#mermaid-svg-XkRAvcRHCBtPWVyG #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG .commit-id,#mermaid-svg-XkRAvcRHCBtPWVyG .commit-msg,#mermaid-svg-XkRAvcRHCBtPWVyG .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-XkRAvcRHCBtPWVyG g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-XkRAvcRHCBtPWVyG g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-XkRAvcRHCBtPWVyG g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-XkRAvcRHCBtPWVyG .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-XkRAvcRHCBtPWVyG .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-XkRAvcRHCBtPWVyG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-XkRAvcRHCBtPWVyG .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-XkRAvcRHCBtPWVyG .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-XkRAvcRHCBtPWVyG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-XkRAvcRHCBtPWVyG .edgeLabel text{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XkRAvcRHCBtPWVyG .node circle.state-start{fill:black;stroke:black}#mermaid-svg-XkRAvcRHCBtPWVyG .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-XkRAvcRHCBtPWVyG #statediagram-barbEnd{fill:#9370db}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-state .divider{stroke:#9370db}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-XkRAvcRHCBtPWVyG .note-edge{stroke-dasharray:5}#mermaid-svg-XkRAvcRHCBtPWVyG .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-XkRAvcRHCBtPWVyG .error-icon{fill:#522}#mermaid-svg-XkRAvcRHCBtPWVyG .error-text{fill:#522;stroke:#522}#mermaid-svg-XkRAvcRHCBtPWVyG .edge-thickness-normal{stroke-width:2px}#mermaid-svg-XkRAvcRHCBtPWVyG .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-XkRAvcRHCBtPWVyG .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-XkRAvcRHCBtPWVyG .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-XkRAvcRHCBtPWVyG .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-XkRAvcRHCBtPWVyG .marker{fill:#333}#mermaid-svg-XkRAvcRHCBtPWVyG .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-XkRAvcRHCBtPWVyG {color: rgba(0, 0, 0, 0.75);font: ;}

获取事件并筑类响应
刷新屏幕

图像的基本使用

pygame默认是采用的笛卡尔坐标系。左上角的顶点是(0,0)

#加载导入的图片
sr = pygame.image.load("xxxx.jpg")  #放入图片的路径
rectsr = sr.get_rect()

路径下的图像载入游戏,支持JPG、PNG、GIF(非动画)等13种常用图片格式。

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

Rect对象有一些重要属性,例如:top,bottom,left,right 表示上下左右width,height 表示宽度、高度。


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

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

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

pygame.time.Clock()创建一个Clock对象,用于操作时间

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

键盘使用
Pygame采用事件来对应键盘操作
获取事件将得到键盘输入
不同按键编写操作函数即可

pygame.KEYDOWN:
Pygame对键盘敲击的事件定义,键盘每个键对应一个具体定义。

pygame.K_UP  上
pygame.K_LEFT   左
pygame.K_DOWN  下
pygame.K_RIGHT  右

更多按键属性可以参考pygame官方文档:pygame按键文档

# coding: utf-8
import pygame,syspygame.init()  #初始化init() 及设置
size = width,height = 800,600speed = [1,1]
BLACK = 0,0,0screen = pygame.display.set_mode(size)icon = pygame.image.load("image/dog01.jpg")#加载图片
pygame.display.set_icon(icon) #图标的使用pygame.display.set_caption("你是猪")  #游戏开始的首标题设置
ball = pygame.image.load("image/cat.jpg") #
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]-1elif event.key == pygame.K_UP:speed[1] = speed[1] +1 if speed[1] >0 else speed[1]-1elif event.key == pygame.K_DOWN:speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))elif event.key == pygame.ESCAPE:sys.exit()elif event.type == pygame.VIDEORESIZE:size = width, height = event.size[0],event.size[1]screen = pygame.display.set_mode(size,pygame.RESIZABLE)if pygame.display.get_active():ballrect = ballrect.move(speed[0], speed[1])ballrect = ballrect.move(speed[0], speed[1])if ballrect.left < 0 or ballrect.right > width: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

用来控制Pygame游戏的屏幕,Pygame有且只有一个屏幕,屏幕左上角坐标为(0,0),以像素为单位。

屏幕控制的需求有:
游戏全屏,游戏屏幕大小调节,屏幕的边框,更改游戏标题,更改游戏图标等

屏幕控制的重要函数

屏幕尺寸和模式
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.display
可以采用OpenGL支持显示
可以采用硬件加速显示
绘制加速将带来更流畅的运行效果

pygame事件处理

需求:
响应用户键盘、鼠标等外设操作,响应屏幕尺寸和模式变化,响应游戏情节的特定触发条件,产生一些触发条件等等

pygame.event.EventType
事件本质上是一种封装后的数据类型(对象)
EventType是Pygame的一个类,表示事件类型
事件类型只有属性,没有方法
用户可自定义新的事件类型


事件处理的重要函数

处理事件
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  键盘按下事件
pygame.event.KEYUP  键盘释放事件

event.unicode 按键unicode码,不推荐
event.key 按键的常量名称
event.mod 按键修饰符的组合值

按键的常量名称:


按键的修饰符:


修饰符的按位或运算
event.mod = KMOD_ALT | KMOD_SHIFT

鼠标事件

pygame.event.MOUSEMOTION鼠标移动事件
pygame.event.MOUSEBUTTONUP鼠标键释放事件
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件

鼠标移动事件pygame.event.MOUSEMOTION
event.pos鼠标当前坐标值(x,y),相对于窗口左上角
event.rel 鼠标相对运动距离(X,Y),相对于上次事件
event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
鼠标键释放事件pygame.event.MOUSEBUTTONUP
event.pos   鼠标当前坐标值(x,y),相对于窗口左上角
event.button鼠标按下键编号n取值 0/1/2,分别对应三个键
鼠标键按下事件pygame.event.MOUSEBUTTONDOWN
event.pos    鼠标当前坐标值(x,y),相对于窗口左上角
event.button  鼠标按下键编号n取值为整数,左键为1,右键为3,设备相关

pygame色彩机制

色彩 pygame.Color

Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选代表透明度
Color类可以用色彩名字、RGBA值、HTML色彩格式等方式定义

Color(name) 例如:Color("grey")
Color(r,g,b,a) 例如:Color(190, 190, 190, 255)  #取值范围0-255  a代表透明度
Color(rgbvalue) 例如:Color("#BEBEBEFF")

RGB色彩模式之外增加了第四维度:alpha通道
alpha通道表示不透明度,取值0-255,默认255
alpha通道值越大,不透明度越高,255表示不透明

pygame.Color.r   获得Color类的红色值r
pygame.Color.g   获得Color类的绿色值g
pygame.Color.b   获得Color类的蓝色值b
pygame.Color.a   获得Color类的不透明度值a
pygame.Color.normalize   将RGBA各通道值归一到0-1之间

图形绘制

pygame.draw
向屏幕上绘制一些简单的图形,如直线、圆形、椭圆等任何一个图形绘制后,会返回一个矩形Rect类表示该形状

pygame.Rect
表达一个矩形区域的类,用于存储坐标和长度信息Pygame利用Rect类来操作图形/图像等元素

四个参数 left,top,width,height

Rect类属性,返回一个数值或一个代表坐标的元组

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

图形绘制 pygame.draw

矩形 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, stop_angle 弧形绘制起始和结束弧度值
width=0 绘制边缘的宽度,默认为0,即填充图形

直线 pygame.draw.line(Surface, color, start_pos, end_pos, width=1)

Surface 直线的绘制屏幕
Color 直线的绘制颜色
start_pos, end_pos 直线的起始和结束坐标
width=1 直线的宽度,默认值为1

连续多线 pygame.draw.lines(Surface, color, closed, pointlist, width=1)

• Surface 连续多线的绘制屏幕
• Color 连续多线的绘制颜色
• closed 如果为True,起止节点间自动增加封闭直线
• pointlist连续多线的顶点坐标列表
• width=1 连续多线的宽度,默认值为1

无锯齿线 pygame.draw.aaline(Surface, color, start_pos, end_pos, blend=1)

• Surface 无锯齿线的绘制屏幕
• Color 无锯齿线的绘制颜色
• start_pos, end_pos 无锯齿线的起始和结束坐标
• blend=1 不为0时,与线条所在背景颜色进行混合

连续无锯齿线 pygame.draw.aalines(Surface, color, closed, pointlist, blend=1)

• Surface 连续无锯齿线的绘制屏幕
• Color 连续无锯齿线的绘制颜色
• closed 如果为True,起止节点间自动增加封闭直线
• pointlist连续无锯齿线的顶点坐标列表
• blend=1 不为0时,与线条所在背景颜色进行混合

文字绘制

向屏幕上绘制特定字体的文字 pygame.freetype
pygame.freetype是绘制文字的增强方法,建议使用必须额外增加import引用
根据字体和字号生成一个Font对象
用Font对象的方法绘制具体文字
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 在平面中的具体位置,(x,y)
• text 绘制的文字内容
• fgcolor 文字颜色
• bgcolor 背景颜色
• rotation 逆时针的旋转角度,取值0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖Font中的设定值Rect 返回一个Rect对象

Font.render(text, fgcolor=None, bgcolor=None,rotation=0, size=0) —> (Surface, Rect)

• text 绘制的文字内容
• fgcolor, bgcolor 字体颜色、背景颜色
• rotation 逆时针的旋转角度,取值0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖Font中的设定值返回一个元组,包含Surface对象和Rect对象

pygame的两个重要类型

pygame.Surface绘图层,或绘图平面,或图层
• 用于表示图形、文字或图像的绘制效果
• 与当前屏幕主图层可以并列存在
• 如果不绘制在主图层上,则不会被显示

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


主图层:

其它功能内容参照官方文档更加详细:
https://www.pygame.org/docs/

python Pygame库介绍和使用,基本游戏开发相关推荐

  1. python两人一碰_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  2. PYTHON pygame库实战——实现双人弹球小游戏

    PYTHON pygame实战--运用pygame库实现双人弹球小游戏 使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截 ...

  3. python弹球游戏双球代码键盘操作_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  4. 《利用Python进行数据分析·第2版》第13章 Python建模库介绍

    第1章 准备工作 第2章 Python语法基础,IPython和Jupyter 第3章 Python的数据结构.函数和文件 第4章 NumPy基础:数组和矢量计算 第5章 pandas入门 第6章 数 ...

  5. Python数据分析学习系列 十三 Python建模库介绍

    Python数据分析学习系列 十三 Python建模库介绍 资料转自(GitHub地址):https://github.com/wesm/pydata-book 有需要的朋友可以自行去github下载 ...

  6. 【利用Python进行数据分析】13 - Python建模库介绍

    第十三章 Python建模库介绍 1.pandas与模型代码的接口 2.用Patsy创建模型描述 2.1.Patsy创建模型设计矩阵 2.2.用Patsy公式进行数据转换 2.3.分类数据和Patsy ...

  7. python +pygame 制作五子连珠小游戏

    python +pygame 制作五子连珠小游戏 学习python半年了,今天分享一个利用pygame制作的五子连珠游戏. 一.代码: 1.球类,ball.py """ ...

  8. 基于pygame的消消乐小游戏开发

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于pygame的消消乐小游戏开发. 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 21世纪是信息化时代,随着信息技术和网络技 ...

  9. 又是一年中秋至|Python Pygame制作中秋兔子接月饼游戏【源码+解析】

    一年中秋又快到了,今年加入了Python的学习行列,得益于Python的开发效率和易读性,网上写文章的次数多了起来,既然是中秋节那肯定要搞个应景的游戏才行. 左思右想没有头绪时,刚好看到一篇介绍Pyg ...

最新文章

  1. 服务国内超过70%游戏公司,腾讯游戏云发布游戏行业最全解决方案
  2. 设为首页加入收藏代码
  3. 栈的应用_DFS解迷宫问题
  4. java实验报告合肥工业大学_合肥工业大学 计算机专业 计算方法实验报告
  5. linux命令 - alias
  6. java中椭圆类_Java中的Graphics2D类基本使用的教程
  7. 4月02日 提取汉字首字母,并大写的类
  8. 五、scrapy爬虫框架——logging 模块的使用
  9. 欧几里得算法和扩展欧几里得算法详解
  10. dj鲜生-18-发送邮件功能
  11. 发布阿里云OSS for phpcmsV9整合教程
  12. step-by-step: 夕小瑶版神经网络调参指南
  13. 好程序员Python培训分享numpy简介
  14. 大数据是什么 有哪些价值
  15. POJ 1682 DP
  16. oracle. 设置参数 sid,更改Oracle数据库的SID
  17. WMI与CIM的区别
  18. 【暑期每日一题】洛谷 P6320 [COCI2006-2007#4] SIBICE
  19. 用java汽车美容店管理系统_洗车店 一个较为简单的洗车店管理系统 联合开发网 - pudn.com...
  20. 世界首家《VOGUE》旗下婚纱店开业

热门文章

  1. JAVA集合之Map集合遍历
  2. C++ - sstream标准库(串流控制)
  3. Vue-Router学习记录
  4. python-pdf的去水印操作
  5. error C2712: Cannot use __try in functions that require object unwinding编译错误处理
  6. cad无法启动此程序 因为计算机中丢失,Win10无法启动CAD提示计算机中丢失ac1st16怎么办?...
  7. fcitx输入法代码分析总结
  8. 百度JAVA一二三面面经(2019秋招深圳)
  9. ARP欺骗之——原理分析
  10. 海思3559A平台4GB LPDDR配置方案