-1

I tried making this flappy bird thing, but I can't seen to make it right, it gives me a black screen after I "copied" the code from Tech With Tim, It worked previously but after Episode 4 it just shows me a black screen, could anyone help? I am no getting errors.

import pygame
import neat
import time
import os
import random
pygame.font.init()



WIN_WIDTH = 600
WIN_HEIGHT = 800

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load("bird1.png")), pygame.transform.scale2x(pygame.image.load("bird2.png")), pygame.transform.scale2x(pygame.image.load("bird3.png"))]
PIPE_IMG = pygame.transform.scale2x(pygame.image.load("pipe.png"))
BASE_IMG = pygame.transform.scale2x(pygame.image.load("base.png"))
BG = pygame.transform.scale2x(pygame.image.load("bg.png"))

STAT_FONT = pygame.font.SysFont("comicsans", 50)


class Bird:
    IMGS = BIRD_IMGS
    MAX_ROTATION = 25
    ROT_VEL = 20
    ANIMATION_TIME = 5


    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.tilt = 0
        self.tick_count = 0
        self.vel = 0
        self.height = self.y
        self.img_count = 0
        self.img = self.IMGS[0]

    def jump(self):
        self.vel = -10.5
        self.tick_count = 0
        self.height = self.y

    def move(self):
        self.tick_count += 1

        d = self.vel*self.tick_count + 1.5*self.tick_count**2

        if d >= 16:
            d = 16
        
        if d < 0:
            d -= 2

        self.y = self.y + d

        if d <0 or self.y < self.height + 50:
            if self.tilt < self.MAX_ROTATION:
                self.tilt = self.MAX_ROTATION
        else:
            if self.tilt > -90:
                self.tilt -= self.ROT_VEL

    def draw(self, win):
        self.img_count += 1

        if self.img_count < self.ANIMATION_TIME:
            self.img = self.IMGS[0]
        elif self.img_count < self.ANIMATION_TIME*2:
            self.img = self.IMGS[1]
        elif self.img_count < self.ANIMATION_TIME*3:
            self.img = self.IMGS[2]
        elif self.img_count < self.ANIMATION_TIME*4:
            self.img = self.IMGS[1]
        elif self.img_count == self.ANIMATION_TIME*4 + 1:
            self.img = self.IMGS[0]
            self.img_count = 0

        if self.tilt <= -80:
            self.img = self.IMGS[1]
            self.img_count = self.ANIMATION_TIME*2

        rotated_img = pygame.transform.rotate(self.img, self.tilt)
        new_rect = rotated_img.get_rect(center=self.img.get_rect(topleft = (self.x, self.y)).center)
        win.blit(rotated_img, new_rect.topleft)
        

    def get_mask(self):
        return pygame.mask.from_surface(self.img)


class Pipe:
    GAP = 200
    VEL = 5


    def __init__(self,x):
        self.x = x
        self.height = 0

        self.top = 0
        self.bottom = 0
        self.PIPE_TOP = pygame.transform.flip(PIPE_IMG, False, True)
        self.PIPE_BOTTOM = PIPE_IMG

        self.passed = False
        self.set_height()

    def set_height(self):
        self.height = random.randrange(50,450)
        self.top = self.height - self.PIPE_TOP.get_height()
        self.bottom = self.height + self.GAP
    

    def move(self):
        self.x -= self.VEL

    def draw(self, win):
        win.blit(self.PIPE_TOP, (self.x, self.top))
        win.blit(self.PIPE_BOTTOM, (self.x, self.bottom))

    def collide(self, bird):
        bird_mask = bird.get_mask()
        top_mask = pygame.mask.from_surface(self.PIPE_TOP)
        bottom_mask = pygame.mask.from_surface(self.PIPE_BOTTOM)

        top_offset = (self.x - bird.x, self.top - round(bird.y))
        bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))

        b_point = bird_mask.overlap(bottom_mask, bottom_offset)
        t_point = bird_mask.overlap(top_mask, top_offset)
        
        if t_point or b_point:
            return True
        
        return False
        
    




class Base():
    VEL = 5
    WIDTH = BASE_IMG.get_width()
    IMG = BASE_IMG


    def __init__(self,y):
        self.y = y
        self.x1 = 0
        self.x2 = self.WIDTH

    def move(self):
        self.x1 -= self.VEL
        self.x2 -= self.VEL

        if self.x1 + self.WIDTH <0:
            self.x1 = self.x2 + self.WIDTH

        if self.x2 + self.WIDTH <0:
            self.xx2 = self.x1 + self.WIDTH

    def draw(self, win):
        win.blit(self.IMG, (self.x1, self.y))
        win.blit(self.IMG, (self.x2, self.y))



def draw_window(win, bird, pipes, base, score):
    win.blit(BG, (0,0))
    for pipe in pipes:
        pipe.draw(win)


    text = STAT_FONT.render("Score: " + str(score), 1,(255,255,255))
    win.blit(text, (WIN_WIDTH - 10 - text.get_width(), 10))


    base.draw(win)
    bird.draw(win)
    pygame.display.update()


def main():
    bird = Bird(230, 350)
    base = Base(730)
    pipes = [Pipe(600)]
    win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
    clock = pygame.time.Clock()

    score = 0

    run = True
    while run:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False



        #bird.move()
        add_pipe = False
        rem = []
        for pipe in pipes:
            if pipe.collide(bird):
                pass



            if pipe.x + pipe.PIPE_TOP.get_width() < 0:
                rem.append(pipe)

            if not pipe.passed and pipe.x < bird.x:
                pipe.passed = True
                add_pipe = True

            pipe.move()
        if add_pipe:
            score += 1
            pipes.append(Pipe(600))

        for r in rem:
            pipes.remove(r)


        if bird.y + bird.img.get_height() >= 730:




         base.move()
         draw_window(win, bird, pipes, base, score)


    pygame.quit()
    quit()


main()
desertnaut
  • 57,590
  • 26
  • 140
  • 166
Giorgi GT
  • 1
  • 2
  • first you could use `print()` to see which part of code is executed and what you have in variables. It is called `"print debuging"` and it help to see problem. Maybe you skip some function - so it doesn't draw elements, or you run code which removes everything before you `display.update()` (ie. it draws big black square), or maybe you draw them in wrong places (too big values `x, y`, or negative `x,y`) and you can't see them in window. – furas Mar 01 '22 at 00:57
  • if you would use `pygame.Rect()` to keep image size and position then you could use `bird.rect.bottom` instead of `bird.y + bird.img.get_height()`, And you could do `win.blit(bird.img, birf.rect)`, And you could check collisions `bird.rect.colliderect( pipe.rect )` – furas Mar 01 '22 at 01:12
  • Welcome to Stack Overflow. "So I tried making this ML flappy bird thing, (no ML yet) but I can't seen to make it right, it gives me a black screen after I "copied" the code from Tech With Tim" This tells me everything I need to know. Forget about this series and follow a proper tutorial for the Python language itself, start to finish. The official documentation includes one. – Karl Knechtel Mar 01 '22 at 01:37
  • Anyway, please read [ask] and https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ and https://meta.stackoverflow.com/questions/261592 and https://stackoverflow.com/help/minimal-reproducible-example. You appear to be lacking fundamental *how-to-solve-problems* skills, which will not be taught by this kind of tutorial and which are necessary to meet standards for asking a question on Stack Overflow. – Karl Knechtel Mar 01 '22 at 01:38
  • In general, a "tutorial" that gives you step by step code for a specific project is almost never a good one. A good tutorial will *explain concepts* in a logical order, of which it is self-aware, and expect you to write your own code to demonstrate them at every step. – Karl Knechtel Mar 01 '22 at 01:40

1 Answers1

1

You have wrong indentations - and this change everything.

In while True you have draw_window() inside if ... >= 730:

At first look it is hard to see because you have one-space indentation in this place.

        if bird.y + bird.img.get_height() >= 730:




         base.move()
         draw_window(win, bird, pipes, base, score)

if you remove empty lines then you see that draw_window is inside if

        if bird.y + bird.img.get_height() >= 730:
         base.move()
         draw_window(win, bird, pipes, base, score)

but it should be

        if bird.y + bird.img.get_height() >= 730:
            base.move()
        draw_window(win, bird, pipes, base, score)

And now it display background and other elements, and they are moving.

furas
  • 134,197
  • 12
  • 106
  • 148