如何在 pygame 中水平翻转图像?
How do I flip an image horizontally in pygame?
这是在 pygame。我如何翻转图像(比方说一个图像
猪向右看)向左看时
我按向左箭头键,然后保持原样
即使我不按任何键或按向上和向下箭头键。那么当我按下向右箭头键时,如何再次将它切换回向右看,即使我不按任何键或按下向上和向下箭头键,它仍然保持这种状态。
我知道我必须使用 pygame.transform.flip()。但是,我不知道如何将它放入我的代码中。
这是主游戏:
import sys
import pygame
from pig import Pig
pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Flying Pig")
blue_sky = 135, 206, 250
brown = 139, 69, 19
pig = Pig(screen)
while True:
# Accept events
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# Keydown events
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
elif event.key == pygame.K_LEFT:
pig.moving_left = True
elif event.key == pygame.K_UP:
pig.moving_up = True
elif event.key == pygame.K_DOWN:
pig.moving_down = True
# Keyup events
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
pig.moving_right = False
elif event.key == pygame.K_LEFT:
pig.moving_left = False
elif event.key == pygame.K_UP:
pig.moving_up = False
elif event.key == pygame.K_DOWN:
pig.moving_down = False
screen.fill(blue_sky)
pig.blitme()
pig.update()
pygame.display.flip()
猪class:(这是缩进的。我只是不知道如何在此处正确复制和粘贴我的代码)
import pygame
class Pig():
def __init__(self, screen):
"""Initialize the pig and set its starting position."""
self.screen = screen
# Load the pig image and set pig and screen to rect.
self.image = pygame.image.load('pig.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# Start the pig at the bottom center of the screen.
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# Speed of the pig
self.pig_speed = 1.5
self.center = float(self.pig_speed)
# Set a variable for each movement.
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
self.direction = ['right', 'left']
def update(self):
"""Update the position of the pig."""
if self.rect.right <= self.screen_rect.right:
if self.moving_right:
self.rect.centerx += self.pig_speed
if self.rect.left > 0:
if self.moving_left:
self.rect.centerx -= self.pig_speed
if self.rect.top > 0:
if self.moving_up:
self.rect.bottom -= self.pig_speed
if self.rect.bottom <= self.screen_rect.bottom:
if self.moving_down:
self.rect.bottom += self.pig_speed
def blitme(self):
"""Draw the pig at its current location."""
self.screen.blit(self.image, self.rect)
pygame.transform.flip
接受三个参数:
- 你要翻转的surface个
- 一个布尔值,表示表面应该水平翻转
- 一个布尔值,表示表面应该垂直翻转
要仅垂直翻转表面,将 True
作为第三个参数传递:
flipped_surface = pygame.transform.flip(surface, False, True)
关于你的具体问题,你可以这样做:
PIG_RIGHT = pygame.image.load('pig.png').convert()
PIG_LEFT = pygame.transform.flip(PIG_RIGHT, True, False)
pig = Pig(screen, PIG_RIGHT) # Assign this image to `self.image`.
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
pig.image = PIG_RIGHT
elif event.key == pygame.K_LEFT:
pig.moving_left = True
pig.image = PIG_LEFT
screen.fill(blue_sky)
pig.blitme()
pig.update()
pygame.display.flip()
clock.tick(30)
您还可以将两个表面存储在 Pig
class 中,并根据 self.moving_right
、self.moving_left
的状态切换 self.image
或 self.direction
个属性。
尝试添加如下内容:
elif event.key == pygame.K_RIGHT:
pig.image = pygame.transform.flip(pig.image, True, False)
pygame.display.update()'''I dont think you need this'''
elif event.key == pygame.K_LEFT:
pig.image = pygame.transform.flip(pig.image, True, False)
pygame.display.update()'''Or this'''
添加猪的方向变量。将其设置为按下键,不要将其更改回键上。让移动依赖于 moving_direction 变量,显示的精灵依赖于方向变量。
像这样改变 blitme:
def blitme(self):
if self.orientation == "Right":
self.screen.blit(self.image, self.rect)
elif self.orientation == "Left":
self.screen.blit(pygame.transform.flip(self.image, False, True), self.rect)
然后你可以像这样拥有你的按键逻辑:
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
pig.orientation = "Right"
elif event.key == pygame.K_LEFT:
pig.moving_left = True
pig.orientation = "Left"
elif event.key == pygame.K_UP:
pig.moving_up = True
elif event.key == pygame.K_DOWN:
pig.moving_down = True
这样就可以把显示逻辑和移动逻辑分开了。
这是在 pygame。我如何翻转图像(比方说一个图像 猪向右看)向左看时 我按向左箭头键,然后保持原样 即使我不按任何键或按向上和向下箭头键。那么当我按下向右箭头键时,如何再次将它切换回向右看,即使我不按任何键或按下向上和向下箭头键,它仍然保持这种状态。
我知道我必须使用 pygame.transform.flip()。但是,我不知道如何将它放入我的代码中。
这是主游戏:
import sys
import pygame
from pig import Pig
pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Flying Pig")
blue_sky = 135, 206, 250
brown = 139, 69, 19
pig = Pig(screen)
while True:
# Accept events
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# Keydown events
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
elif event.key == pygame.K_LEFT:
pig.moving_left = True
elif event.key == pygame.K_UP:
pig.moving_up = True
elif event.key == pygame.K_DOWN:
pig.moving_down = True
# Keyup events
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
pig.moving_right = False
elif event.key == pygame.K_LEFT:
pig.moving_left = False
elif event.key == pygame.K_UP:
pig.moving_up = False
elif event.key == pygame.K_DOWN:
pig.moving_down = False
screen.fill(blue_sky)
pig.blitme()
pig.update()
pygame.display.flip()
猪class:(这是缩进的。我只是不知道如何在此处正确复制和粘贴我的代码)
import pygame
class Pig():
def __init__(self, screen):
"""Initialize the pig and set its starting position."""
self.screen = screen
# Load the pig image and set pig and screen to rect.
self.image = pygame.image.load('pig.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# Start the pig at the bottom center of the screen.
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# Speed of the pig
self.pig_speed = 1.5
self.center = float(self.pig_speed)
# Set a variable for each movement.
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
self.direction = ['right', 'left']
def update(self):
"""Update the position of the pig."""
if self.rect.right <= self.screen_rect.right:
if self.moving_right:
self.rect.centerx += self.pig_speed
if self.rect.left > 0:
if self.moving_left:
self.rect.centerx -= self.pig_speed
if self.rect.top > 0:
if self.moving_up:
self.rect.bottom -= self.pig_speed
if self.rect.bottom <= self.screen_rect.bottom:
if self.moving_down:
self.rect.bottom += self.pig_speed
def blitme(self):
"""Draw the pig at its current location."""
self.screen.blit(self.image, self.rect)
pygame.transform.flip
接受三个参数:
- 你要翻转的surface个
- 一个布尔值,表示表面应该水平翻转
- 一个布尔值,表示表面应该垂直翻转
要仅垂直翻转表面,将 True
作为第三个参数传递:
flipped_surface = pygame.transform.flip(surface, False, True)
关于你的具体问题,你可以这样做:
PIG_RIGHT = pygame.image.load('pig.png').convert()
PIG_LEFT = pygame.transform.flip(PIG_RIGHT, True, False)
pig = Pig(screen, PIG_RIGHT) # Assign this image to `self.image`.
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
pig.image = PIG_RIGHT
elif event.key == pygame.K_LEFT:
pig.moving_left = True
pig.image = PIG_LEFT
screen.fill(blue_sky)
pig.blitme()
pig.update()
pygame.display.flip()
clock.tick(30)
您还可以将两个表面存储在 Pig
class 中,并根据 self.moving_right
、self.moving_left
的状态切换 self.image
或 self.direction
个属性。
尝试添加如下内容:
elif event.key == pygame.K_RIGHT:
pig.image = pygame.transform.flip(pig.image, True, False)
pygame.display.update()'''I dont think you need this'''
elif event.key == pygame.K_LEFT:
pig.image = pygame.transform.flip(pig.image, True, False)
pygame.display.update()'''Or this'''
添加猪的方向变量。将其设置为按下键,不要将其更改回键上。让移动依赖于 moving_direction 变量,显示的精灵依赖于方向变量。
像这样改变 blitme:
def blitme(self):
if self.orientation == "Right":
self.screen.blit(self.image, self.rect)
elif self.orientation == "Left":
self.screen.blit(pygame.transform.flip(self.image, False, True), self.rect)
然后你可以像这样拥有你的按键逻辑:
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
pig.moving_right = True
pig.orientation = "Right"
elif event.key == pygame.K_LEFT:
pig.moving_left = True
pig.orientation = "Left"
elif event.key == pygame.K_UP:
pig.moving_up = True
elif event.key == pygame.K_DOWN:
pig.moving_down = True
这样就可以把显示逻辑和移动逻辑分开了。