Installing packages with Kivy is a joy because you cannot use virtual environments (assuming you use the Kivy package installer). Kivy creates its own unique snowflake environment, then provides a `kivy` command-line utility that heavily modifies your `PYTHONPATH` before ultimately launching the python interpreter. Thus, virtual environments are off the table, as none of their packages can be imported after using `kivy`.

Those familiar with Kivy know that the your project's main `App` class is required to define a `build()` function that returns the root widget. For `Okapi`, that root widget is of the `ScreenManager` class. It is this widget's job to swap in and out loading screens, the game screen, menu screens, high score screens, etc.

An example of overriding the `ScreenManager` class is provided in the Rodent's Revenge game, but here is a bare minimum example:

If implemented, should return a `Screen` widget that says something like "Hello, welcome to my game!" and has a click listener. The `OkapiScreenManager` will listen for that click and start the game. """ return WelcomeScreen()

def get_screen_from_game(self): """ Required.

Should do something with `self.game` to get a Screen widget used to start and render the game. """ return self.game.get_screen()

```

#### Listening to Kivy's clock

The `ScreenManager` is also a clean interface to Kivy's clock module. Your `ScreenManager` keeps track of a `current_screen` attribute,and whenever this changes it unregisters any clock listeners from the previous screen and registers the new screen's clock listeners.

The `OkapiGame` class provides a function called `move_actor`. Let's say you are building a chess app. To move a knight, you would make a call like this:

```pyself.game.move_actor(self.white_knight_1, 1, 2)```

This will immediately cause a reanimation, showing the white knight having just moved.

#### Moving Rules

Moving legality is determined by the target ground's `can_accommodate()` method. By default, this rejects movements into occupied territory. Of course, that rule makes little sense for chess, so for that example you'd want to override that function to accept new pieces at any time, and to remove from the game any piece currently found in that spot.