Создание объекта противника с использованием класса не работает должным образом; по какой-то причине они не отображаются на экране? - PullRequest
1 голос
/ 27 апреля 2019

Итак, некоторое время назад я узнал, как создать класс, для которого нужно было создать «оппонента», который будет в основном сражаться с игроком и т. Д. Это было хорошее руководство, и в то время как я научился создавать этот тип класс, я также получил проблемы из самого кода при тестировании.

Одна из причин, по которой он не работал должным образом, заключалась в том, что я переворачивал спрайты по горизонтали; У меня есть 2 переменные спрайта, 1, которая загружает изображения, а другая, которая должна содержать список. Затем цикл «переворачивает» все изображения из оригинала и сохраняет его в пустом списке. Это, однако, вызвало проблему и начало заставлять мой спрайт «мигать» на экране в обоих направлениях, поэтому я удалил цикл, повторил попытку, и это сработало, но на этот раз у него был только один спрайт (обращенный влево). Я также попытался удалить переменные и цикл за пределами класса, но в итоге он вообще не отображал изображение.

#Goku Black
walkLeftGB = [ pygame.image.load("GB1.png"), pygame.image.load("GB2.png"), pygame.image.load("GB3.png"), pygame.image.load("GB4.png") ]
walkRightGB = []

for l in walkLeftGB:
    walkRightGB.append(pygame.transform.flip(l, True, False))

for x in range(len(walkLeftGB)):
    walkLeftGB[x] = pygame.transform.smoothscale(walkLeftGB[x], (372, 493))

for x in range(len(walkRightGB)):
    walkRightGB[x] = pygame.transform.smoothscale(walkRightGB[x], (372, 493))

# === CLASSES === (CamelCase names)

class Enemy(object):
    global vel
    global walkCount1
    global walkRightGB, walkLeftGB

    def __init__(self, x, y, width, height, end):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x, self.end]
        self.walkCount1 = 0
        self.vel = 3
        self.walkLeftGB = walkLeftGB
        self.walkRightGB = walkRightGB

    def draw(self, DS):
        self.move()
        global walkCount1
        if self.walkCount1 + 1 <= 33:
            self.walkCount1 = 0

        if self.vel > 0:
            DS.blit(self.walkRightGB[self.walkCount1 //4], (self.x, self.y))
            self.walkCount1 += 1
        else: 
            DS.blit(self.walkLeftGB[self.walkCount1 //4], (self.x, self.y))
            self.walkCount1 += 1


    def move(self):   
        global walkCount1
        if self.vel > 0:
            if self.x + self.vel < self.path[1]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkCount1 = 0
        else:
            if self.x - self.vel > self.path[0]:
                self.x += self.vel
            else:
                self.vel = self.vel * -1
                self.walkCount1 = 0


man = Enemy(1600, 407, 96, 136, 22)

def redrawGameWindow():
    global walkCount
    pygame.display.update()
    man.draw(DS)
    DS.blit(canyon,(0,0))
    lastMoved = "left"
    if walkCount + 1 >= 27:
        walkCount = 0
    if left:
        DS.blit(walkLeft[walkCount//3],(x,y))
        walkCount +=1
        lastMoved = "left"
    elif right:
        DS.blit(walkRight[walkCount//3], (x,y))
        walkCount +=1
        lastMoved = "right"
    else: #this is when its moving neither left or right
        if lastMoved == "left":
            DS.blit(char2, (x, y))
        else:
            DS.blit(char, (x, y))   

#The "redrawGameWindow" is then called in a loop inside a function.

После того, как я внес эти изменения, упомянутые выше, полученным выводом стало изображение, которое вообще не появлялось, я ожидал, что вывод изображения появится (и, возможно, переместится)

1 Ответ

1 голос
/ 28 апреля 2019

Это не похоже на то, что вы хотите:

        if self.walkCount1 + 1 <= 33:
            self.walkCount1 = 0

Как деталь, странно добавлять один и сравнивать с 33, когда достаточно if self.walkCount1 <= 32.

Что еще более важно, похоже, что вы хотели >= там.

У вас есть несколько жестко закодированных магических чисел делителей: // 3 и // 4. Скорее, чем, например. 4, было бы гораздо лучше обратитесь к len(self.walkRightGB). Затем вы можете вставить новые интерполированные изображения ходьбы, или удалить некоторые, не беспокоясь о правильности другой код, который может быть затронут. Числа, такие как 27, должны также быть выражены в более значимых терминах.

Мне не ясно, хотите ли вы // целочисленное деление. Возможно, вы искали % по модулю. Как написано, похоже, что есть опасность кода пытается получить доступ к концу массива изображения.

Распечатка отсчетов поможет вам отладить это, например, проверяя, что увеличенный счет сохраняется между вызовами функций.

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