К сожалению, мой итальянский ограничен, но мое понимание кода вопроса заключается в том, что у объекта должен быть путь движения lista_ost
, который содержит набор координат, которые управляют движениями объектов на экране. (Надеюсь, это правильно!)
Как сказал @Eric в комментарии, простой способ обработки экранных объектов - это PyGame sprite , а если их несколько, используйте sprite group .
Таким образом, в приведенном ниже примере кода код создает группу из EnemySprite
объектов. Они сделаны с изображением на экране и move_path
. move_path
- это список настроек координат спрайта. Каждый раз, когда вызывается функция спрайта EnemySprite.update()
, обновление координаты next применяется к текущей позиции sprite.rect
(которая в конечном итоге является экранным спрайтом [x,y]
). Когда весь список координат используется, он снова начинается с первого элемента.
Это позволяет нам указать спрайту путь, по которому нужно следовать на экране. Чтобы сделать быстрый путь перемещения для вставки в программу, этот код отслеживает мышь, а затем выводит список относительных координат при выходе. Чтобы сделать петлеобразный путь, используемый в примере, я просто перетащил цикл через окно с помощью мыши, а затем отредактировал его в коде. Конечно, я мог бы сделать путь вручную на миллиметровке.
import pygame
import random
# Window size
WINDOW_WIDTH = 400
WINDOW_HEIGHT = 400
SPACE_BLUE = ( 23, 55, 84)
# Global millisecond count since start
NOW_MS = 0
class EnemySprite( pygame.sprite.Sprite ):
def __init__( self, image, move_path = [ (1, 1) ] ):
pygame.sprite.Sprite.__init__( self )
self.image = image
self.rect = self.image.get_rect()
self.path = move_path
self.path_index = 0
# Start position is randomly across the screen, and a little off the top
self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), random.randrange( 0, WINDOW_HEIGHT ) )
def wrapAroundScreen(self):
""" Ensure the sprite's position remains on-screen,
wrapping around if necessary """
if (self.rect.left >= WINDOW_WIDTH ):
self.rect.right = 0
elif (self.rect.right <= 0 ):
self.rect.left = WINDOW_WIDTH
if (self.rect.top >= WINDOW_HEIGHT ):
self.rect.bottom = 0
elif (self.rect.bottom <= 0):
self.rect.top = WINDOW_HEIGHT
def update(self):
""" Move the sprite, by adjusting the poistion by the next
pair of offsets in the movement path """
x,y = self.rect.center # Where is the drop, right now
### Get the next movement offsets.
offset = self.path[ self.path_index ]
self.path_index += 1
### If we have run out of path offsets, start again
if ( self.path_index >= len( self.path ) ):
self.path_index = 0
self.rect.center = ( x + offset[0], y + offset[1] )
self.wrapAroundScreen()
### MAIN
pygame.init()
SURFACE = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), SURFACE )
pygame.display.set_caption( "Path Following" )
# Add some enemy sprites
LOOPY_PATH = [ (18,0), (15,0), (12,0), (13,0), (13,0), (12,-3), (14,-2), (11,-4), (7,-2), (8,-3), (9,-3), (9,-5), (9,-3), (9,-6), (9,-5), (10,-8), (9,-5), (9,-4), (8,-5), (4,-3), (5,-4), (2,-3), (1,-3), (0,-6), (2,-7), (1,-5), (1,-4), (0,-5), (0,-3), (-1,-4), (-2,-4), (-3,-4), (-5,-5), (-4,-4), (-4,-2), (-7,-3), (-7,-1), (-9,-1), (-11,0), (-9,0), (-8,0), (-5,1), (-5,3), (-5,3), (-5,4), (-4,4), (-5,4), (-3,7), (-1,6), (0,6), (0,6), (1,6), (3,5), (3,6), (4,7), (4,7), (7,8), (5,9), (7,6), (11,6), (14,7), (15,5), (16,4), (17,4), (18,2), (20,3), (18,2), (20,1), (20,0), (19,0), (23,0), (22,0), (12,0) ]
ENEMY_IMAGE = pygame.image.load( 'tiny_alien.png' )
SPRITES = pygame.sprite.Group()
for i in range(10):
SPRITES.add( EnemySprite( ENEMY_IMAGE, LOOPY_PATH ) )
mouse_path = []
clock = pygame.time.Clock()
done = False
while not done:
NOW_MS = pygame.time.get_ticks()
# re-position all the drops
SPRITES.update()
# Handle user-input
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
done = True
elif ( event.type == pygame.VIDEORESIZE ):
WINDOW_WIDTH = event.w
WINDOW_HEIGHT = event.h
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), SURFACE )
# Record mouse movements for new paths
new_pos = pygame.mouse.get_pos()
if ( new_pos != (0,0) ):
mouse_path.append( new_pos )
# Movement keys
keys = pygame.key.get_pressed()
if ( keys[pygame.K_UP] ):
print("up")
elif ( keys[pygame.K_DOWN] ):
print("down")
elif ( keys[pygame.K_LEFT] ):
print("left")
elif ( keys[pygame.K_RIGHT] ):
print("right")
elif ( keys[pygame.K_q] and ( keys[pygame.K_RCTRL] or keys[pygame.K_LCTRL] ) ):
print("^Q")
done = True
# Update the window, but not more than 60fps
WINDOW.fill( SPACE_BLUE )
SPRITES.draw( WINDOW )
pygame.display.flip()
# Limit FPS
clock.tick_busy_loop(60)
### Print the relative co-orinates of the mouse moving through the window
### just in case the user was recording a path to use on the sprites
print( "Mouse Movement Path: ")
print( "[", end='' )
for i in range(1, len(mouse_path)):
print("(%d,%d), " %( mouse_path[i][0] - mouse_path[i-1][0], mouse_path[i][1] - mouse_path[i-1][1]), end='')
print( " ]" )
pygame.quit()
В этом примере показано несколько странное движение, но, учитывая, что он следует за перетаскиванием мышью по окну, все в порядке.
Любое маленькое PNG-изображение можно заменить на tiny_alien.png
.
![animated jif of pygame window](https://i.stack.imgur.com/U5J2t.gif)