私は C プログラマーですが、自分のプロジェクトのいくつかを Python でプロトタイピングしたいと考えています。メインモジュールはすべて機能しているため、selfまたは反復の使用に問題があると思います。
CBallSpawner:
from CBullet import Bullet
class BulletSpawner:
def __init__(self, count, position, color, radius, speed):
self.bull = []
self.cnt = count
self.speed = speed
self.freeze = False
self.acc = 0
self.position = position
self.createBullets(color, radius)
def createBullets(self, color, radius):
for i in range(1, self.cnt + 1):
self.bull.append(Bullet(radius, 0, color, i*(360.0/self.cnt), self.speed, self.position))
def speedUp(self, delta):
self.acc += delta
if self.acc > 1000 and not self.freeze:
self.speed += 0.1
for b in self.bull:
b.speed = self.speed
self.acc = 0
def tick(self, delta, w, h, window):
self.speedUp(delta)
for e in self.bull:
e.tick(delta, w, h)
def draw(self, window):
for c in self.bull:
window.draw(c.bullet_object)
オブジェクトは作成されますが、最初の位置で動かなくなります。ブル内のオブジェクトの場所をデバッグすると、変更されません。デルタが十分に高い場合、弾丸はランダムに動くように見えます。
主に私が呼ぶ
spawner = BulletSpawner(10, sf.Vector2(w/2, h/2), sf.Color.WHITE, 5, 0.16)
spawner.tick(delta, w, h, window)
spawner.draw(window)
Bullet クラスとまったく同じイテレーションがメイン モジュールで正常に動作していますが、これを BulletSpawner クラスに外注したため、Bullet が適切に動作しなくなりました。アドバイスありがとうございます E: Bullet の重要な部分は、それ自体で完全に機能しています
class Bullet:
def __init__(self, radius, outline, color, phi, speed, position):
self.phi = 0
self.speed = speed
self.bullet_object = sf.CircleShape()
self.position = sf.Vector2()
self.bounding_pos = sf.Vector2()
self.motion = sf.Vector2()
self.bounding = sf.Rectangle()
self.bullet_object.outline_thickness = outline
self.bullet_object.fill_color = color
self.bullet_object.origin = (radius, radius)
self.bullet_object.radius = radius
self.bounding.size = sf.Vector2(radius*2,radius*2)
self.bounding.position = self.position - (self.bounding.size/2)
self.position = position
self.phi = phi
self.calulateMotion()
def calulateMotion(self):
self.motion.x = math.cos(self.phi * (math.pi / 180))
self.motion.y = math.sin(self.phi * (math.pi / 180))
def tick(self, delta, w, h):
tmp = sf.Vector2(0, 0)
tmp.x = self.position.x + (self.motion.x * (self.speed * delta))
tmp.y = self.position.y + (self.motion.y * (self.speed * delta))
if tmp.x < 0 or tmp.x > w:
self.motion.x = -self.motion.x
self.bullet_object.fill_color = sf.Color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
if tmp.y < 0 or tmp.y > h:
self.motion.y = -self.motion.y
self.bullet_object.fill_color = sf.Color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
self.position.x += self.motion.x * (self.speed * delta)
self.position.y += self.motion.y * (self.speed * delta)
self.bullet_object.position = self.position
self.bounding.position = self.position - (self.bounding.size/2)
編集: 1つの弾丸でスポナーオブジェクトを作成するだけで十分です:
spawner = BulletSpawner(1, sf.Vector2(w/2, h/2), sf.Color.WHITE, 5, 0.16)
弾丸は正しく動いています