Похоже, код изначально создает один arrow
, который занимает позицию из прямоугольника steve
. Этот arrow
затем используется в качестве базовой позиции для создания новых стрелок при нажатии K_SPACE
.
Я думаю, что текущий прямоугольник steve
должен использоваться для создания новый экземпляр Arrow
, а не существующий экземпляр.
Например:
def check_keydown_events(event,steve,arrow,arrows):
""" """
if event.key == pygame.K_t:
sys.exit()
--snip--
elif event.key==pygame.K_SPACE and len(arrows)<=4:
#arrows.append( [arrow.center, arrow.rect.bottom, arrow.rect.left] )
arrows.append( [steve.center, steve.rect.top, steve.rect.right] )
Таким образом, новая стрелка всегда создается там, где steve
располагается теперь , а не позиционировано изначально.
Мне не понятно, почему при создании этого первого Arrow
меняется верх / низ и лево / право, но я изменил код для использования этого метода тоже.
Лично я бы изменил класс Arrow так, чтобы он принимал координаты x
и y
и скорость как простые параметры:
class Arrow():
""" """
def __init__( self, arrow_image, x_pos, y_pos, speed ):
self.image = arrow_image
self.rect = arrow_image.get_rect()
self.speed = speed
self.rect.centerx = x_pos
self.rect.centery = y_pos
def update( self ):
self.rect.centerx += self.speed
@staticmethod
def draw_arrow_set( screen, all_arrows ):
for a in all_arrows:
screen.blit( a.image, a.rect )
@staticmethod
def update_arrow_set( all_arrows, screen_rect ):
for a in all_arrows:
a.update()
if ( a.rect.centerx > screen_rect.right ):
all_arrows.remove( a ) # doesn't this cause problems?
Тогда это более гибкий:
if ( steve_facing_left ):
# facing left
x_start = steve.rect.x # start on Steve's left side
arrows.append( Arrow( left_arrow_image, x_start, steve.rect.centery, -1 ) )
else:
# facing right
x_start = steve.rect.x + steve.rect.width # start on Steve's right side
arrows.append( Arrow( right_arrow_image, x_start, steve.rect.centery, 1 ) )
А потом:
arrows.append( Arrow( super_arrow_image, x_start, y_start, 3 ) )