Pygame人物移动方向
Pygame character movement direction
快速更新我已经添加了一些代码来调整角色的移动,所以当角色不空闲时,角色面向它最后走向的位置。但是我对我的角色在任何移动动作后总是面向左有任何问题。我也更新了我的角色脚本:
import pygame
from pygame.sprite import Sprite
class Mage:
"""A class that manages the character mage"""
def __init__(self, ap_game):
"""Initialize the mage and set its starting position."""
self.neg = 0
self.screen_window = ap_game.screen_window
self.settings = ap_game.settings
self.screen_window_rect = ap_game.screen_window.get_rect()
# Load images for character walking movement
self.walk_left = [
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk1.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk2.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk3.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk4.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk5.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk6.bmp")
]
self.walk_right = [
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk1.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk2.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk3.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk4.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk5.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk6.bmp")
]
# Load the character - mage mage and get its rect.
image_file = "//Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free-pixel" \
"-art-game-heroes/Mage/Walk/standing.bmp"
self.mage = pygame.image.load(image_file)
self.rect = self.mage.get_rect()
# Start each new character at the bottom center of the screen.
self.rect.midbottom = self.screen_window_rect.midbottom
# Store the decimal value for the mage's horizontal position.
self.x = float(self.rect.x)
# Store the decimal value for the `mage's vertical position.
self.y = float(self.rect.y)
# Movement flag
self.moving_right = False
self.moving_left = False
self.jump_move = False
self.standing = True
self.walk_count = 0
self.jump_count = 10
def update(self):
"""Update the mage's position based on the movement flag."""
# Update the mage's x value, not the rect
if self.moving_right and self.rect.right < self.screen_window_rect.right:
self.x += self.settings.knight_speed
self.standing = False
elif self.moving_left and self.rect.left > 0:
self.x -= self.settings.knight_speed
self.standing = False
else:
self.standing = True
self.walk_count = 0
if self.jump_move:
if self.jump_count >= -10:
self.neg = 1
if self.jump_count < 0:
self.neg = -1
self.y -= (self.jump_count ** 2) * 0.5 * self.neg
self.jump_count -= 1
else:
self.jump_count = 10
self.jump_move = False
# Update rect object from self.x.
self.rect.x = self.x
# Update rect object from self.y.
self.rect.y = self.y
def blitme(self):
"""Draw the character at its current location."""
if self.walk_count + 1 >= 18:
self.walk_count = 0
if not self.standing:
if self.moving_left:
self.screen_window.blit(self.walk_left[self.walk_count // 3], self.rect)
self.walk_count += 1
elif self.moving_right:
self.screen_window.blit(self.walk_right[self.walk_count // 3], self.rect)
self.walk_count += 1
else:
if self.moving_right:
self.screen_window.blit(self.walk_right[0], self.rect)
else:
self.screen_window.blit(self.walk_left[0], self.rect)
主要脚本:
import sys
import os
import pygame
from game_settings import GameSettings
from knight import Mage
class AlienApocalypse:
"""Overall class to manage game assets and behaviour"""
def __init__(self):
"""Initialize the game and create game resources"""
self.walking_step = 6
pygame.init()
self.settings = GameSettings()
# Set up a clock that regulates the FPS of the game window
self.clock = pygame.time.Clock()
self.settings.vertical_momentum = 0
drivers = ['directfb', 'fbcon', 'svgalib']
found = False
for driver in drivers:
if not os.getenv('SDL_VIDEODRIVER'):
os.putenv('SDL_VIDEODRIVER', driver)
try:
pygame.display.init()
except pygame.error:
print('Driver: {0} failed.'.format(driver))
continue
found = True
break
if not found:
raise Exception('No suitable video driver found!')
self.screen_window = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Apocalypse")
"""Setting background color"""
self.background_color = (0, 0, 255)
self.mage = Mage(self)
def run_game(self):
"""Start the main loop for the game"""
while True:
self.clock.tick(27)
self._check_events()
self.mage.update()
self._update_screen()
def _check_events(self):
"""Respond to key presses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_event(event)
elif event.type == pygame.KEYUP:
self._check_keyup_event(event)
def _check_keydown_event(self, event):
"""Respond to KEYDOWN presses"""
if event.key == pygame.K_RIGHT:
self.mage.moving_right = True
elif event.key == pygame.K_LEFT:
self.mage.moving_left = True
elif event.key == pygame.K_SPACE:
self.mage.jump_move = True
elif event.key == pygame.K_q:
sys.exit()
def _check_keyup_event(self, event):
"""Respond to KEY releases"""
if event.key == pygame.K_RIGHT:
self.mage.moving_right = False
elif event.key == pygame.K_LEFT:
self.mage.moving_left = False
def _update_screen(self):
# Redraw the screen during each pass through the loop.
self.screen_window.fill(self.settings.background_color)
self.mage.blitme()
# Make the most recently drawn screen visible.
pygame.display.flip()
self.clock.tick(60)
if __name__ == "__main__":
"""Make a game instance, and run the game"""
ap = AlienApocalypse()
ap.run_game()
设置脚本:
class GameSettings:
"""This class stores all the game settings"""
def __init__(self):
"""Initialize the game's settings attributes"""
# Screen settings
self.screen_width = 1200
self.screen_height = 800
self.background_color = (0, 0, 255)
self.vertical_momentum = 0
# Knight settings
self.knight_speed = 2.5
# Bullet/Sword settings
self.bullet_speed = 8.0
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (255, 60, 60)
# self.facing = facing
将状态 self.last_move
添加到 class Mage
。设置角色移动时的状态,并根据状态绘制放置器 if self.standing
。例如:
class Mage:
def __init__(self, ap_game):
# [...]
self.last_move = None
# [...]
def blitme(self):
"""Draw the character at its current location."""
if self.walk_count + 1 >= 18:
self.walk_count = 0
if not self.standing:
if self.moving_left:
self.screen_window.blit(self.walk_left[self.walk_count // 3], self.rect)
self.walk_count += 1
self.last_move = "left"
elif self.moving_right:
self.screen_window.blit(self.walk_right[self.walk_count // 3], self.rect)
self.walk_count += 1
self.last_move = "right"
else:
if self.last_move == "right":
self.screen_window.blit(self.walk_right[0], self.rect)
elif self.last_move == "left":
self.screen_window.blit(self.walk_left[0], self.rect)
else:
self.screen_window.blit(self.mage, self.rect)
快速更新我已经添加了一些代码来调整角色的移动,所以当角色不空闲时,角色面向它最后走向的位置。但是我对我的角色在任何移动动作后总是面向左有任何问题。我也更新了我的角色脚本:
import pygame
from pygame.sprite import Sprite
class Mage:
"""A class that manages the character mage"""
def __init__(self, ap_game):
"""Initialize the mage and set its starting position."""
self.neg = 0
self.screen_window = ap_game.screen_window
self.settings = ap_game.settings
self.screen_window_rect = ap_game.screen_window.get_rect()
# Load images for character walking movement
self.walk_left = [
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk1.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk2.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk3.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk4.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk5.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/left_walk6.bmp")
]
self.walk_right = [
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk1.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk2.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk3.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk4.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk5.bmp"),
pygame.image.load("/Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free"
"-pixel-art-game-heroes/Mage/Walk/walk6.bmp")
]
# Load the character - mage mage and get its rect.
image_file = "//Users/johnphillip/Desktop/alien_apocalypse/craftpix-891165-assassin-mage-viking-free-pixel" \
"-art-game-heroes/Mage/Walk/standing.bmp"
self.mage = pygame.image.load(image_file)
self.rect = self.mage.get_rect()
# Start each new character at the bottom center of the screen.
self.rect.midbottom = self.screen_window_rect.midbottom
# Store the decimal value for the mage's horizontal position.
self.x = float(self.rect.x)
# Store the decimal value for the `mage's vertical position.
self.y = float(self.rect.y)
# Movement flag
self.moving_right = False
self.moving_left = False
self.jump_move = False
self.standing = True
self.walk_count = 0
self.jump_count = 10
def update(self):
"""Update the mage's position based on the movement flag."""
# Update the mage's x value, not the rect
if self.moving_right and self.rect.right < self.screen_window_rect.right:
self.x += self.settings.knight_speed
self.standing = False
elif self.moving_left and self.rect.left > 0:
self.x -= self.settings.knight_speed
self.standing = False
else:
self.standing = True
self.walk_count = 0
if self.jump_move:
if self.jump_count >= -10:
self.neg = 1
if self.jump_count < 0:
self.neg = -1
self.y -= (self.jump_count ** 2) * 0.5 * self.neg
self.jump_count -= 1
else:
self.jump_count = 10
self.jump_move = False
# Update rect object from self.x.
self.rect.x = self.x
# Update rect object from self.y.
self.rect.y = self.y
def blitme(self):
"""Draw the character at its current location."""
if self.walk_count + 1 >= 18:
self.walk_count = 0
if not self.standing:
if self.moving_left:
self.screen_window.blit(self.walk_left[self.walk_count // 3], self.rect)
self.walk_count += 1
elif self.moving_right:
self.screen_window.blit(self.walk_right[self.walk_count // 3], self.rect)
self.walk_count += 1
else:
if self.moving_right:
self.screen_window.blit(self.walk_right[0], self.rect)
else:
self.screen_window.blit(self.walk_left[0], self.rect)
主要脚本:
import sys
import os
import pygame
from game_settings import GameSettings
from knight import Mage
class AlienApocalypse:
"""Overall class to manage game assets and behaviour"""
def __init__(self):
"""Initialize the game and create game resources"""
self.walking_step = 6
pygame.init()
self.settings = GameSettings()
# Set up a clock that regulates the FPS of the game window
self.clock = pygame.time.Clock()
self.settings.vertical_momentum = 0
drivers = ['directfb', 'fbcon', 'svgalib']
found = False
for driver in drivers:
if not os.getenv('SDL_VIDEODRIVER'):
os.putenv('SDL_VIDEODRIVER', driver)
try:
pygame.display.init()
except pygame.error:
print('Driver: {0} failed.'.format(driver))
continue
found = True
break
if not found:
raise Exception('No suitable video driver found!')
self.screen_window = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Apocalypse")
"""Setting background color"""
self.background_color = (0, 0, 255)
self.mage = Mage(self)
def run_game(self):
"""Start the main loop for the game"""
while True:
self.clock.tick(27)
self._check_events()
self.mage.update()
self._update_screen()
def _check_events(self):
"""Respond to key presses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_event(event)
elif event.type == pygame.KEYUP:
self._check_keyup_event(event)
def _check_keydown_event(self, event):
"""Respond to KEYDOWN presses"""
if event.key == pygame.K_RIGHT:
self.mage.moving_right = True
elif event.key == pygame.K_LEFT:
self.mage.moving_left = True
elif event.key == pygame.K_SPACE:
self.mage.jump_move = True
elif event.key == pygame.K_q:
sys.exit()
def _check_keyup_event(self, event):
"""Respond to KEY releases"""
if event.key == pygame.K_RIGHT:
self.mage.moving_right = False
elif event.key == pygame.K_LEFT:
self.mage.moving_left = False
def _update_screen(self):
# Redraw the screen during each pass through the loop.
self.screen_window.fill(self.settings.background_color)
self.mage.blitme()
# Make the most recently drawn screen visible.
pygame.display.flip()
self.clock.tick(60)
if __name__ == "__main__":
"""Make a game instance, and run the game"""
ap = AlienApocalypse()
ap.run_game()
设置脚本:
class GameSettings:
"""This class stores all the game settings"""
def __init__(self):
"""Initialize the game's settings attributes"""
# Screen settings
self.screen_width = 1200
self.screen_height = 800
self.background_color = (0, 0, 255)
self.vertical_momentum = 0
# Knight settings
self.knight_speed = 2.5
# Bullet/Sword settings
self.bullet_speed = 8.0
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (255, 60, 60)
# self.facing = facing
将状态 self.last_move
添加到 class Mage
。设置角色移动时的状态,并根据状态绘制放置器 if self.standing
。例如:
class Mage:
def __init__(self, ap_game):
# [...]
self.last_move = None
# [...]
def blitme(self):
"""Draw the character at its current location."""
if self.walk_count + 1 >= 18:
self.walk_count = 0
if not self.standing:
if self.moving_left:
self.screen_window.blit(self.walk_left[self.walk_count // 3], self.rect)
self.walk_count += 1
self.last_move = "left"
elif self.moving_right:
self.screen_window.blit(self.walk_right[self.walk_count // 3], self.rect)
self.walk_count += 1
self.last_move = "right"
else:
if self.last_move == "right":
self.screen_window.blit(self.walk_right[0], self.rect)
elif self.last_move == "left":
self.screen_window.blit(self.walk_left[0], self.rect)
else:
self.screen_window.blit(self.mage, self.rect)