当前位置: 首页 > 科技观察

在您的Python游戏中模拟重力

时间:2023-03-14 11:05:47 科技观察

了解如何使用Python的Pygame模块编写计算机游戏并开始操纵重力。现实世界充满了运动和生命。物理学使现实生活如此忙碌和充满活力。物理学是物质在空间中移动的方式。由于电脑游戏世界没有物质,它没有物理定律,游戏程序员必须模拟物理。对于大多数电脑游戏来说,这里基本上只有两个重要的物理方面:重力和碰撞。当您将敌人添加到您的游戏中时,您会实施一些碰撞检测,但本文将添加更多内容,因为重力需要碰撞检测。考虑一下为什么引力会涉及碰撞。如果您想不出任何原因,请不要担心-它会在您开发示例代码时发挥作用,而且很明显。现实世界中的重力是具有质量的物体相互吸引的趋势。物体(质量)越大,它施加的引力作用就越大。在计算机游戏物理学中,您不必创建质量足以证明重力合理的物体;您可以对一个物体落向计算机游戏世界本身中假设的最大物体的趋势进行编程。添加一个重力函数,记住你的玩家已经有一个决定动作的属性。使用此属性将玩家精灵拉向屏幕底部。在Pygame中,数字越大越靠近屏幕的底部边缘。在现实世界中,重力影响一切。然而,在平台游戏中,重力是可选的——如果你给整个游戏世界添加重力,你所有的平台都会掉到地上。相反,您可以只为您的玩家和敌方精灵添加重力。首先,向您的Player类添加一个重力函数:defgravity(self):self。movey+=3.2#玩家下落的速度这是一个简单的函数。首先,您将播放器设置为垂直移动,无论您的播放器是否要移动。也就是说,您已将播放器编程为始终掉落。这基本上是重力。要使重力函数起作用,您必须在主循环中调用它。这样,Python在每个处理周期都将下落运动应用于您的播放器。在这段代码中,将第一行添加到您的循环中:player.gravity()#Checkgravityplayer.update()开始您的游戏,看看会发生什么。请小心,因为它发生得很快:您是从天而降的玩家,就在您的游戏屏幕之外。您的重力模拟正在运行,但可能好得令人难以置信。作为一项实验,尝试改变玩家下落的速度。为重力添加地板您的游戏无法检测到您的角色从世界中掉落。在某些游戏中,如果玩家掉出世界,精灵将被删除并在新位置重生。在其他游戏中,玩家会失去分数或生命。无论您想在玩家掉出世界时发生什么,您都必须能够检测到玩家何时消失在屏幕外。在Python中,要检查条件,您可以使用if语句。您必须检查您的播放器是否掉落,以及您的播放器掉落了多少。如果您的播放器掉到屏幕底部,您可以采取一些措施。为简化起见,将玩家精灵的位置设置为底部边缘上方20像素。让你的重力函数看起来像这样:defgravity(self):self.movey+=3.2#如果self.rect.y>worldyandself.movey>=0,self.movey=0self.rect玩家下落的速度有多快.y=worldy-ty然后,开始你的游戏。你的精灵仍然下落,但它停在了屏幕底部。但是,您可能无法在地面层上方看到您的精灵。一个简单的解决方法是让你的精灵在它到达游戏世界的底部后反弹得更高,方法是在它的新Y位置添加另一个-ty:defgravity(self):self.movey+=3.2#玩家下落的速度ifself.rect.y>worldyandself.movey>=0:self.movey=0self.rect.y=worldy-ty-ty现在你的玩家在屏幕底部弹跳,就在你的地面精灵上方。您的玩家真正需要的是一种对抗重力的方法。重力的问题是除非你有东西可以反抗它,否则你无法对抗它。因此,在下一篇文章中,您将添加地面和平台碰撞和跳跃能力。同时,尝试对敌方精灵施加重力。到目标前为停止,这里是全部的代码:#!/usr/bin/envpython3#绘制世界#添加玩家和玩家控制#添加玩家移动#添加敌人和基本碰撞#添加平台#添加重力#GNUAll-许可许可#复制和分发此文件,无论修改或不修改,#都允许在任何媒体中无需版税,前提是版权#通知和本通知得到保留。此文件按原样提供,#没有任何保证。importpygameimportsysimportos'''Objects'''classPlatform(pygame.sprite.Sprite):#xlocation,ylocation,imgwidth,imgheight,imgfiledef__init__(self,xloc,yloc,imgw,imgh,img):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(os.path.join('images',img)).convert()self.image.convert_alpha()self.rect=self.image.get_rect()self.rect.y=ylocself.rect.x=xlocclassPlayer(pygame.sprite.Sprite):'''生成一个玩家'''def__init__(self):pygame.sprite.Sprite.__init__(self)self.movex=0self.movey=0self.frame=0self.health=10self.score=1self.images=[]foriinrange(1,9):img=pygame.image.load(os.path.join('images','hero'+str(i)+'.png')).convert()img.convert_alpha()img.set_colorkey(ALPHA)self.images.append(img)self.image=self.images[0]self.rect=self.image.get_rect()defgravity(self):self.movey+=3.2#self.rect时玩家下落的速度。y>worldyandself.movey>=0:self.movey=0self.rect.y=worldy-ty-tydefcontrol(self,x,y):'''控制玩家移动'''self.movex+=xself.movey+=ydefupdate(self):'''更新精灵位置'''self.rect.x=self.rect.x+self.movexself.rect.y=self.rect.y+self.movey#向左移动ifself.movex<0:self.frame+=1ifself.frame>ani*3:self.frame=0self.image=self.images[self.frame//ani]#向右移动ifself.movex>0:self.frame+=1ifself.frame>ani*3:self.frame=0self.image=self.images[(self.frame//ani)+4]#碰撞enemy_hit_list=pygame.sprite.spritecollide(self,enemy_list,False)forenemy_hit_list:self.health-=1print(self.health)ground_hit_list=pygame.sprite.spritecollide(self,ground_list,False)forginground_hit_list:self.health-=1print(self.health)classEnemy(pygame.sprite.Sprite):'''Spawnanenemy'''def__init__(self,x,y,img):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(os.path.join('images',img))#self.image.convert_alpha()#self.image.set_colorkey(ALPHA)self.rect=self.image.get_rect()self.rect.x=xself.rect.y=yself.counter=0defmove(self):'''敌人移动'''distance=80speed=8ifself.counter>=0andself.counter<=distance:self.rect.x+=speedelifself.counter>=distanceandself.counter<=distance*2:self.rect.x-=speedelse:self.counter=0self.counter+=1classLevel():defbad(lvl,eloc):iflvl==1:enemy=Enemy(eloc[0],eloc[1],'yeti.png')#生成敌人enemy_list=pygame.sprite.Group()#创建敌人组enemy_list.add(enemy)#将敌人添加到组中iflvl==2:print("Level"+str(lvl))returnenemy_listdefloot(lvl,lloc):打印(lvl)defground(lvl,gloc,tx,ty):ground_list=pygame.sprite.Group()i=0iflvl==1:whilei