/ / Dlaczego dwa wystąpienia tej samej klasy zachowują się inaczej? - python, python-2.7, klasa, pygame, instancja

Jak to się dzieje, że dwa wystąpienia tej samej klasy zachowują się inaczej? - python, python-2.7, klasa, pygame, instancja

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 № 1

Niezbyt 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)