【问题标题】:How to flip an img in Pygame, having trouble in my code?如何在 Pygame 中翻转图像,在我的代码中遇到问题?
【发布时间】:2013-01-29 07:08:29
【问题描述】:

我在 pygame 中翻转精灵时遇到问题(我可以让它向右,但我希望 img 在左键上翻转),
我研究了如何翻转图像并找到了pygame.transform.flip,但作为 pygame 的初学者,我不知道如何使用它,而且这些教程对我来说没有意义。
任何人都可以帮我编写下面的代码(我不确定我是否将 self.img1 用于翻转)?

import pygame, sys, glob 
from pygame import *

class Player:
    def __init__(self):      
        self.x = 200     
        self.y = 300   
        self.ani_speed_init = 6
        self.ani_speed = self.ani_speed_init 
        self.ani = glob.glob("walk\Pinks_w*.png")
        self.ani.sort() 
        self.ani_pos = 0
        self.ani_max = len(self.ani)-1
        self.img = pygame.image.load(self.ani[0])
        self.img1 = pygame.transform.flip(self.ani[0], True, False)

        self.update(0)

    def update(self, pos):
        if pos != 0: 
            self.ani_speed-=1
            self.x+=pos
            if self.ani_speed == 0:
                self.img = pygame.image.load(self.ani[self.ani_pos])
                self.ani_speed = self.ani_speed_init
                if self.ani_pos == self.ani_max:
                    self.ani_pos = 0
                else:
                    self.ani_pos+=1
        screen.blit(self.img,(self.x,self.y))

h = 400
w = 800
screen = pygame.display.set_mode((w,h))
clock = pygame.time.Clock()
player1 = Player()
pos = 0

while True:
    screen.fill((0,0,0))
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == KEYDOWN and event.key == K_RIGHT:
            pos = 1
        elif event.type == KEYUP and event.key == K_RIGHT:
            pos = 0
        elif event.type == KEYDOWN and event.key == K_LEFT:
            pos = -1
        elif event.type == KEYUP and event.key == K_LEFT:
            pos = 0

    player1.update(pos)

    pygame.display.update()

【问题讨论】:

  • 您的代码 sn-p 比必要的要长得多。例如,您有包括键盘和定位功能,但这与您的问题无关。作为询问者,您有责任创建尽可能小且独立的代码 sn-p。
  • 您不想在每个游戏循环中都成为pygame.image.load()ing。在开始时执行一次。

标签: python image transform pygame flip


【解决方案1】:

要翻转,你会这样做:

# input
if event.type == KEYDOWN:
    if event.key == K_RIGHT:
        flip_x = True
    elif event.key == K_LEFT:
        flip_x = False
    elif event.key == K_UP:
        flip_y = True
    elif event.key == K_DOWN:
        flip_y = False

# then to flip
new_image = pygame.transform.flip(original_image, flip_x, flip_y)

【讨论】:

  • 语法无效,条件中必须使用==而不是=
【解决方案2】:

您的Player 类的可读性不是很好。因为,你的名字不容易理解。
在我的代码版本中,我只更改了名称,并且添加了对 pos 值的检查,并在需要时应用了翻转。因此,您可能需要更改检查(如果条件),以获得所需的结果。

是的,您没有pygame.Sprite,所以在这种情况下,sprite 这个词具有误导性。

你的Player类的我的版本:

class Player:
    def __init__(self):      
        self.x = 200  
        self.y = 300   
        self.speed_init = 6
        self.images = [pygame.image.load(img) for img in glob.glob("walk\Pinks_w*.png")]
        self.index = 0
        self.max_index = len(self.images)-1
        self.speed = 0
        self.img = self.images[self.index]

    def update(self, pos):
        if pos != 0:
            self.speed -= 1
            self.x += pos
            if not self.speed:
                self.speed = self.speed_init
                if self.index < self.max_index:
                    self.index += 1
                else:
                    self.index = 0
            self.img = self.images[self.index]
        # change True to False if needed, or change the operator.
        if pos > 0:
            self.img = pygame.transform.flip(self.img,True,False)
        screen.blit(self.img,(self.x,self.y))

更新
update 函数有一个小问题。问题是,由于速度总是恒定的,而不是0if not self.speed: 不起作用。因此,将update 函数更改为:

def update(self, pos):
    if pos != 0:
        self.speed -= 1
        self.x += pos
        # no more self.speed checks
        if self.index < self.max_index:
            self.index += 1
        else:
            self.index = 0
        self.img = self.images[self.index]
    # change True to False if needed, or change the operator.
    if pos < 0:
        self.img = pygame.transform.flip(self.img,True,False)
    screen.blit(self.img,(self.x,self.y))

更新 2
您的代码中似乎存在某种错字,
这是(我的版本)代码,整个事情。

import pygame, sys, glob 
from pygame import *

class Player:
    def __init__(self):      
        self.x = 200  
        self.y = 300   
        self.speed_init = 6
        self.images = [pygame.image.load(img) for img in glob.glob("walk\Pinks_w*.png")]
        self.index = 0
        self.max_index = len(self.images)-1
        self.speed = 0
        self.img = self.images[self.index]
        print self.max_index

    def update(self, pos):
        if pos != 0:
            self.speed -= 1
            self.x += pos
            print self.index, self.max_index
            if self.index < self.max_index:
                self.index += 1
            else:
                self.index = 0
            self.img = self.images[self.index]
        # change True to False if needed, or change the operator.
        if pos < 0:
            self.img = pygame.transform.flip(self.img,True,False)
        screen.blit(self.img,(self.x,self.y))

h = 400
w = 800
screen = pygame.display.set_mode((w,h))
clock = pygame.time.Clock()
player1 = Player()
pos = 0

while True:
    screen.fill((0,0,0))
    clock.tick(20)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == KEYDOWN and event.key == K_RIGHT:
            pos = 2
        elif event.type == KEYUP and event.key == K_RIGHT:
            pos = 0
        elif event.type == KEYDOWN and event.key == K_LEFT:
            pos = -2
        elif event.type == KEYUP and event.key == K_LEFT:
            pos = 0

    player1.update(pos)

    pygame.display.update()

【讨论】:

  • 感谢您对代码的帮助,它运行良好,但它不会像以前那样循环浏览图像(当我使用 self.ani = glob.glob("walk\Pinks_w *.png")。我有一系列名为 Pinks_w1 到 w4 的四个 img(以呈现行走的外观),但当我插入“self.images = [pygame.image.load(img ) for img in glob.glob("walk\Pinks*.png")]" 有人对如何纠正这个问题有任何建议吗?谢谢。
  • 当我插入编辑后的更新函数时,它返回了一个错误,即 属性错误中的第 58 行:播放器实例没有属性“更新”。我不确定这意味着什么,因为我在第 58 行有“player1.update(pos)”?
  • 感谢您帮助我,但似乎仍有一些我无法修复的错误。尝试运行时终端显示两个。 player1 = Player() 中的第 35 行有一个回溯错误。第 13 行,在 init self.images[self.index] 索引错误:列表索引超出范围。也不确定在这里做什么?这将是最后一个问题,在我决定尝试从头开始重写代码以使其正常工作之前。
  • 我把整个代码复制粘贴了一遍,还是再次抛出上面的两个错误。
  • 您的图像未加载...检查您的文件名并尽可能使用绝对路径...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2021-12-30
相关资源
最近更新 更多