I have to admit that the translation and typesetting of the book "Introduction to PythonGame Programming" is very poor, but the demo inside is still very good. I have made some adaptations and put them here.
First the materials:
Background
Elf
All materials are Taken from this book
The next step is to create the Elf class:
(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
"Place" the Elf class Go to the game screen and add a background
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 = 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()
In this case, the sprite is on the canvas, and we have to make it move left and right:
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
Then realize the jump and double jump
The next two things need to be said here Notes on segment jumping:
1. You can only jump twice before landing, which means that the elf cannot jump again after the second jump.
2. After pressing the space button, The sprite's acceleration is reset
, which requires modifying the previous code:
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()
All codes:
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, 64, 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()
In this way, a rough elf that can double jump is completed.
I am very grateful to this book for providing ideas for single jumps and giving me the idea of thinking about double jumps. In fact, things like double jumps may seem easy, but actually they require some thinking to implement.
The above is the detailed content of How to implement walking and double jump of game character elves using pygame. For more information, please follow other related articles on the PHP Chinese website!