Столкновение без спрайтов? - PullRequest
       13

Столкновение без спрайтов?

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

Я пытался создать Pong для класса, используя python 3.4.3.Последнее, что я должен сделать, это создать столкновение между мячом и веслами.Кроме того, я только узнал о спрайтах только сейчас, но я зашел слишком далеко, чтобы перезапустить.

Вот мой код:

#import and start up pygame
import pygame
import math
import time

pygame.init()

#define colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED =   ( 255, 0, 0)
BLUE =  ( 0, 0, 255)
PURPLE = (255, 0, 255)
YELLOW = (255, 255, 0)
TEAL = ( 0, 255, 255)
BROWN = ( 70, 50, 30)

#create window
size = (800, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pong")

done = False

#manage time
clock = pygame.time.Clock()


#ball movement
rect_x = 375
rect_y = 250
rect_change_x = 3
rect_change_y = 3

#paddle movement
y_speed_1 = 0
y_speed_2 = 0

#paddle coords so we can track them in real time
x_coord_1 = 70
x_coord_2 = 700
y_coord_1 = 200
y_coord_2 = 200

#score
score_player_1 = 0
score_player_2 = 0


time.sleep(1)
#main loop
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        #program that moves the paddles
        if event.type == pygame.KEYDOWN:

        #player one uses the WS keys
        if event.key == pygame.K_w:
            y_speed_1 = -3
        elif event.key == pygame.K_s:
            y_speed_1 = 3

        #player two uses the arrow keys
        elif event.key == pygame.K_DOWN:
            y_speed_2 = 3
        elif event.key == pygame.K_UP:
            y_speed_2 = -3

    #stops the paddle after done pressing key
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_w or event.key == pygame.K_s:
            y_speed_1 = 0

        elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
            y_speed_2 = 0


y_coord_1 += y_speed_1
y_coord_2 += y_speed_2


#ball bounces off of the top and bottom sides
if rect_y > 450 or rect_y < 0:
    rect_change_y = rect_change_y * -1

#player 1 score
elif rect_x > 751: 
    score_player_1 += 1
    rect_x = 375
    rect_y = 250
    rect_change_x = 0
    rect_change_y = 0
    rect_change_x = -4
    rect_change_y = -4
    time.sleep(1)


#player 2 score
elif rect_x < -1:
    score_player_2 += 1
    rect_x = 375
    rect_y = 250
    rect_change_x = 0
    rect_change_y = 0
    rect_change_x = 4
    rect_change_y = 4
    time.sleep(1)

#player 1 collision


#player 2 collision


#paddles program
def draw_paddle_1(x, y, z):
    pygame.draw.rect(screen, WHITE, [x_coord_1, y_coord_1, 30, 100])

def draw_paddle_2(x, y, z):
    pygame.draw.rect(screen, WHITE, [x_coord_2, y_coord_2, 30, 100])

#fill the screen
screen.fill(BLACK)

#ball
pygame.draw.rect(screen, WHITE, [rect_x, rect_y, 50, 50])


#move the starting point of the ball
rect_x += rect_change_x
rect_y += rect_change_y

#paddles
draw_paddle_1(screen, x_coord_1, y_coord_1)
draw_paddle_2(screen, x_coord_2, y_coord_2)

#score
def display_score():
    font = pygame.font.SysFont('System Bold', 35, True, False)
    text1 = font.render(str(score_player_1), True, WHITE)
    text2 = font.render(str(score_player_2), True, WHITE)
    screen.blit(text1, [375, 10])
    screen.blit(text2, [425, 10])

def player_win():
    font = pygame.font.SysFont('System Bold', 40, True, False)
    player_1_win = font.render("Player 1 Wins!", True, WHITE)
    player_2_win = font.render("Player 2 Wins!", True, WHITE)

    if score_player_1 == 7:
        screen.blit(player_1_win, [300, 100])
        pygame.display.flip()
        time.sleep(1)
        pygame.quit()

    if score_player_2 == 7:
        screen.blit(player_2_win, [300, 100])
        pygame.display.flip()
        time.sleep(1)
        pygame.quit()

    #call programs
    display_score()
    player_win()

    #make the window display the drawings
    pygame.display.flip()



    #limit to 60 frames per second
    clock.tick(60)


#close window and quit
pygame.quit()

Пожалуйста, также дайте мне знать, если я должен сделать какие-либо другие изменения.К вашему сведению, это должно быть сделано к завтрашнему дню, поэтому я действительно не могу тратить на это гораздо больше времени.

1 Ответ

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

Привет, добро пожаловать в stackoverflow!У меня есть ваше решение, но оно не очень хорошее и не требует больших усилий, но я расскажу вам алгоритм, так что, надеюсь, вы сможете сделать лучше, чем я.По сути, все, что вам нужно сказать, это если область прямоугольника шара находится на пересечении с любым из лопастей, отскочить от него (чтобы отскочить в этом случае, просто измените скорость на х).Чтобы увидеть, находится ли он на пересечении, точно так же, как вы проверили, находится ли шарик внутри экрана, вы просто сопоставляете значения х и у шаров и лопастей.Я сделал весло тонким, чтобы оно в основном подпрыгивало только на самом весле (скажите, хотите ли вы, чтобы это изменилось, и я с удовольствием это сделаю!).Вот код, это был плохой отступ, но я исправил это, я рекомендую вам сделать цикл while главным образом для удобства чтения, так как он немного длинный.

#import and start up pygame
import pygame
import math
import time

pygame.init()

#define colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED =   ( 255, 0, 0)
BLUE =  ( 0, 0, 255)
PURPLE = (255, 0, 255)
YELLOW = (255, 255, 0)
TEAL = ( 0, 255, 255)
BROWN = ( 70, 50, 30)

#create window
size = (800, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pong")

done = False

#manage time
clock = pygame.time.Clock()


#ball movement
rect_x = 375
rect_y = 250
rect_change_x = 3
rect_change_y = 3

#paddle movement
y_speed_1 = 0
y_speed_2 = 0

#paddle coords so we can track them in real time
x_coord_1 = 70
x_coord_2 = 700
y_coord_1 = 200
y_coord_2 = 200

#score
score_player_1 = 0
score_player_2 = 0


time.sleep(1)
def display_score():
    font = pygame.font.SysFont('System Bold', 35, True, False)
    text1 = font.render(str(score_player_1), True, WHITE)
    text2 = font.render(str(score_player_2), True, WHITE)
    screen.blit(text1, [375, 10])
    screen.blit(text2, [425, 10])

def player_win():
    font = pygame.font.SysFont('System Bold', 40, True, False)
    player_1_win = font.render("Player 1 Wins!", True, WHITE)
    player_2_win = font.render("Player 2 Wins!", True, WHITE)

    if score_player_1 == 7:
        screen.blit(player_1_win, [300, 100])
        pygame.display.flip()
        time.sleep(1)
        pygame.quit()

    if score_player_2 == 7:
        screen.blit(player_2_win, [300, 100])
        pygame.display.flip()
        time.sleep(1)
        pygame.quit()

def draw_paddle_1(x, y, z):
    pygame.draw.rect(screen, WHITE, [x_coord_1, y_coord_1, 3, 100])

def draw_paddle_2(x, y, z):
    pygame.draw.rect(screen, WHITE, [x_coord_2, y_coord_2, 3, 100])
def collidep1(x,y):
    if x<= x_coord_1+3:#it will only bounce off one side
        if y+50<= y_coord_1+150 and y+50>=y_coord_1:
            return True
    return False
def collidep2(x,y):
    if x+50>= x_coord_2:#it will only bounce off one side
        if y+50<= y_coord_2+150 and y+50>=y_coord_2:
            return True
    return False


#fill the screen

#main loop
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        #program that moves the paddles
        if event.type == pygame.KEYDOWN:

        #player one uses the WS keys
            if event.key == pygame.K_w:
                y_speed_1 = -3
            elif event.key == pygame.K_s:
                y_speed_1 = 3

        #player two uses the arrow keys
            elif event.key == pygame.K_DOWN:
                y_speed_2 = 3
            elif event.key == pygame.K_UP:
                y_speed_2 = -3

    #stops the paddle after done pressing key
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                y_speed_1 = 0

            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                y_speed_2 = 0


    y_coord_1 += y_speed_1
    y_coord_2 += y_speed_2


#ball bounces off of the top and bottom sides
    if rect_y > 450 or rect_y < 0:
        rect_change_y = rect_change_y * -1

#player 1 score
    elif rect_x > 751: 
        score_player_1 += 1
        rect_x = 375
        rect_y = 250
        rect_change_x = 0
        rect_change_y = 0
        rect_change_x = -4
        rect_change_y = -4
        time.sleep(1)


#player 2 score
    elif rect_x < -1:
        score_player_2 += 1
        rect_x = 375
        rect_y = 250
        rect_change_x = 0
        rect_change_y = 0
        rect_change_x = 4
        rect_change_y = 4
        time.sleep(1)

    #player 1 collision
    if collidep1(rect_x,rect_y):
        rect_change_x = 4
    if collidep2(rect_x,rect_y):
        rect_change_x = -4


    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, [rect_x, rect_y, 50, 50])


    #move the starting point of the ball
    rect_x += rect_change_x
    rect_y += rect_change_y

    #paddles
    draw_paddle_1(screen, x_coord_1, y_coord_1)
    draw_paddle_2(screen, x_coord_2, y_coord_2)
    #call programs
    display_score()
    player_win()

    #make the window display the drawings
    pygame.display.flip()



    #limit to 60 frames per second
    clock.tick(60)


#paddles program

#ball

#score
#close window and quit
pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...