opygame: пытаюсь отбить мяч, но он застревает - PullRequest
4 голосов
/ 18 января 2020
import pygame

Red = 255, 0, 0
Black= 0,0,0
rectXpos = 2
rectypos = 2
speed = 2
screenedgex = 500

pygame.init()

window = pygame.display.set_mode(size=(500, 500))

clock = pygame.time.Clock()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        pygame.display.update()

        window.fill(Black)
        square = pygame.draw.rect(window, Red, [rectXpos, rectypos, 50, 50],2)
        rectXpos += 2

        if rectXpos < 500:
            rectXpos -= 2



        clock.tick(60)
        print(rectXpos)`enter code here`

так что я делаю не так? я пытался сделать if, чтобы остановить мяч и повернуть его вспять, но он удерживает мяч на краю окна

Ответы [ 3 ]

2 голосов
/ 18 января 2020

Я предполагаю, что вы хотите перемещать прямоугольник туда и обратно при движении мыши.
Здесь есть две вещи, которые вы делаете неправильно:
1. исправьте это: if rectXpos > 500:, так как вам нужно уменьшить X, когда оно достигнет 500 2. когда достигните rectXpos 501, он должен изменить свое направление, пока не достигнет rectXpos 0 но вы уменьшили позицию, пока она не превысит 500, поэтому она застрянет между 499 до 501

правильный код:

import pygame

Red = 255, 0, 0
Black= 0,0,0
rectXpos = 2
rectypos = 2
speed = 2
screenedgex = 500

pygame.init()

window = pygame.display.set_mode(size=(500, 500))

clock = pygame.time.Clock()
running = True
k=1                                #here is k used to indicate direction
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        pygame.display.update()

        window.fill(Black)
        square = pygame.draw.rect(window, Red, [rectXpos, rectypos, 50, 50],2)
        rectXpos +=  2*k                #here is addition of 2 in given direction

        if (rectXpos > 500) or (rectXpos < 0): #here is condition to change direction
            k=-k



        clock.tick(60)
        print(rectXpos)
2 голосов
/ 18 января 2020

Это полный код, я разделил отскоки x и y, так что вы можете использовать любой из них, также немного обновил код, плюс немного дополнительного форматирования.

# Imports
import pygame

# Vars
Red = 255, 0, 0
Black= 0,0,0
rectXpos = 2
rectYpos = 2
rect_width = 50
rect_height = 50
screen_width = 500
screen_height = 500
block_x_direction = 1
block_y_direction = 1

# Setup Code
pygame.init()
window = pygame.display.set_mode(size=(screen_width, screen_height))
clock = pygame.time.Clock()
running = True

# Game Loop
########################################################
while running:
    # Event Loop
    ########################################################
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


    # Game Code - Update
    ########################################################
    # Game Code - Update - Rect X Bounce
    if rectXpos + (rect_width)>= screen_width:
        block_x_direction = block_x_direction * -1
    rectXpos += 2 * block_x_direction
    # Game Code - Update - Rect Y Bounce
    if rectYpos + (rect_height)>= screen_height:
        block_y_direction = block_y_direction * -1
    rectYpos += 2 * block_y_direction

    # - Tick Game    
    clock.tick(60)

    # Game Code - Render
    ########################################################
    window.fill(Black)
    square = pygame.draw.rect(window, Red, [rectXpos, rectYpos, rect_width, rect_height],2)
    pygame.display.update()

    # Game Code - Debug Code
    ########################################################
    print(clock.tick)
0 голосов
/ 18 января 2020

Вы должны добавить speed к позиции, и когда вы дотронетесь до границы, вы должны изменить speed на -speed.

Вы также можете использовать pygame.Rect(), чтобы сохранить позицию и размер - у него есть свойства .left и .right (и другие), которые могут быть очень полезны. И вы можете использовать Rect для рисования pygame.draw.rect() (или для проверки столкновения с другими Rect)

import pygame

# --- constants --- (UPPER_CASE_NAMES)

RED = (255, 0, 0)
BLACK = (0, 0, 0)

WIDTH = 500
HEIGHT = 500

# --- main ---

speed = 10

pygame.init()

window = pygame.display.set_mode((WIDTH, HEIGHT))

item = pygame.Rect(0, 0, 50, 50)

clock = pygame.time.Clock()
running = True
while running:

    # - events -

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # - updates - (without draws)

    item.x += speed

    if item.right >= WIDTH:
        speed = -speed
    if item.left <= 0:
        speed = -speed

    # - draws - (without updates)

    window.fill(BLACK)
    pygame.draw.rect(window, RED, item, 2)
    pygame.display.update()

    clock.tick(60)

# - end -
pygame.quit()    
...