Mam klasę piłki i dwa takie przypadkiklasa. W klasie jest metoda kierunkowa, która wyjątkowo przyspiesza piłkę w górę w lewo lub w prawo, w zależności od naciśniętych klawiszy strzałek. Teraz moim problemem jest to, że za pomocą klawiszy strzałek można kontrolować tylko piłkę w pierwszej instancji. Jak to możliwe, że dwa wystąpienia tej samej klasy zachowują się inaczej? Co powinienem zmienić, aby móc kontrolować obie piłki? Wolę zachować kontrolę nad piłkami w klasie.
oto mój kod:
import pygame, sys
pygame.init()
red = (255,0,0)
black = (0,0,0)
white = (255,255,255)
blue = (0,0,255)
green = (0,255,0)
pygame.mouse.set_visible(0)
clock = pygame.time.Clock()
displaySize = (800,600)
screen = pygame.display.set_mode(displaySize)
g = 50
dt = 0.05
Cd = 0.01
m = 5
class ball:
def __init__(self, x, y, vx, vy, r,ax,ay, color):
self.Fx = 0
self.Fy = 0
self.Dx = 0
self.Dy = 0
self.ay = ay
self.ax = ax
self.x = x
self.y = y
self.r = r
self.color = color
self.vx = vx
self.vy = vy
def update(self):
self.x, self.y = self.physics()
pygame.draw.circle(screen, self.color, (int(round(self.x)),int(round(self.y))), self.r)
def directions(self):
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
self.ay +=-1000
if event.key == pygame.K_LEFT:
self.ax += -1000
if event.key == pygame.K_RIGHT:
self.ax += 1000
def physics(self):
self.Dy = Cd*self.vy*abs(self.vy)
self.Dx = Cd*self.vx*abs(self.vx)
self.Fy = m*g - self.Dy
self.Fx = -self.Dx
self.ay = self.Fy/m
self.ax = self.Fx/m
self.directions()
self.vy += self.ay*dt
self.vx += self.ax*dt
self.x +=self.vx*dt
self.y +=self.vy*dt
if self.x <= self.r:
self.x =self.r
self.vx *= -0.7
if self.x >= displaySize[0]- self.r:
self.x = displaySize[0] - self.r
self.vx *= -0.7
if self.y <= self.r:
self.y = self.r
self.vy *= -0.7
if self.y >= displaySize[1] - self.r:
self.y = displaySize[1] - self.r
self.vy *= -0.7
return self.x, self.y
ballOne = ball(100,100,50,-100,30,0,0,red)
ballTwo = ball(500,500,-75,0,45,0,0,green)
while 1:
clock.tick(60)
screen.fill(blue)
ballOne.update()
ballTwo.update()
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
Odpowiedzi:
2 dla odpowiedzi № 1Niezbyt dobrze zaznajomiony pygame
, ale z dokumentacja Powiedziałbym, że problem polega na tym, że twoja pierwsza kula opróżnia kolejkę zdarzeń, kiedy dzwonisz update()
.
Kolejka jest wtedy pusta podczas połączenia update()
na drugą piłkę, więc nie porusza się, ponieważ nie ma żadnych wydarzeń, które mogłyby nakazać jej ruch.
Ten sam problem z warunkiem wyjścia. Powiedziałbym, że nigdy nie ma odpowiedniego zdarzenia w kolejce po osiągnięciu tego punktu w kodzie.
Szybkim rozwiązaniem byłoby wykonanie całego przetwarzania zdarzeń w głównej pętli (gdzie sprawdzasz warunek wyjścia) i zmiana piłek tak, abyś tylko poinformował ich o danych wejściowych gracza.
def playerinput(self, key):
if key == pygame.K_UP:
self.ay += -1000
...
W głównej pętli, zakładając, że wszystkie twoje piłki znajdują się na liście playerobjects
:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
for player in playerobjects:
player.playerinput(event.key)