I am trying to make a clone copy of a tiktok rock, paper, scissors filter (link provided) but for some reason the first ball always seems to be gigantic compared to the rest, and it's also outside of the frame. This is not a consistent problem, but very irritating when it happens. Here is the TikTok Filter: https://www.tiktok.com/@rockpaperscissorsbattle/video/7178441127375195397 Gigantic Ball
I tried to use a function that checks if a ball has already spawned in the coordinates (which are randomly picked) to then pick other coordinates. This works on every other ball that isn't the first one.
Here is my code provided:
import pygame, random, math, sys
from pygame.locals import *
pygame.init()
WIDTH = 800
HEIGHT = 600
FELLES_STØRRELSE = 50
FPS = 60
win = pygame.display.set_mode([WIDTH, HEIGHT])
pygame.display.set_caption("Rock, Paper, Scissors")
font = pygame.font.SysFont("arialblack", 50)
#Bilder
stein_bilde = pygame.image.load("stein.png").convert_alpha()
saks_bilde = pygame.image.load("saks.png").convert_alpha()
papir_bilde = pygame.image.load("papir.png").convert_alpha()
start_img = pygame.image.load("start.png").convert_alpha()
exit_img = pygame.image.load("exit.png").convert_alpha()
#Bilder i riktig størrelse
scaled_stein = pygame.transform.scale(stein_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))
scaled_saks = pygame.transform.scale(saks_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))
scaled_papir = pygame.transform.scale(papir_bilde, (FELLES_STØRRELSE, FELLES_STØRRELSE))
class Button:
def __init__(self, x, y, image, scale):
width = image.get_width()
height = image.get_height()
self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
self.clicked = False
def draw(self, screen):
action = False
#get mouse position
pos = pygame.mouse.get_pos()
#check mouseover and clicked conditions
if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
self.clicked = True
action = True
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
#draw button on screen
screen.blit(self.image, (self.rect.x, self.rect.y))
return action
#Kaller Button klassen
start_button = Button(125, 225, start_img, 1)
exit_button = Button((800 - exit_img.get_width() - 125), 225, exit_img, 1)
antall_baller = 5
class Ball:
def __init__(self, scaled_bilde, tracker):
self.scaled_bilde = scaled_bilde
self.tracker = tracker
self.radius = FELLES_STØRRELSE // 2
self.x_vel = 2
self.y_vel = 2
self.spawnBall()
def spawnBall(self):
while True:
self.x = random.randint((self.radius + 5), (WIDTH - FELLES_STØRRELSE - 5))
self.y = random.randint((self.radius + 5), (HEIGHT - FELLES_STØRRELSE - 5))
for ball in everyone:
if ball is self:
continue
xAvstand2 = (self.x - ball.x)**2
yAvstand2 = (self.y - ball.y)**2
avstand = math.sqrt(xAvstand2 + yAvstand2)
if avstand < self.radius + ball.radius:
break
else:
if self.x < self.radius or self.x > WIDTH - self.radius or self.y < self.radius or self.y > HEIGHT - self.radius:
continue
else:
break
def drawBall(self):
win.blit(self.scaled_bilde, (self.x, self.y))
def moveBall(self):
self.x += self.x_vel
if self.x <= 0:
self.x_vel = -self.x_vel
if self.x >= WIDTH - self.scaled_bilde.get_width():
self.x_vel = -self.x_vel
self.y += self.y_vel
if self.y <= 0:
self.y_vel = -self.y_vel
if self.y >= HEIGHT - self.scaled_bilde.get_height():
self.y_vel = -self.y_vel
everyone = []
stein = [Ball(stein_bilde, "STEIN") for i in range(antall_baller)]
everyone += stein
saks = [Ball(scaled_saks, "SAKS") for i in range(antall_baller)]
everyone += saks
papir = [Ball(scaled_papir, "PAPIR") for i in range(antall_baller)]
everyone += papir
random.shuffle(everyone)
def chaseBall(objekter):
for i, objekt in enumerate(objekter):
for j, objekt2 in enumerate(objekter[i+1:]):
xAvstand2 = (objekt.x - objekt2.x)**2
yAvstand2 = (objekt.y - objekt2.y)**2
avstand = math.sqrt(xAvstand2 + yAvstand2)
if avstand < objekt.radius + objekt2.radius:
if objekt.tracker == "STEIN" and objekt2.tracker == "PAPIR":
objekt.scaled_bilde = pygame.transform.scale(papir_bilde, (50, 50))
objekt.tracker = "PAPIR"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
elif objekt2.tracker == "STEIN" and objekt.tracker == "PAPIR":
objekt2.scaled_bilde = pygame.transform.scale(papir_bilde, (50, 50))
objekt2.tracker = "PAPIR"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
if objekt.tracker == "SAKS" and objekt2.tracker == "STEIN":
objekt.scaled_bilde = pygame.transform.scale(stein_bilde, (50, 50))
objekt.tracker = "STEIN"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
elif objekt2.tracker == "SAKS" and objekt.tracker == "STEIN":
objekt2.scaled_bilde = pygame.transform.scale(stein_bilde, (50, 50))
objekt2.tracker = "STEIN"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
if objekt.tracker == "PAPIR" and objekt2.tracker == "SAKS":
objekt.scaled_bilde = pygame.transform.scale(saks_bilde, (50, 50))
objekt.tracker = "SAKS"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
elif objekt2.tracker == "PAPIR" and objekt.tracker == "SAKS":
objekt2.scaled_bilde = pygame.transform.scale(saks_bilde, (50, 50))
objekt2.tracker = "SAKS"
objekt.x_vel = -objekt.x_vel
objekt.y_vel = -objekt.y_vel
objekt2.x_vel = -objekt.x_vel
objekt2.y_vel = -objekt.y_vel
print(f"{objekt.tracker} og {objekt2.tracker}")
def drawGrid():
blockSize = 25 #Set the size of the grid block
for x in range(0, WIDTH, blockSize):
for y in range(0, HEIGHT, blockSize):
rect = pygame.Rect(x, y, blockSize, blockSize)
pygame.draw.rect(win, (255, 255, 255), rect, 1)
def draw_menu():
img = font.render("Rock, Paper, Scissors", True, (255, 255, 255))
win.fill((0, 0, 0))
win.blit(img, ((WIDTH - img.get_width()) // 2, 50))
def main():
run = True
clock = pygame.time.Clock()
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
clock.tick(FPS)
draw_menu()
if start_button.draw(win):
play()
if exit_button.draw(win):
run = False
pygame.display.update()
pygame.quit()
def draw_play():
global stein
win.fill((0, 0, 0))
drawGrid()
for idx, val in enumerate(stein):
val.drawBall()
saks[idx].drawBall()
papir[idx].drawBall()
def play():
run = True
clock = pygame.time.Clock()
global stein
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
sys.exit()
clock.tick(FPS)
draw_play()
for idx, val in enumerate(stein):
val.moveBall()
saks[idx].moveBall()
papir[idx].moveBall()
chaseBall(everyone)
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
main()