视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
pygame制作游戏人物精灵的行走及二段跳实现方法
2020-11-27 14:13:54 责编:小采
文档
不得不承认《Python游戏编程入门》这本书翻译、排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里。

先是素材:

背景

精灵

所有素材均取自此书

接下来就是精灵类的创建了:

 (self)
 self.master_image === -1= 1= 1=== 1============rect == (rect.width // width) * (rect.height // height) - 1 update(self, current_time, rate=30 current_time > self.last_time ++= 1 self.frame >== self.frame !== (self.frame % self.columns) *= (self.frame // self.columns) *=== 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, , 8)
player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player)while True:for event in pygame.event.get():if event.type == QUIT:
 sys.exit()# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()

这样的话精灵就在画布上了,我们得让它能左右移动:

keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
 player.X -= 8

然后实现跳跃及二段跳跃

这里需要说下二段跳跃的注意点:

1.直到落地前,只能跳两次,也就是说精灵进行二次跳跃后不能再跳了

2.按下空格后,精灵的加速度重置

,这需要修改前面的代码:

jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False
player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT:
 sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2:
 jump_vel = -15.0space_number += 1player_jumping = True

 keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
 player.X -= 8# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping:
 player.Y += jump_vel
 jump_vel += 2# 落地后,重置跳跃速度和其他判断变量if player.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()

所有代码:

import sys, time, random, math, pygamefrom pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, target):
 pygame.sprite.Sprite.__init__(self)
 self.master_image = None
 self.frame = 0
 self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0
 self.last_frame = 0
 self.columns = 1self.last_time = 0#   使用property方法,让精灵类对坐标操作更方便def _getx(self):return self.rect.xdef _setx(self, value):
 self.rect.x = value

 X = property(_getx, _setx)def _gety(self):return self.rect.ydef _sety(self, value):
 self.rect.y = value

 Y = property(_gety, _sety)def _getpos(self):return self.rect.topleftdef _setpos(self, pos):
 self.rect.topleft = pos

 position = property(_getpos, _setpos)def load(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) - 1def update(self, current_time, rate=30):#   更新帧数if current_time > self.last_time + rate:
 self.frame += 1if self.frame > self.last_frame:
 self.frame = self.first_frame
 self.last_time = current_time# 当帧数发生改变时,创建新的图片if self.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, , 8)
player.first_frame = 1player.last_frame = 7player.position = 400, 303group.add(player)


jump_vel = 0.0# 设置一个记录跳跃次数的变量space_number = 0# 跳跃判断player_jumping = False
player_start_y = player.Ywhile True:for event in pygame.event.get():if event.type == QUIT:
 sys.exit()if event.type == KEYDOWN:if event.key == K_SPACE:# 跳跃次数小于2次时,if space_number < 2:
 jump_vel = -15.0space_number += 1player_jumping = True

 keys = pygame.key.get_pressed()if keys[K_ESCAPE]:
 sys.exit()if keys[K_RIGHT]:
 player.X += 8if keys[K_LEFT]:if player.X > 0:
 player.X -= 8# 设置帧数framerate.tick(30)
 ticks = pygame.time.get_ticks()# 当按下空格后,jump_vel变量不断变大,直到接触地面if player_jumping:
 player.Y += jump_vel
 jump_vel += 2# 落地后if player.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()

这样,一个粗糙的、会二段跳的精灵就完成了。

很感谢这本书提供单次跳跃的思路,让我有思考二段跳的想法。其实像二段跳这类看上去容易,但实现其实还是需要思考一番的。

下载本文
显示全文
专题