This document discusses implementing Minecraft in Python using the Pyglet library. It explains that Pyglet is a 3D gaming library that provides a simple OpenGL wrapper. The document outlines the key components of the Python Minecraft code, including a Window class that handles user interaction and rendering, and a Model class that represents the game world as blocks in a 3D grid stored in a dictionary. It also describes techniques like sectorization to speed up rendering by only drawing nearby regions of the world.
6. Minecraft Essentials
Objects are blocks, in 3D grid
Operations
Move: W, S, A, D
Look around: move mouse
Add or remove blocks: click mouse
Textures
7. How Pyglet Helps
3D gaming library - pyglet.org
Simple wrapper for OpenGL
Pure Python
Library not a framework
This is a quick Minecraft code walkthrough,
not a Pyglet tutorial
Tutorial based on Asteroids: steveasleep.com
8. Overview of Structure
Window class
Subclass of Pyglet window class
User interaction, movement, rendering
Model class
Models the world as blocks in 3D grid
“The Whole World is an (x, y, z) Dictionary”
Dictionary world[position]
Where position is tuple (x, y, z)
Each entry contains texture such as
11. Look around
Motion matters (dx, dy), not absolute position
Get ‘look vector’ rotation (as x, y degrees) &
add proportion of motion
Mouse left/right is x (look left/right)
And forward/back is y (look up/down) – max ±90°
14. Adding a Block
Remove any existing block at (x, y, z) position from the
‘world dictionary’
Set texture for this block at position
Update sectors (16x16 2D grid) to record this block
Enables speedup by only rendering some sectors
Show the block, and check if any neighbours now visible
16. Pyglet and More
2D game toolkits:
Cocos2D: http://cocos2d.org/ - uses Pyglet
Fife: http://www.fifengine.net/ - esp. RTSs and RPGs
Add-on libraries that can work with Pyglet:
Rabbyt – sprites:
http://arcticpaint.com/projects/rabbyt/
Pymunk – physics: http://pymunk.org
Alternative frameworks:
Pygame – larger community, more game-specific, open
source book at http://inventwithpython.com/
19. Sect0rization
Technique used to speed up rendering of
world – only render nearby sectors
Sector = 16x16 2D region of world
In Model, dictionary sectors[sector]
maps from sector to list of positions in that
sector
Track player position in sector
If player moves between sectors, determine
which adjacent sectors to show – see
change_sectors()
Notas del editor
Pyglet is actually 60,000 lines of code, and requires some understanding of OpenGL, but is still quite easy to usePanda3D is an alternative higher-end 3D library, more complex to use than Pyglet. Other 3D and gaming libraries are discussed later.
STONE is specially treated because the base of the world is stone (grey colour) – this stops you drilling through the bottom of the world, which would look bad. To see this, remove the layer of earth blocks on the ground until you get to stone.
Now 8000 lines of code, including full inventory, multi-player client/server, etc. Supports compiling to C using Cython for speed, but not as easy to get started with as the original fogleman version.