Как сделать так, чтобы мой Sprite появился в моем окне? - PullRequest
0 голосов
/ 25 апреля 2019

Я сделал вражеский спрайт в моей игре, однако он не отображается на экране.Мне интересно, как я смогу заставить его появиться?

Попытался обновить отображение pygame в классе, но оно все равно не будет показывать изображение.Я планирую сделать спрайт таким, чтобы он мог двигаться до конца линии сетки (по горизонтали), а затем сдвигаться вниз по вертикали, когда он достигает конца горизонтальной точки.

import pygame
pygame.init()

window = pygame.display.set_mode((650, 630))

pygame.display.set_caption("PeaShooters")

avatar = pygame.image.load('Sprite 1 Red.png')
background = pygame.image.load('Bg.jpg')
white = (255, 255, 255)

class player(object):
    def __init__(self, x, y, width, height, shots):
        self.x = 300
        self.y = 500
        self.width = 40
        self.height = 60
        self.vel = shots



def drawGrid():
    window.blit(background, (0,0))
    window.blit(avatar, (av.x, av.y))
    pygame.draw.line(window, white, [50,50], [50, 600], 5)
    pygame.draw.line(window, white, [50,50], [600, 50], 5)
    pygame.draw.line(window, white, [600,600], [600, 50], 5)
    pygame.draw.line(window, white, [50,600], [600, 600], 5)
    pygame.draw.line(window, white, [50,450], [600, 450], 5)
    for bullet in bullets:
        bullet.draw(window)
    pygame.display.update()


class shots(object):
    def __init__(self, x, y, radius, colour):
        self.x = x
        self.y = y
        self.radius = radius
        self.colour = colour
        self.vel = shots

    def draw(self, window):
        pygame.draw.circle(window, self.colour, (self.x,self.y), self.radius)

class enemy(object):
    enemy = pygame.image.load('Sprite 3 Red.png')
    pygame.display.update()

    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.vel = 4

    def draw(self,window):
        self.move()
        pass

    def move(self):
        pass

av = player(300, 500, 40, 60, 9)
bullets = []
running = True
while running:
    pygame.time.delay(100) 

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for bullet in bullets:
        if bullet.y < 600 and bullet.y > 70:
            bullet.y -= 8
        else:
            bullets.pop(bullets.index(bullet))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_w] and av.y > 440:
        av.y -= av.vel

    if keys[pygame.K_a] and av.x > 65:
        av.x -= av.vel

    if keys[pygame.K_s] and av.y < 535:
        av.y += av.vel

    if keys[pygame.K_d] and av.x < 530:
        av.x += av.vel

    if keys[pygame.K_SPACE]:
        if len(bullets) < 5:
            bullets.append(shots(round(av.x + av.width//2), round(av.y + av.height//2), 6, (0,0,0)))


    drawGrid()

window.blit(avatar, (x,y))

pygame.quit()

Я ожидаюаватар появится на экране, чтобы я мог его переместить.

1 Ответ

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

Все рисование должно выполняться в цикле while. Либо вы вызываете функцию window.blit непосредственно для различных спрайтов, либо заключаете ее в метод спрайта, который вызывается во время цикла (я вижу, у вас есть метод draw(), но сейчас он ничего не делает). Выберите один путь и следуйте этому. Я лично предпочитаю второй, он более объектно-ориентированный, но это мое мнение.
И не забудьте очистить предыдущую позицию, если хотите придать ощущение движения.
display.update() должен вызываться один раз за итерацию, обычно в конце, после того, как все спрайты были блит.

Ваш враг не появляется, потому что вы никогда не ослепляете его изображение. На самом деле, вы никогда не создаете врага, вы определили только класс. Поэтому сначала создайте врага, добавив строку, такую, что en = enemy(ex, ey, w, h, end). ex и ey здесь должны быть позиции противника на экране, выберите то, что вы предпочитаете. w и h ширина и высота изображения. end Я не знаю (ваш класс, вы добавили его, вы должны знать, какова его цель). Вы можете добавить эту строку сразу после создания avatar.
Затем удалите display.update() из класса и добавьте вызов window.blit(en, (en.x, en.y)) в цикл while. Или в drawGrid(), который на самом деле рисует все, а не только сетку.

Чтобы переместить противника, вы должны отредактировать его положение (en.x и en.y) в цикле while, как вы делаете это для аватара, но не в ответ на нажатие клавиши. Просто установите какой-то путь. На каждой итерации вражеские координаты должны меняться, чтобы следовать этому пути, что-то вроде en.x += en.vel или что-то еще Реальный путь может быть более сложным, но это зависит от вас. Логика такова: меняйте координаты противника на каждой итерации цикла.

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