Почему скорость платформы меняется, когда игрок приземляется на нее? - PullRequest
1 голос
/ 26 мая 2020

Я создаю базовую c платформенную систему. Когда игрок ударяется о платформу, я хочу, чтобы скорость игрока была установлена ​​равной скорости платформы. Однако скорость платформы изменяется при ее приземлении, что было проверено моими операторами печати, несмотря на то, что скорость платформы не изменялась явно через код (насколько я понимаю). Я включил весь исходный код, так как не уверен, где и как изменяется скорость платформы.

Кажется, что скорость платформы изменяется, когда игрок пересекает ее, и скорость игроков изменяется, например, между операторами печати «1» и «2».

import pygame
import numpy as np
import random

class player:
    def __init__(self,position,velocity):
        self.position=position
        self.velocity=velocity

    def updatepos(self):
        self.position+=self.velocity

    def draw(self):
        self.updatepos()
        pygame.draw.rect(screen,(255,0,0),(self.position[0],self.position[1]-20,20,20))

class platform:
    def __init__(self,position,length,velocity):
        self.position=position
        self.length=length
        self.velocity=velocity

    def updatepos(self):
        self.position += self.velocity

    def draw(self):
        pygame.draw.rect(screen, (0, 0, 255), (self.position[0], self.position[1], self.length, 5))


width, height= 800,600
screen=pygame.display.set_mode((width,height))

player=player(np.array([100.0,100.0]),np.array([0.0,0.0]))

platforms=[ platform( np.array([100.0,200.0]), 100, np.array([1.0,1.0]) ) ]
#for _ in range(1):
    #platforms+=[platform( np.array( [float(random.randrange(0,800)),float(random.randrange(0,800))]), 50.0, np.array( [float(random.randrange(0,3)),float(random.randrange(0,3))] ))]


wpress=False
apress=False
dpress=False

#main loop
running=True
while running:

    #gravity
    print(str(platforms[0].velocity)+" 1")
    player.velocity+=np.array([0.0,0.5])
    print(str(platforms[0].velocity)+" 2")

    #checking intersections
    startline = player.position
    endline = player.position+player.velocity

    direction=endline-startline

    grounded=False
    for _ in range(len(platforms)):
        if startline[1] <= platforms[_].position[1] and endline[1] >= platforms[_].position[1]:

            scalar= (platforms[_].position[1] - startline[1]) / direction[1]

            x=startline[0]+direction[0]*scalar
            y=platforms[_].position[1]

            if platforms[_].position[0]-20 < x < platforms[_].position[0] + platforms[_].length:

                player.position = np.array( [x,y] )

                player.velocity=platforms[_].velocity

                grounded=True
                break

    #drawing on screen
    for _ in range(len(platforms)):
        platforms[_].position+=platforms[_].velocity
        platforms[_].draw()

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

        elif event.type == pygame.KEYDOWN:

            if event.key == pygame.K_w:
                if grounded:
                    print(str(platforms[0].velocity) + " 21")
                    player.velocity[1]= -8.0
                    print(str(platforms[0].velocity) + " 22")

            elif event.key == pygame.K_a:
                apress=True

            elif event.key == pygame.K_d:
                dpress=True

            elif event.key == pygame.K_SPACE:

                player.position=np.array([100.0,100.0])
                player.velocity=np.array([0.0,0.0])

                platforms=[]
                for _ in range(60):
                    platforms += [
                        platform(np.array([float(random.randrange(0, 800)), float(random.randrange(0, 800))]), 50.0,
                                 np.array([float(random.randrange(0, 3)), float(random.randrange(0, 3))]))]

        elif event.type == pygame.KEYUP:

            if event.key == pygame.K_a:
                apress = False
            elif event.key == pygame.K_d:
                dpress = False

        if apress and dpress or not (apress or dpress):
            print(str(platforms[0].velocity) + " 31")
            player.velocity[0] = 0
            print(str(platforms[0].velocity) + " 32")
        elif apress:
            print(str(platforms[0].velocity) + " 41")
            player.velocity[0]=-5.0
            print(str(platforms[0].velocity) + " 42")
        elif dpress:
            print(str(platforms[0].velocity) + " 51")
            player.velocity[0] = 5.0
            print(str(platforms[0].velocity) + " 52")


    player.draw()
    pygame.display.flip()

    clock = pygame.time.Clock()
    clock.tick(5)
    screen.fill((0,0,0))

1 Ответ

2 голосов
/ 26 мая 2020

Вы устанавливаете для игрока и платформы один и тот же массив для их скорости:

player.velocity=platforms[_].velocity

Поскольку это единственный массив, который имеет несколько объектов, указывающих на него, когда вы меняете его с помощью объекта player , он также изменяется для объекта platform.

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