1

pygame でスプライトを反転するのに問題があります (右に移動することはできますが、左キーで img を反転させたい)。
画像を反転する方法を調べて を見つけましたpygame.transform.flipが、pygame の初心者として、私は使い方がわからず、チュートリアルも意味がありません。
以下のコードを手伝ってくれる人はいますか?

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()
4

2 に答える 2

2

裏返すには、次のようにします。

# 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)
于 2013-02-14T00:16:24.857 に答える
1

あなたのPlayerクラスはあまり読みにくいです。として、あなたの名前は理解しにくいです。
あなたのコードの私のバージョンでは、私が変更したのは名前だけで、値のチェックを追加し、pos必要に応じてフリップを適用しました。そのため、目的の結果を得るには、チェック (if 条件) を変更する必要がある場合があります。

はい、あなたは を持っていないpygame.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。問題は、速度が常に一定で ではないため0、 がif 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()
于 2013-02-14T11:54:02.770 に答える