Difference between revisions of "Gameboard"
From Future Skill
KimSimmons (talk | contribs) |
KimSimmons (talk | contribs) |
||
Line 47: | Line 47: | ||
def __init__(self, context): | def __init__(self, context): | ||
board = GameBoard() | board = GameBoard() | ||
− | + | gfx = context.canvas.new_circle(1.0, '#FF00FF') | |
+ | actor = GamePiece(gfx) | ||
board.place_game_piece(actor, 1, 1) | board.place_game_piece(actor, 1, 1) | ||
</nowiki> | </nowiki> | ||
</div> | </div> | ||
You can use it as-is for many cases or create your own derived class from it for more flexibility. | You can use it as-is for many cases or create your own derived class from it for more flexibility. | ||
+ | |||
+ | ==Pathfinding== | ||
+ | The library comes with some general pathfinding tools that are easily configured with functions in the ''gameboard_helper'' module. | ||
+ | The ''Pathfinding'' class, located in the ''gameboard'' module lets you construct a graph and traverse it with an implementation of the AStar algorithm. It's a very generalized implementation, though nodes are expected to be denoted with integer coordinates (x,y). | ||
+ | |||
+ | ===Quick setup=== | ||
+ | <div style="background: #F0F0F0"> | ||
+ | <nowiki> | ||
+ | from gameboard import GameBoard | ||
+ | from gameboard_helpers import generate_board_pathfinding | ||
+ | |||
+ | class Challenge: | ||
+ | def __init__(self, context): | ||
+ | board = GameBoard() | ||
+ | ... | ||
+ | pathfinding = generate_board_pathfinding(board) | ||
+ | </nowiki> | ||
+ | </div> | ||
+ | |||
+ | ===GamePiece pathfinding=== | ||
+ | You may pass the resulting pathfinding instance to one or more GamePieces. Doing this enables the ''step_towards'' method that makes it very simple to traverse the board. | ||
+ | <div style="background: #F0F0F0"> | ||
+ | <nowiki> | ||
+ | from gameboard import GameBoard, GamePiece | ||
+ | from gameboard_helpers import generate_board_pathfinding | ||
+ | |||
+ | class Challenge: | ||
+ | def __init__(self, context): | ||
+ | board = GameBoard() | ||
+ | ... | ||
+ | pathfinding = generate_board_pathfinding(board) | ||
+ | self.piece = GamePiece(gfx, pathfinding) | ||
+ | board.place_game_piece(self.piece, 0, 0) | ||
+ | |||
+ | def step(self): | ||
+ | self.piece.step_towards(4, 5) | ||
+ | </nowiki> | ||
+ | </div> | ||
+ | Each time ''step_towards'' is called the game piece is moved one step towards the target by referencing the pathfinding graph provided to the game piece's constructor. The method returns true if a step was taken, false otherwise. You may have to refer to the game piece's coordinate to see if it arrived at the goal or if it was unable to move. | ||
+ | |||
+ | ''get_possible_moves'' returns a list of coordinates a game piece may move to based on the pathfinding graph. | ||
+ | |||
+ | ===Helper for generation=== | ||
+ | |||
+ | The ''generate_board_pathfinding'' will likely cover most uses. By default it takes the ''neighbor_delta'' from the board itself to generate connections between cells. If this differs between characters you may provide a move set as the second argument. | ||
+ | The generator will consider walls as blocking if using a ''WalledGameBoard'' and setting the third argument ''wall_check'' to true (default). | ||
+ | It will also consider node weights if added to a cell like <nowiki>board.add_cell(x, y, {'tile_id':'grass', 'weight': 2.0})</nowiki>, making the algorithm avoid higher weight tiles without completely blocking them. |
Revision as of 13:41, 8 April 2021
Contents
[DRAFT] The GameBoard library
A reusable and configurable system for game-like challenges.
[TODO]
- Board quick setup
- Creating and placing a gamepiece
- Pathfinding
- Styling concepts
- Custom board setup
GameBoard quick setup
Here's an example to quickly get up and running:
from gameboard import GameBoard from gameboard_helpers import CommonSetups, Style tiles = { 'grass': {'color': 'green', 'line_color': 'darkgreen'}, 'mud': {'color': 'brown','line_color': 'darkgrey'} } class Challenge: fn __init__(self, context): ... board = GameBoard() CommonSetups.square(board) Style.topdown(board, context.canvas, tiles) board.fill(10, 10, {'tile_id'='grass'}) board.add_cell(2, 3, {'tile_id'='mud'})
The CommonSetups class configures the board to use a square tiled grid with four directions. The Styles class then configures how the board is displayed: the look of the tiles and how they are laid out. [TODO] add link to documentation for CommonSetups and Styles.
You can fit the board into view with the function fit_board_into(board, x, y, w, h), provided in the gameboard_helpers module.
GamePiece
The GamePiece class should be used for anything that can be placed on the GameBoard. You'll mainly control which cell on the board it's located on.
from gameboard import GameBoard, GamePiece class Challenge: def __init__(self, context): board = GameBoard() gfx = context.canvas.new_circle(1.0, '#FF00FF') actor = GamePiece(gfx) board.place_game_piece(actor, 1, 1)
You can use it as-is for many cases or create your own derived class from it for more flexibility.
Pathfinding
The library comes with some general pathfinding tools that are easily configured with functions in the gameboard_helper module. The Pathfinding class, located in the gameboard module lets you construct a graph and traverse it with an implementation of the AStar algorithm. It's a very generalized implementation, though nodes are expected to be denoted with integer coordinates (x,y).
Quick setup
from gameboard import GameBoard from gameboard_helpers import generate_board_pathfinding class Challenge: def __init__(self, context): board = GameBoard() ... pathfinding = generate_board_pathfinding(board)
GamePiece pathfinding
You may pass the resulting pathfinding instance to one or more GamePieces. Doing this enables the step_towards method that makes it very simple to traverse the board.
from gameboard import GameBoard, GamePiece from gameboard_helpers import generate_board_pathfinding class Challenge: def __init__(self, context): board = GameBoard() ... pathfinding = generate_board_pathfinding(board) self.piece = GamePiece(gfx, pathfinding) board.place_game_piece(self.piece, 0, 0) def step(self): self.piece.step_towards(4, 5)
Each time step_towards is called the game piece is moved one step towards the target by referencing the pathfinding graph provided to the game piece's constructor. The method returns true if a step was taken, false otherwise. You may have to refer to the game piece's coordinate to see if it arrived at the goal or if it was unable to move.
get_possible_moves returns a list of coordinates a game piece may move to based on the pathfinding graph.
Helper for generation
The generate_board_pathfinding will likely cover most uses. By default it takes the neighbor_delta from the board itself to generate connections between cells. If this differs between characters you may provide a move set as the second argument. The generator will consider walls as blocking if using a WalledGameBoard and setting the third argument wall_check to true (default). It will also consider node weights if added to a cell like board.add_cell(x, y, {'tile_id':'grass', 'weight': 2.0}), making the algorithm avoid higher weight tiles without completely blocking them.