How to see how many FPS there are in pygame

This scripts shows you how many sprites you can handle with pygame.

import os

from random import randrange

# Imports organized in order to work both with Pygame and Pyjsdl
try:
    import pygame as pg
    from pygame.math import Vector2

    platform = "standalone"
    res_dir = "public"
except ImportError:
    import pyjsdl as pg
    from pyjsdl.vector import Vector2

    platform = "web"
    res_dir = ""

from fps_counter import FPSCounter
from widgets import Button, Label, HBox, VBox, Widget
from sprite import RandomSprite


class Game:
    def __init__(self, screen_size, max_fps):
        self.screen_size = screen_size
        self.max_fps = max_fps

        self.img = None
        self.sprites = []
        self.sprites_moving = True

        self.fps_counter = FPSCounter()
        self.running = True
        
        pg.init()
        self.clock = pg.time.Clock()
        self.screen = pg.display.set_mode(screen_size)
        pg.display.set_caption("Snake mark")

        # Create some UI
        self.ui_root = Widget(None, 0, 0, self.screen_size.x, self.screen_size.y)
        
        hbox = HBox(self.ui_root, h_anchor="right")
        Button(hbox, "+ 100", lambda: self.add_sprites(100))
        Button(hbox, "- 100", lambda: self.remove_sprites(100))
        self.toggle_btn = Button(hbox, "Stop", self.toggle_moving)
        Button(hbox, "Clear", self.clear)
        hbox.layout()
        
        vbox = VBox(self.ui_root, spacing=0, h_anchor="left")
        self.fps_label = Label(vbox, "FPS:", w=120)
        self.sprite_count_label = Label(vbox, "Sprites:", w=120)
        vbox.layout()
              
        if platform == "web":
            pg.setup(self.web_init,["snake.png"])
        else:
            self.prerun()
            while self.running:
                self.game_loop()

    def add_sprites(self, num):
        for _ in range(0, num):
            spr = RandomSprite(
                self.img, 0, 0, self.screen_size.x, self.screen_size.y, -100, 100
            )
            self.sprites.append(spr)

    def remove_sprites(self, num):
        if len(self.sprites) >= num:
            self.sprites = self.sprites[num:]

    def toggle_moving(self):
        if self.sprites_moving:
            self.sprites_moving = False
            self.toggle_btn.set_text("Move")
        else:
            self.sprites_moving = True
            self.toggle_btn.set_text("Stop")

    def clear(self):
        self.sprites = []

    def prerun(self):
        # Convert image for better performance
        # self.img = pg.image.load(os.path.join(res_dir, "snake.png"))
        # self.img = pg.image.load(os.path.join(res_dir, "snake.png")).convert()
        self.img = pg.Surface((10, 10))
        pg.draw.circle(self.img, (0,255,255), (5,5), 5, 2)
        self.img.set_colorkey((0,0,0))
        # self.img.fill((255,0,0))
        # Scale it 2 times
        # self.img = pg.transform.scale2x(self.img)
        self.add_sprites(100)


    def web_init(self):
        self.prerun()
        pg.set_callback(self.game_loop)

    def game_loop(self):
        for e in pg.event.get():
            if e.type == pg.QUIT or e.type == pg.KEYDOWN and e.key == pg.K_ESCAPE:
                pg.quit()
                self.running = False

        self.screen.fill((0, 0, 0))

        dt = self.clock.get_time() / 1000

        for spr in self.sprites:
            if self.sprites_moving:
                spr.update(dt)
            spr.draw(self.screen)

        for e in self.ui_root.children:
            e.update(dt)
            e.draw(self.screen)

        self.fps_counter.update(dt)
        # Pyjsdl doesn't support Python 3 string interpolation
        self.sprite_count_label.set_text("Sprites: {}".format(len(self.sprites)))
        self.fps_label.set_text("FPS: {}".format(self.fps_counter.get_fps()))

        pg.display.flip()

        self.clock.tick(self.max_fps)


if __name__ == "__main__":
    screen_size = Vector2(800, 600)
    max_fps = 60
    game = Game(screen_size, max_fps)

Video


Subscribe to the newsletter for updates
Tkinter templates
Avatar My youtube channel

Twitter: @pythonprogrammi - python_pygame

Videos

Speech recognition game

Pygame's Platform Game

Other Pygame's posts

Published by pythonprogramming

Started with basic on the spectrum, loved javascript in the 90ies and python in the 2000, now I am back with python, still making some javascript stuff when needed.