Спрайт рисуется только тогда, когда он не движется, используя анимацию пиганима.Работает до сдачи на занятия - PullRequest
0 голосов
/ 13 декабря 2018

Я не восхищаюсь занятиями и пытаюсь понять, почему мой спрайт рисуется только тогда, когда я стою на месте. Я предполагаю, что это связано с тем, что у меня есть цикл for, который устанавливает изображенияк каждому из движений спрайта, но я не слишком уверен.Это работает, когда у меня есть код вне класса, но это бесполезно для меня, так как я хочу, чтобы в этом файле было более одного класса, и если у меня есть код animObjs вне класса (где он правильно анимируется), тогдаЯ не могу использовать его для других символов.

Вот код прямо сейчас:

# character.py

import pygame, pyganim, time, math
from colours import *
from pygame.math import Vector2
from settings import *

mainClock = pygame.time.Clock()
global player1

class Player(object):

def __init__(self, x, y, sprintMultiplier, fps):
    self.x = x
    self.y = y
    self.vel = 1/fps * 150
    self.pos = (self.x, self.y)
    self.animTypes = "walkUp walkLeft walkRight walkDown".split()
    self.animObjs = {}
    #self.imagesAndDurations = []

    self.width = self.height = 64

    self.direction = "DOWN"
    self.standing = True

    self.sprint = sprintMultiplier * self.vel
    self.sprintCounter = 0

    self.ammo = 5

    self.UP = "up"
    self.DOWN = "down"
    self.LEFT = "left"
    self.RIGHT = "right"

    self.upStanding = pygame.image.load("sprite/walk/player_walkUpStanding.png")
    self.leftStanding = pygame.image.load("sprite/walk/player_walkLeftStanding.png")
    self.rightStanding = pygame.image.load("sprite/walk/player_walkRightStanding.png")
    self.downStanding = pygame.image.load("sprite/walk/player_walkDownStanding.png")

    self.sprinting = self.moveUp = self.moveLeft = self.moveRight = self.moveDown = False

    self.moveConductor = pyganim.PygConductor(self.animObjs)


    for self.animType in self.animTypes:
        self.imagesAndDurations = [("sprite/walk/player_%s.%s.png" % (self.animType, str(num).rjust(3, "0")), 0.1) for num in
                              range(9)]
        self.animObjs[self.animType] = pyganim.PygAnimation(self.imagesAndDurations)

def draw(self, window):

    if self.moveUp or self.moveDown or self.moveRight or self.moveLeft:
        self.moveConductor.play()
        if self.direction == self.UP:
            self.animObjs["walkUp"].blit(window, (self.x, self.y))
        elif self.direction == self.DOWN:
            self.animObjs["walkDown"].blit(window, (self.x, self.y))
        elif self.direction == self.RIGHT:
            self.animObjs["walkRight"].blit(window, (self.x, self.y))
        elif self.direction == self.LEFT:
            self.animObjs["walkLeft"].blit(window, (self.x, self.y))

        if self.sprinting:
            rate = self.sprint
        else:
            rate = self.vel

        if self.moveUp:
            self.y -= rate
        if self.moveDown:
            self.y += rate
        if self.moveLeft:
            self.x -= rate
        if self.moveRight:
            self.x += rate

    elif not self.moveUp or self.moveDown or self.moveRight or self.moveLeft:
        self.moveConductor.stop()
        if self.direction == self.UP:
            window.blit(self.upStanding, (self.x, self.y))
        if self.direction == self.DOWN:
            window.blit(self.downStanding, (self.x, self.y))
        if self.direction == self.RIGHT:
            window.blit(self.rightStanding, (self.x, self.y))
        if self.direction == self.LEFT:
            window.blit(self.leftStanding, (self.x, self.y))

    if self.x < 0:
        self.x = 0
    if self.x > sWidth - self.width:
        self.x = sWidth - self.width
    if self.y < 0:
        self.y = 0
    if self.y > sHeight - self.width:
        self.y = sHeight - self.width

class Enemy(object):

pos = (20,20)

def __init__(self, fps, pos, difficulty):
    self.vel = 1/fps * 100 * difficulty

    self.animTypes = "walkUp walkLeft walkRight walkDown".split()
    self.animObjs = {}

    self.width = self.height = 64

    self.x = 20
    self.y = 20
    self.direction = "DOWN"
    self.standing = True

    self.UP = "up"
    self.DOWN = "down"
    self.LEFT = "left"
    self.RIGHT = "right"

    self.upStanding = pygame.image.load("enemy sprite/walk/enemyOrc1_standingUp.png")
    self.leftStanding = pygame.image.load("enemy sprite/walk/enemyOrc1_standingLeft.png")
    self.rightStanding = pygame.image.load("enemy sprite/walk/enemyOrc1_standingRight.png")
    self.downStanding = pygame.image.load("enemy sprite/walk/enemyOrc1_standingDown.png")

    self.sprinting = self.moveUp = self.moveDown = self.moveLeft = self.moveRight = False

    self.moveConductor = pyganim.PygConductor(self.animObjs)

    self.rect = self.downStanding.get_rect(center=pos)
    self.pos = Vector2(pos)

    self.heading = (0,0)


def draw(self, window):
    for self.animType in self.animTypes:
        self.imagesAndDurations = [("enemy sprite/walk/enemyOrc1_%s.%s.png" % (self.animType, str(num).rjust(3, "0")), 0.1) for num in
                              range(9)]
        self.animObjs[self.animType] = pyganim.PygAnimation(self.imagesAndDurations)

    if self.heading[0] > 0 or self.heading[0] < 0 or self.heading[1] > 0 or self.heading[1] < 0:
        self.moveConductor.play()
        if self.heading[0] > 0:
            self.moveRight = True
            self.direction = self.RIGHT
            self.animObjs["walkRight"].blit(window, (self.pos))
        elif self.heading[0] < 0:
            self.moveLeft = True
            self.direction = self.LEFT
            self.animObjs["walkLeft"].blit(window, (self.pos))
        elif self.heading[1] > 0:
            self.moveDown = True
            self.direction = self.DOWN
            self.animObjs["walkDown"].blit(window, (self.pos))
        elif self.heading[1] < 0:
            self.moveUp = True
            self.direction = self.UP
            self.animObjs["walkUp"].blit(window, (self.pos))

    else:
        self.moveConductor.stop()
        if self.direction == self.UP:
            window.blit(self.upStanding, (self.pos))
        if self.direction == self.DOWN:
            window.blit(self.downStanding, (self.pos))
        if self.direction == self.RIGHT:
            window.blit(self.rightStanding, (self.pos))
        if self.direction == self.LEFT:
            window.blit(self.leftStanding, (self.pos))

def moveTowardsPlayer(self, player):
    self.heading = player.pos - self.pos
    self.pos += self.heading * 0.01
    self.rect.center = self.pos

Я спрашиваю более конкретно о той части кода, которая включает

self.animTypes = "walkUp"
self.animObjs = {}
for self.animTypes in ...

, поскольку это та часть, которая, если я помещу ее вне класса, будет работать нормально, но если я включу ее в класс, то, когда спрайт перемещается, он не отображается.(то есть спрайт мигает только тогда, когда он стоит на месте)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...