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ď č. 1Nie 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)