-1

enter image description hereI was trying to make a side scroller game with pygame ( i am quite new to pygame ) and my game works quite fine but once it turns fast it just gets a weird kind of glitch for a few seconds and it happens occasionally i think its some kind of background error of size not being enough but my screen size is 800, 447 but the background png i use is 1920, 1080 ( the black screen is my background ) Here is my code

from pygame.locals import *
import os
import sys
import math

pygame.init()

W, H = 800, 447
win = pygame.display.set_mode((W,H))
pygame.display.set_caption('Side Scroller')
x = 200
y = 200
height = 30
width = 30

bg = pygame.image.load(os.path.join('im','bg.png')).convert()
bgX = 0
bgX2 = bg.get_width()

clock = pygame.time.Clock()

class player(object):
    run = [pygame.image.load(os.path.join('im', str(x) + '.png')) for x in range(8,16)]
    jump = [pygame.image.load(os.path.join('im', str(x) + '.png')) for x in range(1,8)]
    slide = [pygame.image.load(os.path.join('images', 'S1.png')),pygame.image.load(os.path.join('images', 'S2.png')),pygame.image.load(os.path.join('images', 'S2.png')),pygame.image.load(os.path.join('images', 'S2.png')), pygame.image.load(os.path.join('images', 'S2.png')),pygame.image.load(os.path.join('images', 'S2.png')), pygame.image.load(os.path.join('images', 'S2.png')), pygame.image.load(os.path.join('images', 'S2.png')), pygame.image.load(os.path.join('images', 'S3.png')), pygame.image.load(os.path.join('images', 'S4.png')), pygame.image.load(os.path.join('images', 'S5.png'))]
    jumpList = [![enter image description here][1]][1][1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4]
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.jumping = False
        self.sliding = False
        self.slideCount = 0
        self.jumpCount = 0
        self.runCount = 0
        self.slideUp = False

    def draw(self, win):
        if self.jumping:
            self.y -= self.jumpList[self.jumpCount] * 1.2
            win.blit(self.jump[self.jumpCount//18], (self.x,self.y))
            self.jumpCount += 1
            if self.jumpCount > 108:
                self.jumpCount = 0
                self.jumping = False
                self.runCount = 0
        elif self.sliding or self.slideUp:
            if self.slideCount < 20:
                self.y += 1
            elif self.slideCount == 80:
                self.y -= 19
                self.sliding = False
                self.slideUp = True
            if self.slideCount >= 110:
                self.slideCount = 0
                self.slideUp = False
                self.runCount = 0
            win.blit(self.slide[self.slideCount//10], (self.x,self.y))
            self.slideCount += 1
            
        else:
            if self.runCount > 42:
                self.runCount = 0
            win.blit(self.run[self.runCount//6], (self.x,self.y))
            self.runCount += 1


def redrawwindow():
      win.blit(bg, (bgX, 0))
      win.blit(bg, (bgX2, 0))
      runner.draw(win)
      pygame.display.update()
run = True
speed = 30[![enter image description here][1]][1]
pygame.time.set_timer(USEREVENT+1, 500)
runner = player(200, 313, 80, 64)
while run:

    bgX -= 1.4
    bgX2 -= 1.4
    if bgX < bg.get_width() * -1:
            bgX = bg.get_width()
    if bgX2 < bg.get_width() * -1:
            bg2 = bg.get_width()
    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                  run = False

            if event.type == USEREVENT+1:
                speed +=1

    keys = pygame.key.get_pressed()
    if keys[pygame.K_SPACE] or keys[pygame.K_UP]:
        if not (runner.jumping):
            runner.jumping = True

    if keys[pygame.K_DOWN]:
        if not (runner.sliding):
            runner.sliding = True 

    redrawwindow()
    clock.tick(speed)
pygame.quit()
Maybe Lindow
  • 183
  • 1
  • 1
  • 7

1 Answers1

1

looks like you just need to update your screen so the pixels will update properly. you can add

pygame.display.update()

to the end of your game loop

if this still don't work then try using this command to fill in the background with just the color black just and clearing everything

win.fill((0, 0, 0))

you should put it at the start of the game loop

  • It Still does have that same glitch – Maybe Lindow Feb 10 '22 at 03:59
  • 1
    alright then, for me the solution for clearing the screen is by converting it to nothing by making the background fully dark with the fill command, let me update, my answer – max the computer science fox Feb 10 '22 at 04:03
  • That actually worked but i wanted to put an image ( not the same black background ) and while putting the image i cant do the win.fill((0,0,0)) so is there any other method?? – Maybe Lindow Feb 10 '22 at 04:09
  • oh if you want to add an image you can just change the fill with a image that is the right size for the screen before adding the characters, so you should add the image background at the start of the game loop, you could also left the fill command before the image background command – max the computer science fox Feb 10 '22 at 04:18
  • and if it works, don't forget to upvote my answer to help others that are trying to find the same solution – max the computer science fox Feb 10 '22 at 04:23