Проблема с простой игрой на python, использующей pygame libray - PullRequest
2 голосов
/ 29 октября 2019

Я новичок в Python и Pygame, и я начал делать простую игру, похожую на игру в теннис, но каждый раз, когда мяч находится под прямоугольником, прыгает + -5 пикселей и блокируется. Я думаю, что проблема с pXY и bXY.

import sys, pygame
from pygame.locals import *



pygame.init()
pygame.display.set_mode((500,500)) # ustawiwanie wielkosci
pygame.display.set_caption(("little shit")) #ustawianie nazwy

okienko = pygame.display.get_surface() # pobieranie płaszczyzny


 # obiekt
prostokat = pygame.Surface((80,20)) # tworzenie prostokąta / tulpa, szerokość / wysokość
prostokat.fill((128, 15, 220))  # zmiana koloru prostokąta / r:g:b
pXY = prostokat.get_rect() # pobranie wymiarów prostokąta
pXY.x = 225 # wartość x
pXY.y = 460 # wartość y


kolko = pygame.image.load("./ball.png")
bXY = kolko.get_rect()
bXY.x = 120 # POŁOŻENIE OBIEKTU
bXY.y = 200 # POŁOŻENIE OBIEKTU

bx,by = 5,5 # o ile sie przesuwamy
px = 3

bAB = kolko.get_rect()
bA = 25
bB = 25
kolko = pygame.transform.scale(kolko,(bA,bB))


pygame.display.flip() # wyświetlenie/odrysowanie całego okna


fps = pygame.time.Clock() # ile czasu minęło od wykonywania instrukcji


while True:


    okienko.fill((128, 128, 128))  # zmiana koloru płaszczyzny na szary

    pXY.x += px

    if pXY.x > 420 or pXY.x < 0:
        px *= -1
    okienko.blit(prostokat, pXY)

    bXY.x +=bx
    if bXY.x > 475 or bXY.x < 0:
        bx*= -1
    bXY.y +=by
    if bXY.y > 475 or bXY.y < 0:
        by*= -1
    if pXY.colliderect(bXY): # KOLIDACJA OBIEKTOW
        by=5

    okienko.blit(kolko, bXY)
    pygame.display.update() # update okienka
    fps.tick(30) # odswiezanie obrazu, 30 fps


    for zdarzenie in pygame.event.get():
        if zdarzenie.type == pygame.QUIT:
            pygame.quit()
            exit()
        if zdarzenie.type == KEYDOWN:
            if zdarzenie.key == K_LEFT:
                px=-7
            if zdarzenie.key == K_RIGHT:
                px=7



while True: # pętla do zamykania okienka
        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                pygame.quit()
                exit()

Когда шар находится под прямоугольником, прыгает + - 5 пикселей и блокируется, шар не может покинуть эту область, когда находится слева

1 Ответ

1 голос
/ 29 октября 2019

Ваша логика обнаружения столкновений не даст физически точных результатов. Например, независимо от того, где мяч сталкивается с веслом, он всегда начинает двигаться вниз со скоростью 5 пикселей / кадр. Это означает, что мяч будет проходить через весло при столкновении ударов сверху, но он будет «подпрыгивать» при попадании снизу. Это то, что заставляет мяч вести себя так, как он это делает. В этой строке задается скорость, если весло и мяч сталкиваются:

if pXY.colliderect(bXY): # KOLIDACJA OBIEKTOW
    by=5

Немного лучше было бы изменить направление шара, если он сталкивается с веслом. Но это все равно заставляет шар двигаться только в обратном направлении по оси Y, независимо от того, где на весле мяч сталкивается (сверху, снизу, слева, справа). Код выше может быть изменен на этот код, чтобы получить этот эффект:

if pXY.colliderect(bXY): # KOLIDACJA OBIEKTOW
    by*=-1

Этот последний фрагмент кода немного очищен и переведен на английский. Он использует второй блок кода сверху, чтобы отскочить мяч от весла:

import sys

import pygame


pygame.init()

window = pygame.display.set_mode((500, 500))
pygame.display.set_caption('new caption')

paddle = pygame.Surface((80, 20))
paddle.fill((128, 15, 220))
paddle_rect = paddle.get_rect()
paddle_rect.x = 225
paddle_rect.y = 460

ball = pygame.Surface((25, 25))
ball.fill((255, 0, 0))
ball_rect = ball.get_rect()
ball_rect.x = 120
ball_rect.y = 200

ball_velocity_x = 5
ball_velocity_y = 5
paddle_velocity_x = 3

clock = pygame.time.Clock()

while True:
    # event processing code
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                paddle_velocity_x = -7
            elif event.key == pygame.K_RIGHT:
                paddle_velocity_x = 7

    # update code
    # update the position of the paddle and bounce it off the edges of the window
    paddle_rect.x += paddle_velocity_x
    if paddle_rect.x > 420 or paddle_rect.x < 0:
        paddle_velocity_x *= -1

    # update the position of the ball and bounce it off th eedges of the window
    ball_rect.x += ball_velocity_x
    ball_rect.y += ball_velocity_y
    if ball_rect.x > 475 or ball_rect.x < 0:
        ball_velocity_x *= -1
    if ball_rect.y > 475 or ball_rect.y < 0:
        ball_velocity_y *= -1

    if paddle_rect.colliderect(ball_rect):
        ball_velocity_y *= -1



    # drawing code
    window.fill((128, 128, 128))
    window.blit(paddle, paddle_rect)
    window.blit(ball, ball_rect)
    pygame.display.update()

    clock.tick(30)

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