Pygame, спрайт не появляется и даже не перемещается

Я пишу этот код, потому что хочу переместить спрайт с помощью стрелки. Думаю, ничего особенного.

Я потратил много времени на поиск руководств, которые показывают и перемещают простую картинку.

Ниже мой код:

Первая часть вполне стандартная, импортирует библиотеки и определяет характерное значение программы:

import sys
import pygame

pygame.init()

#refer value
border_X=800
border_Y=600
FPS=30
POS_X=300
POS_Y=300
INCREASE_X=0
INCREASE_Y=0

screen=pygame.display.set_mode((border_X,border_Y))
clock=pygame.time.Clock()

Здесь я определяю класс спрайта, возможно, вы неправильно поняли определение класса, возможно, я неправильно использовал rect.center.

class Ship(pygame.sprite.Sprite):
       image = pygame.image.load("fighter_0.png")
       image = image.convert_alpha()
       def __init__(self, X_INIT, Y_INIT):         
           super(Ship, self).__init__()
           self.image = Ship.image
           self.rect = self.image.get_rect()
           self.rect.center = (X_INIT, Y_INIT)
       def update(self,x,y):
           self.rect.center = (x,y)

Здесь я создаю группу спрайтов, возможно, это не обязательно для одного спрайта, но основная цель этой программы - обучение.

В любом случае я пытался отобразить спрайт, не создавая групповой «персонаж».

character = pygame.sprite.Group()
Ship.groups=character
ship=Ship(POS_X,POS_Y)
ship.add(character)

И, наконец, цикл цикла, возможно, есть ошибка в модальностях обновления

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:             
        if event.type == pygame.KEYUP:

        '''i've removed the if cycle of event.type 
           because it's long and unnecessary to 
           explain why the sprite doesn't appear'''  

    POS_X+=INCREASE_X
    POS_Y+=INCREASE_Y    
    ship.update(POS_X,POS_Y)
    clock.tick(FPS)
    #i've tried both, flip and update
    pygame.display.flip()
    pygame.display.update()

pygame.quit()

В случае, если я полностью просчитал модальности спрайта класса, может ли кто-нибудь объяснить, как установить для этой ситуации класс Ship?


person Ziru93    schedule 22.03.2017    source источник
comment
Где-то там вы должны вызвать метод рисования группы спрайтов. Итак, если ваша группа спрайтов является персонажем, вы должны вызвать character.draw (screen), чтобы нарисовать все спрайты в этой группе. В противном случае вам придется копировать каждое изображение индивидуально. Попробуйте вызвать его непосредственно перед display.flip ()   -  person oxrock    schedule 22.03.2017
comment
@oxrock, к сожалению, это ответ интерпретатора: [AttributeError: объект 'Корабль' не имеет атрибута 'draw']   -  person Ziru93    schedule 22.03.2017
comment
в вашем коде символ - это ваша группа спрайтов. Честно говоря, все ваши заявления напуганы. Попробуйте просто добавить свой корабль в группу персонажей, потому что похоже, что вы пытаетесь сделать это задом наперед. Итак, объявите группу спрайтов. создайте корабль, а затем просто добавьте корабль в группу. так: character = pygame.sprite.Group (), а затем ship = Ship (POS_X, POS_Y), затем просто character.add (ship). Теперь внизу перед display.flip () у вас должна быть возможность вызвать character.draw (screen), чтобы нарисовать ваш корабль (и все спрайты, содержащиеся внутри персонажа) на экране.   -  person oxrock    schedule 22.03.2017
comment
@oxrock, похоже, это работает, и я также решил проблему, чтобы удалить символ для обновления экрана, большое спасибо!   -  person Ziru93    schedule 22.03.2017
comment
нет проблем, удачного кодирования.   -  person oxrock    schedule 22.03.2017


Ответы (1)


Прочтите документацию.

pygame.sprite.Group.draw() и _ 2_ - это методы, предоставляемые pygame.sprite.Group.

Первый делегирует update методу содержащегося pygame.sprite.Sprites - вы должны реализовать метод. См. pygame.sprite.Group.update():

Вызывает метод update() для всех спрайтов в группе [...]

Последний использует атрибуты image и rect содержащихся pygame.sprite.Sprites для рисования объектов - вы должны убедиться, что pygame.sprite.Sprites имеют необходимые атрибуты. См. pygame.sprite.Group.draw():

Рисует содержащиеся спрайты в аргумент Surface. Здесь используется атрибут Sprite.image для исходной поверхности и Sprite.rect. [...]

Следовательно, вам нужно вызвать метод draw() из Group character:

while True:
    # [...]

    screen.fill((0, 0, 0))    

    character.draw(screen)

    pygame.display.flip()
    clock.tick(FPS)
person Rabbid76    schedule 23.12.2020