这是Pygame的简介,面向已经了解Python的人。本文将教您如何构建一个简单的游戏,让玩家躲避弹跳球。...
第1部分第1部分(共8部分):安装pygame
- 1下载Pygame。从中为您的平台查找http://www.pygame.org/download.shtml .
- 2运行安装程序。
- 3确认安装工作正常。打开Python终端。键入“import pygame”如果您没有看到任何错误,则Pygame已成功安装。导入pygame
第2部分第2部分(共8部分):设置基本窗口
- 1打开新文件。
- 2导入Pygame。Pygame是一个提供图形功能访问的库。如果您想了解这些功能如何工作的更多信息,可以在Pygame网站上查找。https://www.pygame.org/docs/从pygame导入pygame。本地输入*
- 3设置窗口分辨率。您将为屏幕分辨率创建一个全局变量,以便可以在游戏的多个部分中引用。在文件的顶部也很容易找到,以便以后可以更改。对于高级项目,最好将这些信息放在单独的文件中。分辨率=(400300)
- 4定义一些颜色。pygame中的颜色是(RBGA,其值范围在0到255之间。alpha值(A)是可选的,但其他颜色(红色、蓝色和绿色是必需的)。白色=(255255255)黑色=(0,0,0)红色=(255,0,0)
- 5初始化屏幕。使用前面定义的分辨率变量。屏幕=pygame。陈列set_模式(分辨率)
- 6进行游戏循环。在游戏的每一帧中重复某些动作。做一个总是重复的循环来循环所有这些动作。虽然为True:
- 7为屏幕上色。屏幕填充(白色)
- 8显示屏幕。如果运行该程序,屏幕将变白,然后程序将崩溃。这是因为操作系统正在向游戏发送事件,而游戏没有对其进行任何处理。一旦游戏收到太多未处理的事件,它就会崩溃。虽然为True:。。。pygame。陈列翻转()
- 9处理事件。获取每个帧中发生的所有事件的列表。你只关心一件事,那就是退出。当用户关闭游戏窗口时会发生这种情况。这也将防止我们的程序因太多事件而崩溃。虽然为True:。。。用于pygame中的事件。事件get():if事件。类型==退出:pygame。退出()
- 10试试看!现在代码应该是这样的:从pygame导入pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列设置_模式(分辨率)为True时:屏幕。填充(白色)pygame。陈列pygame中事件的flip()。事件get():if事件。类型==退出:pygame。退出()
第3部分第3部分(共8部分):制作游戏对象
- 1创建一个新类和构造函数。设置对象的所有属性。您还为所有属性提供了默认值。类球:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。类型=“球”
- 2定义如何绘制对象。使用构造函数中定义的属性将球绘制为圆,并将曲面传递到函数中以绘制对象。曲面将是先前使用分辨率创建的屏幕对象。def draw(self,surface):pygame。画圆(表面,黑色,(self.x,self.y),self。半径)
- 3制作一个类的例子,并告诉游戏循环在每个循环中抽球。ball=ball(),为True时:。。。球绘制(屏幕)
- 4移动物体。创建一个更新对象位置的函数。在每个游戏循环中调用此函数。班级舞会:。。。def更新(自我):自我。x+=自身。dx自身。y+=自身。dy公司
- 5限制帧速率。球会移动得很快,因为比赛循环每秒运行数百次。使用Pygame的时钟将帧速率限制为60 fps。时钟=pygame。时间时钟()为True时:。。。时钟勾选(60)
- 6将球保持在屏幕上。在更新函数中添加检查,以在球击中屏幕边缘之一时反转球的方向。班级舞会:。。。def更新(自身):。。。如果(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1
- 7试试看!现在代码应该是这样的:从pygame导入pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(self.x,self.y),self。半径)def更新(自):自。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1ball=Ball()时钟=pygame。时间时钟()为True时:屏幕。填充(白色)球。绘制(屏幕)球。update()pygame。陈列翻转()时钟。勾选(60)表示pygame中的事件。事件get():if事件。类型==退出:pygame。退出()
第4部分第4部分(共8部分):组织比赛
- 1利用课堂组织一切。游戏会变得更复杂。使用面向对象的技术来组织代码。
- 2将游戏循环带入课堂。因为我们的游戏现在有包括游戏对象和功能的数据,所以将游戏循环转换为类是有意义的。class game():
- 3添加构造函数。在这里,您将实例化一些游戏对象,创建屏幕和时钟,并初始化Pygame。Pygame需要初始化才能使用某些功能,如文本或声音。class game():def \uu init\uuu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()
- 4处理函数中的事件。类game():。。。def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。退出()
- 5使游戏循环成为一个函数。在每个循环中调用事件处理函数。类game():。。。def run(self):而True:self。handleEvents()自身。屏幕填充(白色)自我。时钟勾选(60)pygame。陈列翻转()
- 6处理多个游戏对象。现在,这段代码必须在每个帧上调用绘制和更新对象。如果你有很多东西,这会变得很混乱。让我们将对象添加到数组中,然后在每个循环中更新并绘制数组中的所有对象。现在,您可以轻松添加另一个对象并为其指定不同的起始位置。class game():def \uu init\uuuu(self):。。。自己游戏对象=[]自身。游戏对象。附加(Ball())self。游戏对象。附加(球(100))。。。def run(self):而True:self。在self中用于gameObj的handleEvents()。游戏对象:gameObj。update()自身。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()
- 7试试看!现在代码应该是这样的:从pygame导入pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(self.x,self.y),self。半径)def更新(自):自。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1class game():def \uu init\uuuu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()自身。游戏对象=[]自身。游戏对象。附加(Ball())self。游戏对象。附加(Ball(100))def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。quit()def run(self):而True:self。在self中用于gameObj的handleEvents()。游戏对象:gameObj。update()自身。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()游戏()。运行()
第5部分第5部分(共8部分):添加玩家对象
- 1制作一个玩家类和构造函数。你要做另一个由鼠标控制的圆。初始化构造函数中的值。半径是唯一重要的值。职业玩家:def _uinit(self,rad=20):self。x=0自身。y=0自身。半径=rad
- 2定义如何绘制玩家对象。这将与你绘制其他游戏对象的方式相同。班级球员:。。。def draw(self,surface):pygame。画圆(表面,红色,(self.x,self.y),self。半径)
- 3为玩家对象添加鼠标控制。在每一帧中,检查鼠标的位置,并将玩家的对象位置设置为该点。班级球员:。。。def更新(self):cord=pygame。老鼠get_pos()self。x=跳线[0]自身。y=跳线[1]
- 4将玩家对象添加到gameObjects。创建一个新的玩家实例并将其添加到列表中。class game():def \uu init\uuuu(self):。。。自己游戏对象。附加(Player())
- 5试试看!现在代码应该是这样的:从pygame导入pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(self.x,self.y),self。半径)def更新(自):自。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1类玩家:def _uinit_uu(self,rad=20):self。x=0自身。y=0自身。半径=rad self。type=“player”def draw(self,surface):pygame。画圆(表面,红色,(self.x,self.y),self。radius)def更新(自):cord=pygame。老鼠get_pos()self。x=跳线[0]自身。y=cord[1]class game():def \uu init\uuuu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()自身。游戏对象=[]自身。游戏对象。附加(Player())self。游戏对象。附加(Ball())self。游戏对象。附加(Ball(100))def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。quit()def run(self):而True:self。在self中用于gameObj的handleEvents()。游戏对象:gameObj。update()自身。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()游戏()。运行()
第6部分第6部分(共8部分):使对象与玩家交互
- 1更改更新功能。为了让对象进行交互,它们需要相互访问。让我们添加另一个要更新的参数,以传递到gameObjects列表中。您必须将其添加到球员对象和球对象中。如果您有很多游戏对象,继承可以帮助您保持所有方法签名相同。班级舞会:。。。def更新(自身,游戏对象):。。。班级球员:。。。def更新(自身、游戏对象):
- 2检查球员和球之间的碰撞。检查所有游戏对象,并检查对象的类型是否为“球”。然后使用两个对象的半径和距离公式来检查它们是否碰撞。圆很容易检查碰撞。这是你在这个游戏中没有使用其他形状的最大原因。班级球员:。。。def更新(自身,游戏对象):。。。对于gameObjects中的gameObj:if gameObj。类型==“ball”:if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:
- 3如果玩家被“击中”,则结束游戏。让我们暂时退出游戏吧。if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:pygame。退出()
- 4试试看!现在代码应该是这样的:从pygame导入pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(self.x,self.y),self。radius)def更新(self,gameObjects):self。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1类玩家:def _uinit_uu(self,rad=20):self。x=0自身。y=0自身。半径=rad self。type=“player”def draw(self,surface):pygame。画圆(表面,红色,(self.x,self.y),self。radius)def更新(self,gameObjects):cord=pygame。老鼠get_pos()self。x=跳线[0]自身。y=gameObjects中gameObj的跳线[1]:如果gameObj。类型==“ball”:if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:pygame。quit()class game():def \uu init\uuuu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()自身。游戏对象=[]自身。游戏对象。附加(Player())self。游戏对象。附加(Ball())self。游戏对象。附加(Ball(100))def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。quit()def run(self):而True:self。在self中用于gameObj的handleEvents()。游戏对象:gameObj。更新(self.gameObjects)self。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()游戏()。运行()
第7部分第7部分(共8部分):添加游戏控制器以创建对象
- 1创建游戏控制器类。游戏控制器负责“运行”游戏。它不同于负责绘制和更新所有对象的游戏类。控制器会定期将另一个球添加到屏幕上,使游戏更加困难。添加构造函数并初始化一些基本值。间隔将是添加另一个球之前的时间。类GameController:def _uinit_uu(self,interval=5):self。inter=间隔自身。下一个=pygame。时间get_ticks()+(2*1000)self。type=“游戏控制器”
- 2添加更新功能。这将检查自添加球或游戏开始以来经过了多少时间。如果时间超过间隔,您将重置时间并添加一个球。类游戏控制器:。。。def更新(self,gameObjects):如果self。下一个(<);pygame。时间get_ticks():self。下一个=pygame。时间get_ticks()+(self.inter*1000)游戏对象。附加(Ball())
- 3给出球的随机速度。你需要使用随机数使游戏每次都不同。然而,球的速度现在是一个浮点数,而不是整数。类游戏控制器:。。。def更新(self,gameObjects):如果self。下一个(<);pygame。时间get_ticks():self。下一个=pygame。时间get_ticks()+(self.inter*1000)游戏对象。附加(Ball(xVel=random()*2,yVel=random()*2))
- 4固定绘图功能。draw函数不接受浮点。在绘制球之前,让我们将球的位置转换为整数。班级舞会:。。。def draw(self,surface):pygame。画圆(表面,黑色,(int(self.x),int(self.y)),self。半径)
- 5定义游戏控制器的绘制方法。由于它是一个游戏对象,主循环将尝试绘制它。你需要定义一个不做任何事情的绘图函数,这样游戏就不会崩溃。类游戏控制器:。。。def draw(自身,屏幕):通过
- 6将游戏控制器添加到gameObjects并移除2个球。游戏现在应该每五秒产生一个球。class game():def \uu init\uuuu(self):。。。自己游戏对象=[]自身。游戏对象。附加(GameController())self。游戏对象。附加(Player())
- 7试试看!现在代码应该是这样的:import pygamefrom random import random from pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(int(self.x),int(self.y)),self。radius)def更新(self,gameObjects):self。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1类玩家:def _uinit_uu(self,rad=20):self。x=0自身。y=0自身。半径=rad self。type=“player”def draw(self,surface):pygame。画圆(表面,红色,(self.x,self.y),self。radius)def更新(self,gameObjects):cord=pygame。老鼠get_pos()self。x=跳线[0]自身。y=gameObjects中gameObj的跳线[1]:如果gameObj。类型==“ball”:if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:pygame。quit()类GameController:def _uinit_uu(self,interval=5):self。inter=间隔自身。下一个=pygame。时间get_ticks()+(2*1000)self。type=“游戏控制器”def更新(self,gameObjects):如果self。下一个(<);pygame。时间get_ticks():self。下一个=pygame。时间get_ticks()+(self.inter*1000)游戏对象。append(Ball(xVel=random()*2,yVel=random()*2))def draw(self,screen):passclass game():def _uinit_uu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()自身。游戏对象=[]自身。游戏对象。附加(GameController())self。游戏对象。附加(Player())def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。quit()def run(self):而True:self。在self中用于gameObj的handleEvents()。游戏对象:gameObj。更新(self.gameObjects)self。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()游戏()。运行()
第8部分第8部分(共8部分):添加分数并结束游戏
- 1向游戏控制器类添加分数。创建字体对象和分数变量。您将在每一帧中绘制字体以显示分数,并在更新中每一帧增加分数。类GameController:def \uu init\uuu(self,interval=5):。。。自己分数=0。scoreText=pygame。字体。字体(None,12)def更新(self,gameObjects):。。。自己分数+=1 def draw(自身,屏幕):屏幕。blit(self.scoreText.render(str(self.score),True,black),(5,5))
- 2修改游戏结束方式。当玩家检测到碰撞时,让我们摆脱退出。相反,您将在玩家中设置一个变量,游戏可以检查该变量。设置gameOver后,停止更新对象。这将冻结一切,使球员可以看到发生了什么,并检查他们的分数。请注意,对象仍在绘制中,只是没有更新。职业玩家:def _uinit_uu(self,rad=20):。。。自己gameOver=False def更新(self,gameObjects):。。。对于gameObjects中的gameObj:if gameObj。类型==“ball”:if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:自。gameOver=Trueclass game():def \uu init\uuuu(self):。。。自己gameOver=False def run(self):而True:self。handleEvents()如果不是self。gameOver:用于gameObj的self。游戏对象:gameObj。如果gameObj,则更新(self.gameObjects)。类型==“player”:自我。gameOver=gameObj。游戏结束
- 3试试看!现在完成的代码应该是这样的:import pygamefrom random import random from pygame。局部输入*分辨率=(400300)白色=(255255255)黑色=(0,0,0)红色=(255,0,0)屏幕=pygame。陈列set_mode(resolution)class Ball:def _uinit(self,xPos=分辨率[0]/2,yPos=分辨率[1]/2,xVel=1,yVel=1,rad=15):self。x=xPos自身。y=yPos自身。dx=xVel self。dy=yVel self。半径=rad self。type=“ball”def draw(self,surface):pygame。画圆(表面,黑色,(int(self.x),int(self.y)),self。radius)def更新(self,gameObjects):self。x+=自身。dx自身。y+=自身。dy if(self.x<;=0或self.x>;=分辨率[0]):self。dx*=-1如果(self.y<;=0或self.y>;=分辨率[1]):self。dy*=-1类玩家:def _uinit_uu(self,rad=20):self。x=0自身。y=0自身。半径=rad self。type=“玩家”自身。gameOver=False def draw(self,surface):pygame。画圆(表面,红色,(self.x,self.y),self。radius)def更新(self,gameObjects):cord=pygame。老鼠get_pos()self。x=跳线[0]自身。y=gameObjects中gameObj的跳线[1]:如果gameObj。类型==“ball”:if(gameObj.x-self.x)**2+(gameObj.y-self.y)**2<;=(gameObj.radius+自半径)**2:自。gameOver=True类GameController:def _uinit_uu(self,interval=5):self。inter=间隔自身。下一个=pygame。时间get_ticks()+(2*1000)self。type=“游戏控制器”self。分数=0。scoreText=pygame。字体。字体(None,12)def更新(self,gameObjects):如果self。下一个(<);pygame。时间get_ticks():self。下一个=pygame。时间get_ticks()+(self.inter*1000)游戏对象。附加(Ball(xVel=random()*2,yVel=random()*2))self。分数+=1 def draw(自身,屏幕):屏幕。blit(self.scoreText.render(str(self.score),True,black,(5,5))类game():def \uu init\uuuu(self):pygame。init()self。屏幕=pygame。陈列自行设置_模式(分辨率)。时钟=pygame。时间时钟()自身。游戏对象=[]自身。游戏对象。附加(GameController())self。游戏对象。附加(Player())self。gameOver=False def handleEvents(self):用于pygame中的事件。事件get():if事件。类型==退出:pygame。quit()def run(self):而True:self。handleEvents()如果不是self。gameOver:用于gameObj的self。游戏对象:gameObj。如果gameObj,则更新(self.gameObjects)。类型==“player”:自我。gameOver=gameObj。游戏超越自我。屏幕在self中为gameObj填充(白色)。游戏对象:gameObj。绘制(self.screen)self。时钟勾选(60)pygame。陈列翻转()游戏()。运行()
-
发表于 2022-07-07 15:33
- 阅读 ( 29 )
- 分类:计算机和电子产品