pygame 精灵的行走及二段跳的实现方法(必看篇)
这里有新鲜出炉的精品教程,程序狗速度看过来!
Pygame Python游戏模块
Pygame是 跨平台 Python模块,专为电子游戏设计。 包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。
下面小编就为大家带来一篇pygame 精灵的行走及二段跳的实现方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
不得不承认《Python游戏编程入门》这本书翻译、排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里。
先是素材:
背景
精灵
所有素材均取自此书
接下来就是精灵类的创建了:
classMySprite(pygame.sprite.Sprite):
def__init__(self,target):
pygame.sprite.Sprite.__init__(self)
self.master_image=None
self.frame=0
self.old_frame=-1
self.frame_width=1
self.frame_height=1
self.first_frame=0
self.last_frame=0
self.columns=1
self.last_time=0
#使用property方法,让精灵类对坐标操作更方便
def_getx(self):
returnself.rect.x
def_setx(self,value):
self.rect.x=value
X=property(_getx,_setx)
def_gety(self):
returnself.rect.y
def_sety(self,value):
self.rect.y=value
Y=property(_gety,_sety)
def_getpos(self):
returnself.rect.topleft
def_setpos(self,pos):
self.rect.topleft=pos
position=property(_getpos,_setpos)
#load方法中定义了图片位置,长宽和帧的列数,由此来将素材切成一帧一帧
defload(self,filename,width,height,columns):
self.master_image=pygame.image.load(filename).convert_alpha()
self.frame_width=width
self.frame_height=height
self.rect=Rect(0,0,width,height)
self.columns=columns
rect=self.master_image.get_rect()
self.last_frame=(rect.width// width) * (rect.height // height) - 1
defupdate(self,current_time,rate=30):
#更新帧数
ifcurrent_time>self.last_time+rate:
self.frame+=1
ifself.frame>self.last_frame:
self.frame=self.first_frame
self.last_time=current_time
#当帧数发生改变时,创建新的图片
ifself.frame!=self.old_frame:
frame_x=(self.frame%self.columns)*self.frame_width
frame_y=(self.frame// self.columns) * self.frame_height
rect=Rect(frame_x,frame_y,self.frame_width,self.frame_height)
self.image=self.master_image.subsurface(rect)
self.old_frame=self.frame
将精灵类“放置”到游戏屏幕上,并加上背景
pygame.init()
screen=pygame.display.set_mode((800,600))
font=pygame.font.Font(None,24)
framerate=pygame.time.Clock()
bg=pygame.image.load("background.png").convert_alpha()
pl=pygame.image.load('caveman.png').convert_alpha()
# 创建精灵组
group=pygame.sprite.Group()
player=MySprite(screen)
player.load("caveman.png",50,64,8)
player.first_frame=1
player.last_frame=7
player.position=400,303
group.add(player)
whileTrue:
foreventinpygame.event.get():
ifevent.type==QUIT:
sys.exit()
# 设置帧数
framerate.tick(30)
ticks=pygame.time.get_ticks()
这样的话精灵就在画布上了,我们得让它能左右移动:
keys=pygame.key.get_pressed()
ifkeys[K_ESCAPE]:
sys.exit()
ifkeys[K_RIGHT]:
player.X+=8
ifkeys[K_LEFT]:
ifplayer.X>0:
player.X-=8
然后实现跳跃及二段跳跃
这里需要说下二段跳跃的注意点:
1.直到落地前,只能跳两次,也就是说精灵进行二次跳跃后不能再跳了
2.按下空格后,精灵的加速度重置
这需要修改前面的代码:
jump_vel=0.0
# 设置一个记录跳跃次数的变量
space_number=0
# 跳跃判断
player_jumping=False
player_start_y=player.Y
whileTrue:
foreventinpygame.event.get():
ifevent.type==QUIT:
sys.exit()
ifevent.type==KEYDOWN:
ifevent.key==K_SPACE:
# 跳跃次数小于2次时,
ifspace_number<2:
jump_vel=-15.0
space_number+=1
player_jumping=True
keys=pygame.key.get_pressed()
ifkeys[K_ESCAPE]:
sys.exit()
ifkeys[K_RIGHT]:
player.X+=8
ifkeys[K_LEFT]:
ifplayer.X>0:
player.X-=8
# 设置帧数
framerate.tick(30)
ticks=pygame.time.get_ticks()
# 当按下空格后,jump_vel变量不断变大,直到接触地面
ifplayer_jumping:
player.Y+=jump_vel
jump_vel+=2
# 落地后,重置跳跃速度和其他判断变量
ifplayer.Y>=player_start_y:
player_jumping=False
player.Y=player_start_y
jump_vel=0
space_number=0
# 创建背景
screen.blit(bg,(0,0))
# 精灵组更新
group.update(ticks,50)
group.draw(screen)
pygame.display.update()
所有代码:
importsys,time,random,math,pygame
frompygame.localsimport*
classMySprite(pygame.sprite.Sprite):
def__init__(self,target):
pygame.sprite.Sprite.__init__(self)
self.master_image=None
self.frame=0
self.old_frame=-1
self.frame_width=1
self.frame_height=1
self.first_frame=0
self.last_frame=0
self.columns=1
self.last_time=0
# 使用property方法,让精灵类对坐标操作更方便
def_getx(self):
returnself.rect.x
def_setx(self,value):
self.rect.x=value
X=property(_getx,_setx)
def_gety(self):
returnself.rect.y
def_sety(self,value):
self.rect.y=value
Y=property(_gety,_sety)
def_getpos(self):
returnself.rect.topleft
def_setpos(self,pos):
self.rect.topleft=pos
position=property(_getpos,_setpos)
defload(self,filename,width,height,columns):
self.master_image=pygame.image.load(filename).convert_alpha()
self.frame_width=width
self.frame_height=height
self.rect=Rect(0,0,width,height)
self.columns=columns
rect=self.master_image.get_rect()
self.last_frame=(rect.width// width) * (rect.height // height) - 1
defupdate(self,current_time,rate=30):
# 更新帧数
ifcurrent_time>self.last_time+rate:
self.frame+=1
ifself.frame>self.last_frame:
self.frame=self.first_frame
self.last_time=current_time
# 当帧数发生改变时,创建新的图片
ifself.frame!=self.old_frame:
frame_x=(self.frame%self.columns)*self.frame_width
frame_y=(self.frame// self.columns) * self.frame_height
rect=Rect(frame_x,frame_y,self.frame_width,self.frame_height)
self.image=self.master_image.subsurface(rect)
self.old_frame=self.frame
pygame.init()
screen=pygame.display.set_mode((800,600))
font=pygame.font.Font(None,24)
framerate=pygame.time.Clock()
bg=pygame.image.load("background.png").convert_alpha()
pl=pygame.image.load('caveman.png').convert_alpha()
# 创建精灵组
group=pygame.sprite.Group()
player=MySprite(screen)
player.load("caveman.png",50,64,8)
player.first_frame=1
player.last_frame=7
player.position=400,303
group.add(player)
jump_vel=0.0
# 设置一个记录跳跃次数的变量
space_number=0
# 跳跃判断
player_jumping=False
player_start_y=player.Y
whileTrue:
foreventinpygame.event.get():
ifevent.type==QUIT:
sys.exit()
ifevent.type==KEYDOWN:
ifevent.key==K_SPACE:
# 跳跃次数小于2次时,
ifspace_number<2:
jump_vel=-15.0
space_number+=1
player_jumping=True
keys=pygame.key.get_pressed()
ifkeys[K_ESCAPE]:
sys.exit()
ifkeys[K_RIGHT]:
player.X+=8
ifkeys[K_LEFT]:
ifplayer.X>0:
player.X-=8
# 设置帧数
framerate.tick(30)
ticks=pygame.time.get_ticks()
# 当按下空格后,jump_vel变量不断变大,直到接触地面
ifplayer_jumping:
player.Y+=jump_vel
jump_vel+=2
# 落地后
ifplayer.Y>=player_start_y:
player_jumping=False
player.Y=player_start_y
jump_vel=0
space_number=0
rush_number=0
# 创建背景
screen.blit(bg,(0,0))
# 精灵组更新
group.update(ticks,50)
group.draw(screen)
pygame.display.update()
这样,一个粗糙的、会二段跳的精灵就完成了。
很感谢这本书提供单次跳跃的思路,让我有思考二段跳的想法。其实像二段跳这类看上去容易,但实现其实还是需要思考一番的。
以上这篇pygame 精灵的行走及二段跳的实现方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHPERZ。
来源: http://www.phperz.com/article/17/1105/351249.html