/ /どのように同じクラスの2つのインスタンスが異なって動作するのでしょうか? - Python、Python-2.7、クラス、Pygame、インスタンス

どのように同じクラスの2つのインスタンスが異なる動作をするのでしょうか? - Python、Python-2.7、クラス、Pygame、インスタンス

だからボールクラスとその2つのインスタンスがありますクラス。クラス内には、押された矢印キーに応じてボールを左または右に瞬時に加速する方向メソッドがあります。今私の問題は、最初のインスタンスのボールだけ矢印キーで制御することができますです。同じクラスの2つのインスタンスの動作がどう違うのでしょうか?私は両方のボールをコントロールできるように、私は何を変えるべきですか?私はクラス内のボールのコントロールを保持したいと思うことが好ましい。

ここに私のコードです:

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

回答:

回答№1は2

あまりよく知らない pygameしかし、 ドキュメンテーション 私は、問題が起きると、あなたが最初にボールを呼んだときにイベントキューを空にする update().

あなたが電話するとき、キューは空です update() 2番目のボールには、移動するように指示するイベントがないので、移動しません。

終了条件に同じ問題があります。コード内のそのポイントに到達すると、キューには適切なイベントが存在しません。

簡単な修正は、メインループ(終了条件をチェックする場所)ですべてのイベント処理を行い、ボールを変更してプレーヤーの入力を通知するだけです。

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

メインループでは、すべてのボールがリストにあると仮定します 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)