Я создаю базовую 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))