1

プログラミングは科目として学校に導入されたばかりで、助けが必要なため、私はプログラミングに非常に慣れていません。私は、3 つのボール (長方形の画像) が画面上で跳ね返ったり、互いに離れたりするアニメーションを作成するタスクを与えられました。3 つのボールと壁の跳ね返りはすべてうまくいっていますが、それらを互いに跳ね返す方法がわかりません。私の現在のコードは次のとおりです。

import pygame
import random
import sys

if __name__ =='__main__':

    ball_image1 = 'beachball1.jpg'
    ball_image2 = 'beachball2.jpg'
    ball_image3 = 'beachball3.jpg'
    bounce_sound = 'thump.wav'
    width = 800
    top = 600
    x = 0
    y = 0
    background_colour = 0,0,0
    caption= 'Bouncing Ball animation'
    velocity1 = [-1,-1]
    velocity2 = [-1,1]
    velocity3 = [1,-1]
    pygame.init ()
    frame = pygame.display.set_mode ((width, top))
    pygame.display.set_caption (caption)
    ball1= pygame.image.load (ball_image1). convert()
    ball2= pygame.image.load (ball_image2). convert()
    ball3= pygame.image.load (ball_image3). convert()
    ball_boundary_1 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
    ball_boundary_2 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
    ball_boundary_3 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550)))
    sound = pygame.mixer.Sound (bounce_sound)
    while True:
        for event in pygame.event.get():
            print event 
            if event.type == pygame.QUIT: sys.exit(0)
        if ball_boundary_1.left < 0 or ball_boundary_1.right > width:
            sound.play()
            velocity1[0] = -velocity1[0]
        if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top:
            sound.play()
            velocity1[1] = -velocity1[1]
        if ball_boundary_2.left < 0 or ball_boundary_2.right > width:
            sound.play()
            velocity2[0] = -velocity2[0]
        if ball_boundary_2.top < 0 or ball_boundary_2.bottom > top:
            sound.play()
            velocity2[1] = -velocity2[1]
        if ball_boundary_3.left < 0 or ball_boundary_3.right > width:
            sound.play()
            velocity3[0] = -velocity3[0]
        if ball_boundary_3.top < 0 or ball_boundary_3.bottom > top:
            sound.play()
            velocity3[1] = -velocity3[1]

        ball_boundary_1 = ball_boundary_1.move (velocity1)
        ball_boundary_2 = ball_boundary_2.move (velocity2)
        ball_boundary_3 = ball_boundary_3.move (velocity3)
        frame.fill (background_colour)
        frame.blit (ball1, ball_boundary_1)
        frame.blit (ball2, ball_boundary_2)
        frame.blit (ball3, ball_boundary_3)
        pygame.display.flip() 
4

3 に答える 3

3

2 つのオブジェクトが「衝突」すると、それらは基本的に同じ物理空間に存在するため、これを確認する必要があります。2D では、これは特に長方形の場合に便利で簡単です。基本的に、2 つのボールが衝突した場合に真の値を返す「overlap」という関数を作成します。例えば:

for (i = 0; i < numberOfBalls; i++) {
    for (j = i+1; j < numberOfBalls; j++) {
        if (overlap (ball_rect[i], ball_rect[j])) {
            // you will need to write this reverse velocity code differently
            // to comply with the code above but I recommend that the balls 
            // go in an array with three elements so that you can index 
            // them. (Useful in for loops as seen above)
            ball_xvelocity[i] *= -1;
            ball_xvelocity[j] *= -1;
            ball_yvelocity[i] *= -1;
            ball_yvelocity[j] *= -1;
        }
    }
}

オーバーラップ機能はあなたに任せますが、「rectangluar 衝突検出」をグーグルで検索すると、その方法がわかります。それほど怖くはないことがわかり、プログラミングの概念を調べて学ぶことができるという確信が持てるようになります。

NB 具体的には python コードを提供しませんでした。宿題なので、答えを書くのはあなたの仕事です。申し訳ありませんが、単なる SO ポリシーです。お役に立てれば。:)

于 2009-04-25T14:02:19.750 に答える
1

私の講師がこれに関する私の特定の評価に付け加えたように、

2 番目のボールがフレームの周りを跳ね回ったら、衝突した場合にボールの方向を変更するコードを追加します。PyGame は、2 つの Rect オブジェクト間で衝突が発生したかどうかを検出できる関数を提供します。この関数は、colliderect という名前で、次の方法で呼び出されます。2 つの Rect オブジェクトの名前が ball_boundary_1 と ball_boundary_2 の場合、次のように衝突をチェックできます。

if ball_boundary_1.colliderect(ball_boundary_2):

    # alter the direction of the balls with the usual method

したがって、これは、衝突が発生したかどうかを確認し、True を返し、速度を逆転させるコードを実行するために使用されます。幸運を祈ります:DI はまだこのビットを実際に行ったことはありません。

于 2010-04-07T09:22:54.687 に答える
1

実際には、提供するコードにいくつかの手がかりがあります。ボールが壁でバウンドするかどうかを検出する方法は、ボールの上部境界が 0 未満であるかどうかを確認することです。つまり、ボールが上部境界に触れており、方向を変えるためにバウンドする必要があることを意味します。

だからコード:

if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top:
        sound.play()
        velocity1[1] = -velocity1[1]

床や天井で弾むと、基本的にボールの上下運動に変わります。

したがって、これを変更するには、2 つのボールが互いに跳ね返るとはどういう意味かを自問する必要があります。これは、さまざまな方法でボールの境界が重なり合っていることを意味します。したがって、たとえば、ボール 1 の左または右のいずれかがボール 2 の水平寸法の内側にあり、ボール 1 の上部または下部がボール 2 の垂直寸法の内側にあるかどうかを確認できます。2 つのボールが接触しているので、両方の速度を変更します。ボール。

于 2009-04-25T14:06:40.097 に答える