Hice un borde en este juego de pong, y las paletas en la pantalla pueden cruzarlo. He hecho esto antes en otro fragmento de código, pero ahora todo es diferente. Tengo una idea principal de cómo hacerlo, probablemente necesite una declaración if, pero no tengo todo.

Puedes borrar "pygame.load.image ()" porque necesitas la imagen con el código en una carpeta, para que puedas borrarla. Será mejor porque puedes probarlo en tu python

#import modules
import pygame 
pygame.init()
#setting the variables for the window
WIDTH = 750
HEIGHT = 500
#making the wind\ow
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pong Game")
#setting the most important variables
dest = (0, 0)
dest2 = (200, 200)
dest3 = (200, 50)
white = (255, 255, 255)
black = (0, 0, 0) 
green = (0, 255, 0)
red = (255, 0, 0)
yellow = (255, 255, 222)
#load the images
image = pygame.image.load("birdupbg.png")
image2 = pygame.image.load("birdup.png")
#making the paddle class
class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([10, 75])
        self.image.fill(yellow)
        self.rect = self.image.get_rect()
        self.points = 0
#making the ball class
class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([10, 10])
        self.image.fill(red)
        self.rect = self.image.get_rect()
        self.speed = 15 
        self.dx = 1
        self.dy = 1
        self.dx2 = 1
        self.dy2 = 1
#making the paddles
paddle1 = Paddle()
paddle1.rect.x = 25
paddle1.rect.y = 100

paddle2 = Paddle()
paddle2.rect.x = 715
paddle2.rect.y = 225


paddle3 = Paddle()
paddle3.rect.x = 715
paddle3.rect.y = 100

paddle4 = Paddle()
paddle4.rect.x = 25
paddle4.rect.y = 225
#paddle speed
paddle_speed = 50

pong = Ball()
pong.rect.x = 375
pong.rect.y = 250

ball = Ball()

all_sprites = pygame.sprite.Group()
all_sprites.add(paddle1, paddle2, paddle3, paddle4, pong)

#drawing the score and the word "pong" 
def redraw():
    win.fill(black)
    win.blit(image, dest)
    pygame.draw.line(win, (255, 255, 255), [0, 200], [900, 200], 10)
    font = pygame.font.SysFont("impact", 40)
    text = font.render("PONG", False, white)
    textRect = text.get_rect()
    textRect.center = (750//2, 25)
    win.blit(text, textRect)


    p1_score = font.render(str(paddle1.points), False, white)
    p1Rect = p1_score.get_rect()
    p1Rect.center = (50, 50)
    win.blit(p1_score, p1Rect)

    p2_score = font.render(str(paddle2.points), False, white)
    p2Rect = p2_score.get_rect()
    p1Rect.center = (700, 50)
    win.blit(p2_score, p1Rect)
    
    all_sprites.draw(win)
    pygame.display.update()
#what happens when the window runs
run = True

while run:
    pygame.time.delay(100)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    #if a certain key is pressed, move something
    key = pygame.key.get_pressed()
    if key[pygame.K_w]:
        paddle1.rect.y += -paddle_speed
    if key[pygame.K_s]:
        paddle1.rect.y +=  paddle_speed
    if key[pygame.K_UP]:
        paddle2.rect.y += -paddle_speed
    if key[pygame.K_DOWN]:
        paddle2.rect.y +=  paddle_speed
    if key[pygame.K_i]:
        paddle3.rect.y += -paddle_speed
    if key[pygame.K_j]:
        paddle3.rect.y += paddle_speed
    if key[pygame.K_1]:
        paddle4.rect.y += -paddle_speed
    if key[pygame.K_2]:
        paddle4.rect.y += paddle_speed
    pong.rect.x += pong.speed * pong.dx
    pong.rect.y += pong.speed * pong.dy
    #scoring system
    if pong.rect.y > 480:
        pong.dy = -1
    if pong.rect.x > 735:
        pong.rect.x, pong.rect.y = 375, 250
        pong.dx = -1
        paddle1.points += 1
        if pong.rect.y < -1:
            pong.dy = 1

    if pong.rect.x < 10:
        pong.rect.x, pong.rect.y = 375, 250
        pong.dx = 1
        paddle2.points += 1

    #if the ball and paddle collide, bounce off it
    if paddle1.rect.colliderect(pong.rect):
        pong.dx = 1
    if paddle2.rect.colliderect(pong.rect):
        pong.dx = -1
    if paddle1.rect.colliderect(pong.rect):
        pong.dx = 1
    if paddle3.rect.colliderect(pong.rect):
        pong.dx = -1
    if paddle4.rect.colliderect(pong.rect):
        pong.dx = 1
    #Call the redraw function
    redraw()  
    #update the window and quit it
    pygame.display.flip()
pygame.quit()
4
coding_guy531 27 ago. 2020 a las 03:57

2 respuestas

La mejor respuesta

Para mantener las palas en el campo, agregue una marca en el bucle de juego para bloquear el movimiento de la paleta cuando la paleta llegue a un borde.

.......
if pong.rect.x < 10:
    pong.rect.x, pong.rect.y = 375, 250
    pong.dx = 1
    paddle2.points += 1

# keep paddles in correct range     # add this section
if paddle1.rect.y < 0 : paddle1.rect.y = 0
if paddle3.rect.y < 0 : paddle3.rect.y = 0
if paddle2.rect.y < 200 : paddle2.rect.y = 200
if paddle4.rect.y < 200 : paddle4.rect.y = 200
if paddle1.rect.y > 200 - 75 : paddle1.rect.y = 200 - 75
if paddle3.rect.y > 200 - 75 : paddle3.rect.y = 200 - 75
if paddle2.rect.y > 500 - 75 : paddle2.rect.y = 500 - 75
if paddle4.rect.y > 500 - 75 : paddle4.rect.y = 500 - 75  

#if the ball and paddle collide, bounce off it
if paddle1.rect.colliderect(pong.rect):
    pong.dx = 1
if paddle2.rect.colliderect(pong.rect):
    pong.dx = -1
.....
1
Mike67 27 ago. 2020 a las 03:11

Recomiendo escribir una función, que mantenga un rectángulo completamente dentro de un rectángulo delimitador:

def keepRectInRect(boundingRect, rect):
    rect.left = max(rect.left, boundingRect.left)
    rect.right = min(rect.right, boundingRect.right)
    rect.top = max(rect.top, boundingRect.top)
    rect.bottom = min(rect.bottom, boundingRect.bottom)

En su aplicación, el rectángulo delimitador es la ventana:

while run:
    # [...]

    key = pygame.key.get_pressed()
    if key[pygame.K_w]:
        paddle1.rect.y += -paddle_speed
    # [...]
    winRect = win.get_rect()
    keepRectInRect(winRect, paddle1)
    keepRectInRect(winRect, paddle2)
    keepRectInRect(winRect, paddle3)
    keepRectInRect(winRect, paddle4)

    # [...]
1
Rabbid76 27 ago. 2020 a las 04:31
63607681