mercredi 14 juin 2017

pygame: Random direction of a ball at the start of the game

I'm doing the Pong game. However instead of 2 players, I'm doing it for 4 (one on each side of the screen). I need to have the ball randomly "choose" the direction it has to go.

import pygame
import random

class Ball(object):
    @classmethod
    def init(cls, SCREEN_WIDTH, SCREEN_HEIGHT):
        cls.radius = 20
        cls.centerx = SCREEN_WIDTH*0.5
        cls.centery = SCREEN_HEIGHT*0.5

        cls.rect = pygame.Rect(cls.centerx - cls.radius,
                               cls.centery - cls.radius,
                               cls.radius * 2,
                               cls.radius * 2)

    # x , y
    cls.direction = [random.choice([1, -1]), random.choice([1, -1])] 
    cls.speed = [5, 8] # x, y

    # left, right, top, bottom
    cls.hit_edge = [False, False, False, False] 

    @classmethod
    def update(cls, player1, player2, player3, player4, SCREEN_WIDTH,
            SCREEN_HEIGHT):
        cls.centerx += cls.direction[0] * cls.speed[0]
        cls.centery += cls.direction[1] * cls.speed[1]

        cls.rect.center = (cls.centerx, cls.centery)

        #detects if someone losses
        if cls.rect.left <= 0:
            cls.hit_edge[0] = True
        elif cls.rect.right >= SCREEN_WIDTH-1:
            cls.hit_edge[1] = True
        elif cls.rect.top <= 0:
            cls.hit_edge[2] = True
        elif cls.rect.bottom >= SCREEN_HEIGHT-1:
            cls.hit_edge[3] = True

        #detects collision between players & the ball
        if cls.rect.colliderect(player1.rect):
            cls.direction[0] = 1
            cls.up_speed()
        elif cls.rect.colliderect(player2.rect):
            cls.direction[0] = -1
            cls.up_speed()
        elif cls.rect.colliderect(player3.rect):
            cls.direction[1] = 1
            cls.up_speed()
        elif cls.rect.colliderect(player4.rect):
            cls.direction[1] = -1
            cls.up_speed()

    @classmethod
    def up_speed(cls):
        cls.speed[0] += random.uniform(0, 0.25)
        cls.speed[1] += random.uniform(0, 0.25)

    @classmethod
        def render(cls, SCREEN, color):
        pygame.draw.circle(SCREEN, color, cls.rect.center, cls.radius, 0)

To take into account: I had the idea to add a "0" in every random.choice(), although if I do this only function at the beginning, then it will not be able to move in the axis where the "0" . Also I have two types of speeds in X and Y, could be solved by putting a "0.1" in random.choice () but this would make when the game starts the ball goes very slow. As you would do for the ball to start in a random direction (taking into account that the speed of the ball at the start must be the same for all players. If the ball goes at the beginning to the left,and later (in another game) when it starts but the ball goes up has to go at the same speed)




Aucun commentaire:

Enregistrer un commentaire