1

コードをダウンロードするには、次のリンクをクリックしてください。

背景:

それで、私はパイゲームのチュートリアルを初めて使用したので、Eli Benderskyの有名なチュートリアルを見つけました。私はパート 1 を進めていて、「Social Cats」にすることで自分のセンスを追加しようとしていました。猫たちは歩き回り、お互いに触れ合うとお互いに草を食み、別々の道を進みます。言い換えれば、エリが持っていたものと同じですが、衝突検出と新しいスプライトがありました. これは良い習慣になると思います。過去数日間、衝突検出と、さまざまな人がそれを行う方法を調査してきましたが、私のシナリオまたは同様のもので機能するものをまだ見ていません. 自分がコミュニティの中でいかに小さいかを理解し始めています。

目的:

最終的には、猫が別の猫にぶつかったときに、衝突した猫が現在の方向よりも 45 度小さいか大きいランダムな方向に消えるようにしようとしています。

問題:

私は vec2d をインポートしており、Cat クラスとメインを持っています。後で何が起こっているかを監視する GameManager クラスを作成するので、メインで衝突検出を行いたいと思います。OOPによると、とにかく猫はお互いのことを知らないはずです. 衝突検出を機能させるのに問題がありました。私はいくつかの異なる方法を試しました。どちらの方法でも、互いに接触しても何も起こりません。自分がやりたいことは、自分が認識しているよりもはるかに複雑だという印象を受けています。どうやってこれを台無しにしていますか?この一面で十分な時間を無駄にしたような気がします。もちろん、それは学習プロセスです。考え?

方法 1:

    mainWindow.fill(_white_)
    for cat in cats:
        cat.update(timePassed)
        cat.blitme()
        catsCollided = pg.sprite.spritecollide(cat, catGroup, True)
        print pg.sprite.spritecollide(cat, catGroup, False)

    for cat in catsCollided:
        cat.currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45))   

方法 2:

    mainWindow.fill(_white_)
    for cat in cats:
        cat.update(timePassed)
        cat.blitme()
        print pg.sprite.spritecollide(cat, catGroup, False)


    tempCatList = list(cats)
    for catA in cats:
        tempCatList.remove(catA)
        for catB in cats:
            if catA.rect.colliderect(catB.rect):
                cats[cats.index(catA)].currentDirection.angle = randint(int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45))
4

1 に答える 1

1

最初の方法は正しいですが、いくつかのバグがあります。スプライト衝突はそれを行うための最良の方法です。まず第一に、スプライト衝突の 3 番目の引数を true にしたい状況はほとんどありません。コードがどのようにそれを行っているかを完全に誤解しない限り、True を使用したくないでしょう。True を指定すると、衝突時に両方のスプライトが自動的に削除されます。もう 1 つは、自己衝突を確実に除外する必要があることです。基本的に、スプライトが自分自身に衝突するスプライトを実行すると、自分自身との衝突が登録されます。コードに関する最後の 1 つの点は、randint セレクターが機能する可能性がありますが (返される内容をテストしたい場合があります)、random.choice() が探しているものにより適しているということです。これらの変更が実装されると、次のようになります。

mainWindow.fill(_white_)
for cat in cats:
    cat.update(timePassed)
    cat.blitme()
    catsCollided = pg.sprite.spritecollide(cat, catGroup, False)   #False makes it so colliding sprites are not deleted
    print pg.sprite.spritecollide(cat, catGroup, False)

for cat in catsCollided:                                           #by the way although this is perfectly fine code, the repetition of the cat variable could be confusing
    if cat != self:                                                #checks that this is not a self collision
        cat.currentDirection.angle = random.choice([int(cat.currentDirection.angle - 45), int(cat.currentDirection.angle + 45])
于 2013-11-23T23:30:23.997 に答える