pygame精灵组有哪些方法_pygame 精灵的行走及二段跳的实现方法(必看篇)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值