Home > Net >  Screen not refreshing in pygame
Screen not refreshing in pygame

Time:10-30

So im new to python, and im working on a code. The code is supposed to make a spirograph move and im almost finished and at the last step, but when i ran it, the screen doesnt refresh even though im sure that the circles are moving by printing out the coordinates. I really dont know whats going on because im sure i spelt everything right. Any help?

import pygame
import math
import sys
import time
#setting colors
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255,  0)
RED = (255, 0, 0)
ORANGE = (255, 127, 0)
YELLOW = (255, 255, 0)
PURPLE = (160, 32, 240)
#setting what order the colors go in
listCircleColor = (RED, BLUE, GREEN, ORANGE, YELLOW, PURPLE, WHITE)
#how many circles per color
intGroup = 5
#the space between each circle
turnangle = 360/35
#width of screen
width = 600
#height of screen
height = 600
#radius of circles
radius = 100
#making the screen
screen = pygame.display.set_mode((width, height))
#if the code is running, then continue
running = True


##.draw.circle(screen, BLUE, (0, 0), radius, width=2)
circles = []
screen.fill(Color("black"))
#draw
alpha = turnangle
for i in range(intGroup):
    for cl in listCircleColor:
        circlerect = pygame.rect
        if alpha > 0 and alpha < 90:
            circlerect = pygame.draw.circle(screen, cl, (300   radius * 
math.cos(math.radians(alpha)), 300   radius * math.sin(math.radians(alpha))), radius, width=2)
            # second quarter of circles
        if alpha > 90 and alpha < 180:
            circlerect = pygame.draw.circle(screen, cl, (300 - radius * 
math.cos(math.radians(180 - alpha)), 300   radius * math.sin(math.radians(180 - alpha))), 
radius, width=2)
                # third quarter of circles
      if alpha > 180 and alpha < 270:
            circlerect = pygame.draw.circle(screen, cl, (300 - radius * math.cos(math.radians(270 - alpha)), 300 - radius * math.sin(math.radians(270 - alpha))), radius, width=2)
        # last quarter of circles
    if alpha > 270 and alpha < 360:
        circlerect = pygame.draw.circle(screen, cl, (300   radius * math.cos(math.radians(360 - alpha)), 300 - radius * math.sin(math.radians(360 - alpha))), radius, width=2)

    alpha = alpha   turnangle
    circles.append(circlerect)

#move"
"""
circlesToMove = []

finishedMovingAllFive = False
for circle in circlesToMove:
                circle[1]  = circle[3][0] * speed
                circle[2]  = circle[3][1] * speed

"""

"""circles = []
alpha = turnangle
for i in range(intGroup):
    for cl in listCircleColor:
        x = 300   radius * math.cos(math.radians(alpha))
        y = 300   radius * math.sin(math.radians(alpha))
        circles.append(([x, y, cl]))
        alpha = alpha   turnangle
"""



#exit only when user clicks on exit button
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        pygame.quit()
        exit()

"for circle in circles:"
"print(circle[0][0])"
"print(circle[0][1])"
"time.sleep(50)"
"circle[0][0]  = 1"

for crect in circles:
    crect.right  = 20

   ## screen.fill(0)
    ##for center, color in circles:
    ##    pygame.draw.circle(screen, color, center, radius, 2)
    ##pygame.display.flip()
    pygame.display.update()

CodePudding user response:

There is so much code having wrong indentations:

if alpha > 0 and alpha < 90:
            circlerect = pygame.draw.circle(screen, cl, (300   radius * 
math.cos(math.radians(alpha)), 300   radius * math.sin(math.radians(alpha))), radius, width=2)

and

if alpha > 90 and alpha < 180:
            circlerect = pygame.draw.circle(screen, cl, (300 - radius * 
math.cos(math.radians(180 - alpha)), 300   radius * math.sin(math.radians(180 - alpha))), 
radius, width=2)

and

if alpha > 180 and alpha < 270:
        circlerect = pygame.draw.circle(screen, cl, (300 - radius * math.cos(math.radians(270 - alpha)), 300 - radius * math.sin(math.radians(270 - alpha))), radius, width=2)
    # last quarter of circles
if alpha > 270 and alpha < 360:
    circlerect = pygame.draw.circle(screen, cl, (300   radius * math.cos(math.radians(360 - alpha)), 300 - radius * math.sin(math.radians(360 - alpha))), radius, width=2)

and

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

Fix the indentations in these parts so that we can see where the problem is.

CodePudding user response:

There are many problems within the code, primarily as indentations, as mentioned by Dhrumil Dave, but to fix the display not updating, here is what you need to do. Instead of this

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        pygame.quit()
        exit()

"for circle in circles:"
"print(circle[0][0])"
"print(circle[0][1])"
"time.sleep(50)"
"circle[0][0]  = 1"

for crect in circles:
    crect.right  = 20

   ## screen.fill(0)
    ##for center, color in circles:
    ##    pygame.draw.circle(screen, color, center, radius, 2)
    ##pygame.display.flip()
    pygame.display.update()

You need to move the pygame.display.update() to within the while running loop, like this

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        pygame.quit()
        exit()
    pygame.display.update()

I would also look in to implementing a clock to standardize frame rate, like this...

FPS = 60
clock = pygame.time.Clock()
running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
        pygame.quit()
        exit()
    pygame.display.update()

If you do this, the game will only update 60 times per second(the while loop will only run through 60 times per second). This will standardize speed of many actions and help significantly once the game is more complete. You can also look into something called delta time, which you can see how to do here.

  • Related