Создание препятствий, которые следуют за тем же правилом, перемещаются индивидуально - PullRequest
0 голосов
/ 31 марта 2019

Я пишу «простую» игру, и я не могу понять, как решить эту проблему, когда красные препятствия не могут пройти в одиночку от верхней части к нижней части экрана.Я включил как функцию (которая просто заставляет препятствия проходить через окно), так и фактическую часть, которую я использую (которая заставляет заграждения менять направление одновременно)

Я пытался в течение 2 часов, используя циклы for и while, но яЯ не могу решить это

lista_ost = [[some value for the x, some value for the y],[some value for the x, some value for the y]] 
def mov_ost(vel_ost,altezza,ost_grandezza,lista_ost):
    for i in lista_ost:
         i[1] += vel_ost
         if i[1] >= (altezza - ost_grandezza):
             vel_ost = -10

         elif i[1] <= 0:
             vel_ost = 10

while not game_over:

    numero_nemici(lista_ost, spazio_corsie, n_corsie)
    aggiungi_nemici(lista_ost)
    for ost_pos in lista_ost:
        ost_pos[1] += vel_ost
        if ost_pos[1] >= ((altezza - ost_grandezza)):
            vel_ost = -10

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

1 Ответ

0 голосов
/ 01 апреля 2019

К сожалению, мой итальянский ограничен, но мое понимание кода вопроса заключается в том, что у объекта должен быть путь движения 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

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