Getting Started with 2D Games Using Arcade Library (Part 9): Displaying the Score

Published: (December 24, 2025 at 07:05 AM EST)
4 min read
Source: Dev.to

Source: Dev.to

Displaying the Score

In this article, we will display the number of collected coins as a score on the screen.

1. Create a Text Object

In the constructor of the GameView class in main.py, prepare a numeric score variable and a text object using arcade.Text().

Specify the following information as arguments:

  • The text to display
  • X / Y coordinates
  • Text color
  • Font size
  • X anchor point (use the horizontal center of the text)
  • Y anchor point (use the top of the text)
# main.py (excerpt)

# Score
self.score = 0
# Text object
self.score_text = arcade.Text(
    "SCORE: {}".format(self.score),
    self.w / 2, self.h - 20,
    arcade.color.BLACK,
    16,
    anchor_x="center",
    anchor_y="top"
)

2. Increase the Score and Update the Text

In the on_update() method of the GameView class in main.py, we already perform collision detection.
At this timing, we also increase the score and update the text. If the player touches multiple coins at the same time, the score will be increased by that amount.

# main.py (excerpt)

def on_update(self, delta_time):
    self.players.update(delta_time)
    self.coins.update(delta_time)

    # Player x coin list
    hit_coins = arcade.check_for_collision_with_list(
        self.player,
        self.coins
    )
    for coin in hit_coins:
        coin.remove_from_sprite_lists()
        # Add to score
        self.score += 1
        # Update the text of the text object
        self.score_text.text = "SCORE: {}".format(self.score)

3. Draw the Text

Finally, draw the text object in the on_draw() method of the GameView class in main.py.
(This step is surprisingly easy to forget 😅)

# main.py (excerpt)

def on_draw(self):
    self.clear()               # Clear
    self.backgrounds.draw()
    self.players.draw()
    self.coins.draw()
    self.score_text.draw()      # Draw the text object

Complete Code

Below is the complete code with all the features implemented so far.
You can copy and run it as‑is.

sprite.py (complete code)

import arcade
import math

class BaseSprite(arcade.Sprite):

    def __init__(self, filename, x, y):
        super().__init__(filename)
        # Position
        self.center_x = x
        self.center_y = y
        # Velocity
        self.vx = 0
        self.vy = 0
        # Animation
        self.anim_counter = 0
        self.anim_interval = 4
        self.anim_index = 0
        self.anim = []

    def update(self, delta_time):
        """ Update """
        self.center_x += self.vx * delta_time
        self.center_y += self.vy * delta_time
        # Animation
        self.update_animation()

    def move(self, spd, deg):
        """ Move Sprite """
        rad = deg * math.pi / 180
        self.vx = spd * math.cos(rad)
        self.vy = spd * math.sin(rad)

    def stop(self):
        """ Stop Sprite """
        self.vx = 0
        self.vy = 0

    def update_animation(self):
        """ Animation """
        if not self.anim:
            return
        self.anim_counter += 1
        if self.anim_counter < self.anim_interval:
            return
        self.anim_counter = 0
        self.anim_index += 1
        if len(self.anim) <= self.anim_index:
            self.anim_index = 0
        self.texture = self.anim[self.anim_index]

class Player(BaseSprite):

    def __init__(self, filename, x, y):
        super().__init__(filename, x, y)

        self.anim.append(arcade.load_texture("images/ninja/front_01.png"))
        self.anim.append(arcade.load_texture("images/ninja/front_02.png"))
        self.anim.append(arcade.load_texture("images/ninja/front_03.png"))
        self.anim.append(arcade.load_texture("images/ninja/front_04.png"))
        self.anim.append(arcade.load_texture("images/ninja/front_05.png"))

class Coin(BaseSprite):

    def __init__(self, filename, x, y):
        super().__init__(filename, x, y)

        self.anim.append(arcade.load_texture("images/coin/coin_01.png"))
        self.anim.append(arcade.load_texture("images/coin/coin_02.png"))
        self.anim.append(arcade.load_texture("images/coin/coin_03.png"))
        self.anim.append(arcade.load_texture("images/coin/coin_04.png"))
        self.anim.append(arcade.load_texture("images/coin/coin_05.png"))

main.py (complete code)

import arcade
import sprite
import random

class GameView(arcade.View):

    def __init__(self, window):
        super().__init__()
        self.window = window
        self.w = self.window.width
        self.h = self.window.height

        # Background color
        self.background_color = arcade.color.PAYNE_GREY

        # Background sprites
        self.backgrounds = arcade.SpriteList()
        bkg = arcade.Sprite("images/bg_temple.png")
        bkg.center_x = self.w / 2
        bkg.center_y = self.h / 2
        self.backgrounds.append(bkg)

        # Player sprite
        self.players = arcade.SpriteList()
        self.player = sprite.Player(
            "images/ninja/front_01.png",
            x=self.w / 2,
            y=self.h / 2
        )
        self.players.append(self.player)

        # Coin sprites
        self.coins = arcade.SpriteList()
        for i in range(10):
            x = random.random() * self.w
            y = random.random() * self.h
            coin = sprite.Coin(
                "images/coin/coin_01.png",
                x,
                y
            )
            self.coins.append(coin)

        # Score
        self.score = 0
        # Text object
        self.score_text = arcade.Text(
            "SCORE: {}".format(self.score),
            self.w / 2,
            self.h - 20,
            arcade.color.BLACK,
            16,
            anchor_x="center",
            anchor_y="top"
        )

    def on_show(self):
        arcade.set_background_color(self.background_color)

    def on_draw(self):
        self.clear()
        self.backgrounds.draw()
        self.players.draw()
        self.coins.draw()
        self.score_text.draw()

    def on_update(self, delta_time):
        self.players.update(delta_time)
        self.coins.update(delta_time)

        # Player x coin list
        hit_coins = arcade.check_for_collision_with_list(
            self.player,
            self.coins
        )
        for coin in hit_coins:
            coin.remove_from_sprite_lists()
            # Add to score
            self.score += 1
            # Update the text of the text object
            self.score_text.text = "SCORE: {}".format(self.score)

    def on_key_press(self, key, modifiers):
        # Example movement controls (optional)
        if key == arcade.key.LEFT:
            self.player.move(200, 180)
        elif key == arcade.key.RIGHT:
            self.player.move(200, 0)
        elif key == arcade.key.UP:
            self.player.move(200, 90)
        elif key == arcade.key.DOWN:
            self.player.move(200, 270)

    def on_key_release(self, key, modifiers):
        if key in (arcade.key.LEFT, arcade.key.RIGHT,
                   arcade.key.UP, arcade.key.DOWN):
            self.player.stop()

def main():
    window = arcade.Window(800, 600, "Coin Collector")
    game_view = GameView(window)
    window.show_view(game_view)
    arcade.run()

if __name__ == "__main__":
    main()

Kajiru

Fullscreen Controls

  • Enter fullscreen mode
  • Exit fullscreen mode

Result Preview

Result GIF

Next Time…

Thank you for reading!

The next title will be “Playing Sound Effects”.

Stay tuned 👍

Back to Blog

Related posts

Read more »