DynamicSprite - adventuregamestudio/ags-manual GitHub Wiki
DynamicSprite
functions and properties
DynamicSprite lets you create a new sprite dynamically at runtime,
either a new blank sprite, a copy of the existing one, or load one from a file.
DynamicSprites may be modified in various ways, and drawn upon. The latter is done by
retrieving a DrawingSurface
with GetDrawingSurface()
function.
Each new DynamicSprite is assigned an arbitrary ID, which may be read with Graphic
property.
This ID lets you assign DynamicSprite to any property that normally accepts a sprite number, or pass into any function that
accepts a sprite number as a parameter.
IMPORTANT: DynamicSprite exist so long as it is assigned to at least one DynamicSprite*
variable in your script.
As soon as there's no variable that has a reference to it, the sprite is disposed.
This also means that if you only have a local DynamicSprite*
variable, then the sprite will be disposed
when the function ends. If you want to keep the sprite, then you should store it in a global variable for as long as you need it.
You may also call Delete
function anytime to explicitly remove the sprite's image from memory.
IMPORTANT: Assigning DynamicSprite's ID to another object (such as Button.NormalGraphic
, for example)
does not count as a reference. If DynamicSprite is deleted while its ID is assigned to another object's property,
that property will be reset to 0 for safety reasons.
DynamicSprite.Create
static DynamicSprite* DynamicSprite.Create(int width, int height,
optional bool hasAlphaChannel)
Creates a new blank dynamic sprite of the specified size. It will initially be fully transparent, and can optionally have an alpha channel. This command is useful if you just want to create a new sprite and then use the DrawingSurface commands to draw onto it.
If the game color depth is lower than 32-bit, then the hasAlphaChannel parameter will be ignored.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
// Declare a variable in a global scope (outside of any function)
DynamicSprite* globalSprite;
// Then in a function...
DynamicSprite* sprite = DynamicSprite.Create(50, 30);
DrawingSurface *surface = sprite.GetDrawingSurface();
surface.DrawingColor = 14;
surface.DrawPixel(25, 15);
surface.Release();
oMyObject.Graphic = sprite.Graphic;
globalSprite = sprite; // keep the sprite in a global variable
creates a 50x30 sprite, draws a white dot in the middle, then assigns to a global variable to keep the sprite, and sets this sprite's ID to an Object.
See also: DynamicSprite.Delete
,
DynamicSprite.Graphic
,
DynamicSprite.GetDrawingSurface
DynamicSprite.CreateFromBackground
static DynamicSprite* DynamicSprite.CreateFromBackground(
optional int frame, optional int x, optional int y,
optional int width, optional int height)
Creates a new dynamic sprite containing a copy of the specified room background.
The most basic use of this function is to supply no parameters, in which case the sprite will contain an exact copy of the current room background.
If you want, you can supply the frame only, in which case you will get a complete copy of that background frame number from the current room.
Optionally, you can specify a portion of the background to grab. You must either supply all or none of the x, y, width and height parameters; if you do supply them, this allows you to just get a small portion of the background image into the new sprite. All co-ordinates are room co-ordinates.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromBackground(GetBackgroundFrame(), 130, 70, 60, 60);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(0, 0, sprite.Graphic);
surface.Release();
sprite.Delete();
creates a copy of the center 60x60 area of the current room's background, and draws it onto the top left corner of the background image. Then disposes the temporary sprite.
See also: DynamicSprite.Delete
DynamicSprite.CreateFromDrawingSurface
static DynamicSprite* DynamicSprite.CreateFromDrawingSurface(
DrawingSurface* surface, int x, int y,
int width, int height)
Creates a new dynamic sprite containing a copy of the specified portion of the drawing surface. This allows you to easily create new sprites from portions of other sprites.
NOTE: The x, y, width and height parameters respect the
DrawingSurface's
UseHighResCoordinates
setting, so make sure that the type of co-ordinates that you are using
match up with what the drawing surface expects.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
// Declare a variable in a global scope (outside of any function)
DynamicSprite* globalSprite;
// Then in a function...
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(oMyObject.Graphic);
DrawingSurface *surface = sprite.GetDrawingSurface();
DynamicSprite *newSprite = DynamicSprite.CreateFromDrawingSurface(surface, 0, 0, 10, 10);
surface.Release();
sprite.Delete();
oMyObject.Graphic = newSprite.Graphic;
globalSprite = newSprite; // keep the sprite in a global variable
changes object's image to be just the top-left corner of what it previously was.
Compatibility: Supported by AGS 3.0.2 and later versions.
See also: DynamicSprite.Delete
DynamicSprite.CreateFromExistingSprite
static DynamicSprite* DynamicSprite.CreateFromExistingSprite(
int slot, optional bool preserveAlphaChannel)
Creates a new dynamic sprite containing a copy of the specified sprite slot.
Returns the DynamicSprite instance representing the new sprite. This function is useful as it effectively allows you to apply transformations such as resizing to any sprite in the game.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
preserveAlphaChannel determines whether the sprite's alpha channel will also be copied across. It is false by default for backwards compatibility reasons, and is useful because it allows you to strip the alpha channel in order to do whole image transparency. This parameter has no effect with sprites that do not have an alpha channel.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
// Declare a variable in a global scope (outside of any function)
DynamicSprite* globalSprite;
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(myObject.Graphic);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawingColor = 14;
surface.DrawLine(0, 0, surface.Width, surface.Height);
surface.Release();
oMyObject.Graphic = newSprite.Graphic;
globalSprite = newSprite; // keep the sprite in a global variable
creates a copy of object's current sprite, draws a line across, and assigns back to the same object.
See also: DynamicSprite.Delete
,
DynamicSprite.Resize
DynamicSprite.CreateFromFile
(Formerly known as LoadImageFile
, which is now obsolete)
static DynamicSprite* DynamicSprite.CreateFromFile(string filename)
Loads an external image FILENAME into memory as a sprite.
Returns the DynamicSprite instance representing the sprite, or null if the image could not be loaded (file not found or unsupported format).
Only BMP and PCX files can be loaded with this command.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
NOTE: Since AGS 3.4.1 you can use location tokens in filename, like
with File.Open
and similar commands.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
if (sprite != null) {
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 80, sprite.Graphic);
surface.Release();
sprite.Delete();
}
will load the file "CustomAvatar.bmp" and if successful draw the image near the middle of the background.
Once the image is finished with, Delete should be called on it.
See also: DynamicSprite.CreateFromExistingSprite
,
DynamicSprite.CreateFromScreenshot
,
DynamicSprite.Delete
DynamicSprite.CreateFromSaveGame
(Formerly known as LoadSaveSlotScreenshot
, which is now obsolete)
static DynamicSprite* DynamicSprite.CreateFromSaveGame(
int saveSlot, int width, int height)
Loads the screenshot for save game SAVESLOT into memory, resizing it to WIDTH x HEIGHT.
Returns the DynamicSprite instance of the image if successful, or returns null if the screenshot could not be loaded (perhaps the save game didn't include one).
In order for this to work, the "Save screenshots in save games" option must be ticked in the main Game Settings pane.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
// at top of script, outside event functions
DynamicSprite *buttonSprite;
// inside an event function
buttonSprite = DynamicSprite.CreateFromSaveGame(1, 50, 50);
if (buttonSprite != null) {
btnScrnshot.NormalGraphic = buttonSprite.Graphic;
}
will load the screenshot for save game 1 and resize it to 50x50. It then places it onto the btnScrnshot GUI button.
Once the GUI is disposed of, Delete should be called on the sprite.
See also: DynamicSprite.Delete
,
Game.GetSaveSlotDescription
,
DynamicSprite.CreateFromExistingSprite
DynamicSprite.CreateFromFile
,
DynamicSprite.CreateFromScreenShot
DynamicSprite.CreateFromScreenShot
static DynamicSprite* DynamicSprite.CreateFromScreenShot(
optional int width, optional int height)
Creates a new DynamicSprite instance with a copy of the current screen in it, resized to WIDTH x HEIGHT. If you do not supply the width or height, then a full screen sized sprite will be created.
This command can be useful if you're creating a save game screenshots GUI, in order to display the current game position as well as the saved slot positions.
NOTE: This command can be slow when using the Direct3D graphics driver.
Use the Graphic
property of the
DynamicSprite to interface with other commands and to use the new sprite
in the game.
Example:
DynamicSprite* ds = DynamicSprite.CreateFromScreenShot(50, 50);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 100, ds.Graphic);
surface.Release();
ds.Delete();
takes a screen shot, and draws it onto the background scene at (100,100).
See also: DynamicSprite.Delete
,
Game.GetSaveSlotDescription
,
DynamicSprite.CreateFromExistingSprite
DynamicSprite.CreateFromFile
,
DynamicSprite.CreateFromSaveGame
DynamicSprite.ChangeCanvasSize
DynamicSprite.ChangeCanvasSize(int width, int height, int x, int y);
Changes the sprite size to width x height, placing the current image
at offset (x, y) within the new canvas. Unlike the
Resize
command, the current image is
kept at its original size.
This function allows you to enlarge the sprite background in order to
draw more onto it than its current boundaries allow. It is effectively
the opposite of Crop
. The additional
surface area will be transparent.
The width and height are specified in pixels.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(10);
sprite.ChangeCanvasSize(sprite.Width + 10, sprite.Height, 5, 0);
DrawingSurface *surface = sprite.GetDrawingSurface();
surface.DrawingColor = 14;
surface.DrawLine(0, 0, 5, surface.Height);
surface.Release();
sprite.Delete();
creates a dynamic sprite as a copy of sprite 10, enlarges it by 5 pixels to the left and right, and draws a line in the new area to the left.
See also: DynamicSprite.Crop
,
DynamicSprite.Resize
,
DynamicSprite.Height
,
DynamicSprite.Width
DynamicSprite.CopyTransparencyMask
DynamicSprite.CopyTransparencyMask(int fromSpriteSlot)
Copies the transparency mask from the specified sprite slot onto the dynamic sprite. The dynamic sprite's transparency and/or alpha channel will be replaced with the one from the other sprite.
This command is designed for special effects. It is fairly slow since it involves inspecting each pixel of the image, so it's not recommended that you use it often.
The source sprite must be the same size and color depth as the dynamic sprite.
NOTE: This command makes all pixels that are transparent in the source sprite also transparent in the dynamic sprite. It does not make opaque pixels from the source sprite into opaque pixels on the dynamic sprite (because it wouldn't know what color to make them).
If the source image has an alpha channel, then the dynamic sprite will have an alpha channel created as a copy of the one from the source sprite.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(10);
sprite.CopyTransparencyMask(11);
object[0].Graphic = sprite.Graphic;
Wait(80);
sprite.Delete();
creates a dynamic sprite as a copy of sprite 10, changes its transparency mask to use that of sprite 11, and displays it on object 0.
See also:
DynamicSprite.CreateFromExistingSprite
DynamicSprite.Crop
DynamicSprite.Crop(int x, int y, int width, int height);
Crops the sprite down to width x height, starting from (x,y) in the image. The width and height are specified in pixels.
This allows you to trim the edges off a sprite, and perform related tasks. Only the area with its top-left corner as (x,y) and of WIDTH x HEIGHT in size will remain.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(10);
sprite.Crop(10, 10, sprite.Width - 10, sprite.Height - 10);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 100, sprite.Graphic);
surface.Release();
sprite.Delete();
will create a dynamic sprite as a copy of sprite 10, cut off the left and top 10 pixels, and then draw it onto the room background at (100,100).
See also:
DynamicSprite.ChangeCanvasSize
,
DynamicSprite.Flip
,
DynamicSprite.Height
,
DynamicSprite.Width
DynamicSprite.Delete
(Formerly known as DeleteSprite
, which is now obsolete)
DynamicSprite.Delete();
Deletes the specified dynamic sprite from memory. Use this when you are no longer displaying the sprite and it can be safely disposed of.
You do not normally need to delete sprites, since the AGS Sprite Cache manages loading and deleting sprites automatically.
However, when an extra sprite has been loaded into the game (for example, with the CreateFromFile or CreateFromScreenShot commands) then AGS does not delete it automatically, and you must call this command instead.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
object[1].Graphic = sprite.Graphic;
Wait(200);
object[1].Graphic = 22;
sprite.Delete();
will load the file "CustomAvatar.bmp", change Object 1 to display this graphic, wait 5 seconds, then change object 1 back to its old sprite 22 and free the new image.
See also:
DynamicSprite.CreateFromScreenShot
,
DynamicSprite.Graphic
DynamicSprite.Flip
DynamicSprite.Flip(eFlipDirection);
Flips the dynamic sprite according to the parameter:
eFlipLeftToRight flips the image from left to right eFlipUpsideDown flips the image from top to bottom eFlipBoth flips the image from top to bottom and left to right
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
sprite.Flip(eFlipUpsideDown);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 100, sprite.Graphic);
surface.Release();
sprite.Delete();
will load the CustomAvatar.bmp image, flip it upside down, and then draw it onto the room background at (100,100).
See also: DynamicSprite.Crop
,
DynamicSprite.Resize
,
DynamicSprite.Rotate
DynamicSprite.GetDrawingSurface
DrawingSurface* DynamicSprite.GetDrawingSurface();
Gets the drawing surface for this dynamic sprite, which allows you to modify the sprite by drawing onto it in various ways.
After calling this method, use the various DrawingSurface functions to modify the sprite, then call Release on the surface when you are finished.
Example:
DynamicSprite *sprite = DynamicSprite.CreateFromExistingSprite(object[0].Graphic);
DrawingSurface *surface = sprite.GetDrawingSurface();
surface.DrawingColor = 13;
surface.DrawLine(0, 0, 20, 20);
surface.Release();
object[0].Graphic = sprite.Graphic;
Wait(40);
sprite.Delete();
this creates a dynamic sprite as a copy of Object 0's existing sprite, draws a pink diagonal line across it, sets this new sprite onto the object for 1 second and then removes it.
See also:
DynamicSprite.CreateFromExistingSprite
,
DrawingSurface.DrawLine
,
DrawingSurface.Release
DynamicSprite.Resize
DynamicSprite.Resize(int width, int height);
Resizes an existing dynamic sprite to WIDTH x HEIGHT pixels.
NOTE: Resizing is a relatively slow operation, so do not attempt to resize sprites every game loop; only do it when necessary.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(10);
sprite.Resize(sprite.Width * 2, sprite.Height * 2);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 100, sprite.Graphic);
surface.Release();
sprite.Delete();
will create a dynamic sprite as a copy of sprite 10, stretch it to double its original size, and then draw it onto the room background at (100,100).
See also:
DynamicSprite.ChangeCanvasSize
,
DynamicSprite.Crop
,
DynamicSprite.Flip
,
DynamicSprite.Rotate
,
DynamicSprite.Height
,
DynamicSprite.Width
DynamicSprite.Rotate
DynamicSprite.Rotate(int angle, optional int width, optional int height)
Rotates the dynamic sprite by the specified angle. The angle is in degrees, and must lie between 1 and 359. The image will be rotated clockwise by the specified angle. For a counter-clockwise rotation - convert the angle to a clockwise one using formula: "angle = ((-counter_angle) + 360)".
Optionally, you can specify the width and height of the rotated image. By default, AGS will automatically calculate the new size required to hold the rotated image, but you can override this by passing the parameters in. Note that specifying a width/height does not stretch the image, it just allows you to set the final sprite dimensions. The rotated image will be centered in the sprite.
NOTE: Sprite may have to be resized in order to accomodate rotated image. This is not because the image is scaled, but because after rotation original image's corners may be positioned "outside" of the initial rectangle. Because sprite is resized, and image is centered in it, it may look like image is moving towards right-bottom. To counter that effect when you draw this sprite somewhere, you have change the sprite's position, subtracting a difference of half its width and height, for example:
int x = (Game.SpriteWidth[original_sprnum] - sprite.Width) / 2;
int y = (Game.SpriteHeight[original_sprnum] - sprite.Height]) / 2;
surface.DrawImage(x, y, sprite.Graphic);
NOTE: Rotating is a "lossy" operation. This means that each time you rotate a sprite it will loose a bit of image quality (except when rotated by 90, 180 and 270 degrees). High-resolution sprites will loose quality slower in general, but will nevertheless. If you have to rotate a sprite multiple times, the solution is to keep the original sprite and rotate its new copy to a new angle each time, instead of rotating same sprite over and over again.
NOTE: Rotating is a relatively slow operation, try keeping a number of sprites rotated each game loop low, and do it only when necessary.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(10);
sprite.Rotate(90);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 100, sprite.Graphic);
surface.Release();
sprite.Delete();
will create a dynamic sprite as a copy of sprite 10, rotate it 90 degrees clockwise, draw the result onto the screen, and then delete the image.
See also: DynamicSprite.Flip
,
DynamicSprite.Resize
,
DynamicSprite.Height
,
DynamicSprite.Width
DynamicSprite.SaveToFile
DynamicSprite.SaveToFile(string filename)
Saves the dynamic sprite to the specified file.
The filename you supply must have a .PCX or .BMP extension; they are the only two file types that the engine supports.
Returns 1 if the sprite was saved successfully, or 0 if it failed.
NOTE: Since AGS 3.4.1 you can use location tokens in filename, like
with File.Open
and similar commands.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
sprite.Rotate(90);
sprite.SaveToFile("RotatedAvatar.bmp");
sprite.Delete();
will load the CustomAvatar.bmp image, rotate it 90 degrees clockwise, then save the result back to the disk.
See also:
DynamicSprite.CreateFromFile
,
SaveScreenShot
DynamicSprite.Tint
DynamicSprite.Tint(int red, int green, int blue, int saturation, int luminance)
Tints the dynamic sprite to (RED, GREEN, BLUE) with SATURATION percent
saturation. For the meaning of all the parameters, see
SetAmbientTint
.
The tint set by this function is permanent for the dynamic sprite -- after the tint has been set, it is not possible to remove it. If you call Tint again with different parameters, it will apply the new tint to the already tinted sprite from the first call.
NOTE: This function only works with hi-color sprites.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromExistingSprite(object[0].Graphic);
sprite.Tint(255, 0, 0, 100, 100);
DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawImage(100, 80, sprite.Graphic);
surface.Release();
sprite.Delete();
creates a copy of object 0's sprite, tints it red, and draws it onto the room background.
See also: DynamicSprite.Flip
,
DynamicSprite.Height
,
DynamicSprite.Width
,
SetAmbientTint
DynamicSprite.ColorDepth
readonly int DynamicSprite.ColorDepth;
Gets the color depth of this dynamic sprite. This can be 8, 16 or 32 and is not necessarily the same as the game color depth (though this usually will be the case).
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
if (sprite != null) {
Display("The image is %d x %d pixels, at %d-bit depth.", sprite.Width, sprite.Height, sprite.ColorDepth);
sprite.Delete();
}
displays the color depth of the CustomAvatar.bmp image.
See also: DynamicSprite.Height
,
DynamicSprite.Width
DynamicSprite.Graphic
readonly int DynamicSprite.Graphic;
Gets the sprite slot number in which this dynamic sprite is stored. This
value can then be passed to other functions and properties, such as
Button.NormalGraphic
.
Example:
// at top of script, outside event functions
DynamicSprite *buttonSprite;
// inside an event function
buttonSprite = DynamicSprite.CreateFromScreenShot(80, 50);
if (buttonSprite != null) {
btnScrnshot.NormalGraphic = buttonSprite.Graphic;
}
places a screen grab of the current game session onto btnScrnshot.
Once the GUI is disposed of, Delete should be called on the sprite.
See also:
DynamicSprite.CreateFromScreenShot
,
DynamicSprite.Delete
DynamicSprite.Height
readonly int DynamicSprite.Height;
Gets the height of this dynamic sprite. The height is always returned in pixels.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
if (sprite != null) {
Display("The image is %d x %d pixels.", sprite.Width, sprite.Height);
sprite.Delete();
}
displays the size of the CustomAvatar.bmp image.
See also: DynamicSprite.Resize
,
DynamicSprite.Width
DynamicSprite.Width
readonly int DynamicSprite.Width;
Gets the width of this dynamic sprite. The width is always returned in pixels.
Example:
DynamicSprite* sprite = DynamicSprite.CreateFromFile("CustomAvatar.bmp");
if (sprite != null) {
Display("The image is %d x %d pixels.", sprite.Width, sprite.Height);
sprite.Delete();
}
displays the size of the CustomAvatar.bmp image.
See also: DynamicSprite.Height
,
DynamicSprite.Resize