Почему мой объект-пигмей вибрирует, а не движется плавно? - PullRequest
0 голосов
/ 22 сентября 2018

Во-первых, я очень новичок в кодировании, поэтому, если мой код выглядит ужасно, вот почему

Я пытаюсь использовать PyGame для появления 10 шаров, которые появляются в случайных местах и ​​перемещаются в случайных векторах.Когда каждый шарик попадет на край экрана, он отскочит назад.

Проблема с кодом, который у меня есть ниже, состоит в том, что шары хорошо появляются, шары отскакивают от окна очень хорошо, но шары движутся только вдоль оси х (влево и вправо), новибрировать по оси Y (вверх и вниз).Я понятия не имею, почему это происходит.

Мой код выглядит следующим образом:

from random import randint, choice
import pygame
pygame.init()

## -- set constants
white = [255, 255, 255]
black = [0, 0, 0]
grey = [255/2, 255/2, 255/2]

ball_fill = white # colour of balls or circle objects
ball_line_colour = ball_fill # border and fill of same colour

n_balls = 10 # number of balls on a window
ball_radius = 12 # size of balls in pixels

velocity = vel = {
    "x": randint(-2, 3),
    "y": randint(-2, 3)
    } # must range from -a to +b; otherwise will only move rightward and upward

## -- set display window

win_width = 800 # pixels; width of screen
win_height = 600

## -- Define the boundaries, that is, the points at which the balls would bounce back without going out of the window

boundary_location = ['up', 'down', 'left', 'right']
boundary_coord = [ball_radius, (win_height - ball_radius),
                  ball_radius, (win_width - ball_radius)]

boundary = dict(zip(boundary_location, boundary_coord))

## -- Define balls
class Ball():
    def __init__(self):
        self.x = 0
        self.y = 0
        self.change_x = 0
        self.change_y = 0

def make_ball():
    """
    Function to make a new circle or ball
    """

    ball = Ball()
    # spawn points of balls, so that the balls do not overlap when they spawn

    x = randint(boundary["left"], boundary["right"])

    ball.x = choice([n for n in range(int(boundary["left"]), int(boundary["right"]))
        if n not in range(x - ball_radius, x + ball_radius)])

    y = randint(boundary["up"], boundary["down"])

    ball.y = choice([n for n in range(int(boundary["up"]), int(boundary["down"]))
        if n not in range(y - ball_radius, y + ball_radius)])

    # Speed and direction of rectangle

    ball.change_x = vel["x"]
    ball.change_y = vel["y"]

    return ball

# Set the height and width of the screen

win_dimen = [win_width, win_height]
win = pygame.display.set_mode(win_dimen)

pygame.display.set_caption("Multiple Object Tracking")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()

ball_list = []

for i in range(n_balls):
    ball = make_ball()
    ball_list.append(ball)
    i -= 1

# -------- Main Program Loop -----------
while not done:
    # --- Event Processing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
    # Space bar or esc to exit
            if event.key == pygame.K_SPACE or event.key == pygame.K_ESCAPE:
                done = True

    # --- Logic
    for ball in ball_list:
        # Move the ball's positions
        ball.x += ball.change_x
        ball.y += ball.change_y

        # Bounce the ball if needed
        if ball.y > boundary["up"] or ball.y < boundary["down"]:
            ball.change_y *= -1
        if ball.x > boundary["right"] or ball.x < boundary["left"]:
            ball.change_x *= -1

    # Set the screen background
    win.fill(grey)

    # Draw the balls
    for ball in ball_list:
        pygame.draw.circle(win, white, [ball.x, ball.y], ball_radius)

    clock.tick(60)

    # Update the screen
    pygame.display.flip()

# Close everything down
pygame.quit()

Мой следующий шаг - заставить шарики отскакивать друг от друга, если кому-то интересно

1 Ответ

0 голосов
/ 22 сентября 2018

Логика проверки границ вверх / вниз перевернута, поэтому вибрация происходит, потому что шары постоянно выходят за границы и их скорости y инвертируются на каждом кадре.Если вы измените строку:

if ball.y > boundary["up"] or ball.y < boundary["down"]:

на:

if ball.y < boundary["up"] or ball.y > boundary["down"]:

, у вас все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...