/ / Ako to, že existujú dva prípady tej istej triedy, ktoré sa správajú inak? - python, python-2.7, trieda, pygame, napríklad

Ako to, že existujú dve prípady tej istej triedy, ktoré sa správajú odlišne? - python, python-2.7, trieda, pygame, inštancia

Mám triedu loptičiek a dva príkladytrieda. V rámci triedy je smerová metóda, ktorá besaicky zrýchľuje loptu nahor doľava alebo doprava, v závislosti od stlačených klávesov so šípkami. Teraz je mojím problémom to, že pomocou šípok sa dá ovládať iba lopta prvého stupňa. Ako je možné, že sa dva prípady tej istej triedy správajú odlišne? Čo by som mal zmeniť, aby som mohol ovládať obe lopty? Radšej chcem udržať kontrolu nad loptičkami v triede.

tu je môj kód:

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

odpovede:

2 pre odpoveď č. 1

Nie je to celkom známe pygame, ale z internetu dokumentácia Povedal by som, že problém je v tom, že váš prvý loptu vyprázdni frontu udalostí, keď zavoláte update().

Keď zavoláte, fronta je prázdna update() na druhú loptu, takže sa nepohybuje, pretože neexistujú žiadne udalosti, ktoré by jej povedali, aby sa pohla.

Rovnaký problém s podmienkou ukončenia, aký by som povedal, vo fronte nikdy nie je vhodná udalosť, keď dosiahnete tento bod v kóde.

Rýchla oprava by spočívala v spracovaní všetkých udalostí vo vašej hlavnej slučke (kde kontrolujete stav ukončenia) a zmeňte gule tak, aby ste ich len informovali o vstupe hráča.

def playerinput(self, key):
if key == pygame.K_UP:
self.ay += -1000
...

Vo vašej hlavnej slučke predpokladajme, že všetky vaše lopty sú na zozname 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)