Implementation of the Flyweight_Exercise() function as used in the Flyweight Pattern. More...
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "helpers/checkforkey.h"
#include "helpers/cursor.h"
#include "helpers/readkey.h"
#include "helpers/sleep.h"
#include "Flyweight_BigResourceManager.h"
#include "Flyweight_Display.h"
#include "Flyweight_Image.h"
#include "Flyweight_Exercise.h"
Go to the source code of this file.
Functions | |
static int | _Flyweight_GenerateBigResource (int numImages, int width, int height) |
Generate a big resource, in this case, a text master "image" of the specified height, containing the specified number of smaller images laid out horizontally, using the given width for each image. | |
static void | _Flyweight_MoveFlyweights (Flyweight_ImageList *imageList, int display_width, int display_height) |
Move the given flyweight instances within the display, bouncing them off the edges of the display. | |
static void | _Flyweight_RenderFlyweights (Flyweight_ImageList *imageList, Display *displayArea) |
Render the image into the display, once for each flyweight instance. | |
static double | GenerateVelocity (void) |
Generate a random velocity, which includes a speed and a direction. The velocity is 0.2 to 1.0 (in increments of 0.2) and the direction is either + or -. | |
static void | _Flyweight_GenerateFlyweightClasses (int bigResourceId, int numFlyweights, int image_width, int image_height, int display_width, int display_height, Flyweight_ImageList *imageList) |
Helper function to generate the specified number of Flyweight_image objects and associate those objects with individual contexts and a single big resource. | |
static void | _Flyweight_ClearDisplay (Display *display) |
Clear the "display" to a background image, erasing whatever was there before. | |
static void | _Flyweight_GenerateDisplay (Display *display, int width, int height) |
Generate a display area in which to render the big resource. | |
static void | _Flyweight_ShowDisplay (Display *display) |
Render the display to the screen. | |
void | Flyweight_Exercise (void) |
Example of using the Flyweight design pattern. | |
Implementation of the Flyweight_Exercise() function as used in the Flyweight Pattern.
Definition in file Flyweight_Exercise.c.
|
static |
Clear the "display" to a background image, erasing whatever was there before.
display | A list of character arrays representing the display. |
Definition at line 277 of file Flyweight_Exercise.c.
References Display::area, Display::height, and Display::width.
Referenced by _Flyweight_GenerateDisplay(), DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Generate a big resource, in this case, a text master "image" of the specified height, containing the specified number of smaller images laid out horizontally, using the given width for each image.
If there are 5 images requested, then create a single image that is 5 * width
wide and 1 * height
tall.
numImages | Number of images to images to store in the single big resource (horizontally), between 1 and 9. |
width | Width of the "text" image, in characters. Minimum width is 3. |
height | Height of the "text" image, in characters. Minimum height is 3. |
Definition at line 40 of file Flyweight_Exercise.c.
References BigResourceManager_AddResource(), BigResource::data, and BigResource::numImages.
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Generate a display area in which to render the big resource.
display | A Display object to initialize as the "display" window. |
width | Width of the display area. |
height | Height of the display area. |
Definition at line 299 of file Flyweight_Exercise.c.
References _Flyweight_ClearDisplay(), and Display_Create().
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Helper function to generate the specified number of Flyweight_image objects and associate those objects with individual contexts and a single big resource.
The image and display sizes are provided so as to randomize the position of each flyweight within the display.
bigResourceId | ID of the big resource to use. |
numFlyweights | Number of flyweight instances to create. |
image_width | Width of the big resource image. |
image_height | Height of the big resource image. |
display_width | Width of the display in which the flyweight is to be rendered. |
display_height | Height of the display in which the flyweight is to be rendered. |
imageList | A Flyweight_ImageList object to be filled in with the generated Flyweight_Image objects. |
Definition at line 246 of file Flyweight_Exercise.c.
References Flyweight_Image::BigResourceId, Flyweight_Image::Context, Flyweight_ImageList_Add(), GenerateVelocity(), Flyweight_Context::ImageHeight, Flyweight_Context::ImageWidth, Flyweight_Context::OffsetXToImage, Flyweight_Context::Position_X, Flyweight_Context::Position_Y, Flyweight_Context::Velocity_X, and Flyweight_Context::Velocity_Y.
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Move the given flyweight instances within the display, bouncing them off the edges of the display.
The display size and image size are provided here
imageList | List of Flyweight_Class instances to move. |
display_width | Width of display. |
display_height | Height of display. |
Definition at line 142 of file Flyweight_Exercise.c.
References Flyweight_Image::Context, Flyweight_Context::ImageHeight, Flyweight_ImageList::images, Flyweight_ImageList::images_count, Flyweight_Context::ImageWidth, Flyweight_Context::Position_X, Flyweight_Context::Position_Y, Flyweight_Context::Velocity_X, and Flyweight_Context::Velocity_Y.
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Render the image into the display, once for each flyweight instance.
imageList | List of Flyweight_Image objects to render. |
displayArea | The "display" in which to render. |
Definition at line 196 of file Flyweight_Exercise.c.
References BigResource_Render(), Flyweight_Image::BigResourceId, Flyweight_Image::Context, Flyweight_Context::ImageHeight, Flyweight_ImageList::images, Flyweight_ImageList::images_count, Flyweight_Context::ImageWidth, Flyweight_Context::OffsetXToImage, Flyweight_Context::Position_X, and Flyweight_Context::Position_Y.
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
|
static |
Render the display to the screen.
display | The Display object to output to the console. |
Definition at line 311 of file Flyweight_Exercise.c.
References Display::area, and Display::height.
Referenced by DesignPatternExamples_cpp::Flyweight_Exercise(), and Flyweight_Exercise().
void Flyweight_Exercise | ( | void | ) |
Example of using the Flyweight design pattern.
The Flyweight pattern is used when a large object needs to be represented by a much lighter weight class, possibly multiple instances of said light-weight class.
In this example, a large object is represented by a so-called "big resource" (a two-dimensional array of text characters) containing multiple images, one associated with each flyweight class. Flyweight classes that represent offset into the big resource, along with position and velocity, are attached to the big resource image so they all share the same image but have different positions and velocities. The image is rendered to a display area through the Flyweight class. The Flyweight class instances then have their positions updated, bouncing off the edges of the display area 60 times a second. This continues for 1000 iterations or until a key is pressed.
Definition at line 346 of file Flyweight_Exercise.c.
References _Flyweight_ClearDisplay(), _Flyweight_GenerateBigResource(), _Flyweight_GenerateDisplay(), _Flyweight_GenerateFlyweightClasses(), _Flyweight_MoveFlyweights(), _Flyweight_RenderFlyweights(), _Flyweight_ShowDisplay(), BigResourceManager_Clear(), checkforkey(), disableinputecho(), Display_Destroy(), enableinputecho(), Flyweight_ImageList_Clear(), getcursorposition(), readkey(), setcursorposition(), and sleep().
|
static |
Generate a random velocity, which includes a speed and a direction. The velocity is 0.2 to 1.0 (in increments of 0.2) and the direction is either + or -.
Definition at line 223 of file Flyweight_Exercise.c.
Referenced by Flyweight_Exercise::_Flyweight_GenerateFlyweightClasses(), and _Flyweight_GenerateFlyweightClasses().