It just so happens that I have an include for that. Feel free to use it if you like. Change the GAME_WIDTH and GAME_HEIGHT constants to your desired resolution. Note that it includes functionality for saving and loading display settings. If it doesn't find a display_settings file in your App directory (NOT your source directory), it will create one.
//////////////////////////////////////
// Render Image Based Display
// Author: Hendron
////////////////////////////////////
#constant GAME_WIDTH = 320
#constant GAME_HEIGHT = 180
type tDisplaySettings
windowSize
vsync
fullscreen
pixelPerfect
refreshRate
endtype
type tDisplay
settings as tDisplaySettings
renderImage
renderSprite
screenWidth as float
screenHeight as float
endtype
global gDisplay as tDisplay
function InitDisplay()
// common display settings
SetDefaultMinFilter(0)
SetDefaultMagFilter(0)
SetTextDefaultMinFilter(0)
SetTextDefaultMagFilter(0)
SetPrintSize(16)
// load display settings from file,
// or create file and save default settings
// if not found
if GetFileExists("display_settings")
_file = OpenToRead("display_settings")
_json$ = ReadString(_file)
gDisplay.settings.fromJSON(_json$)
CloseFile(_file)
else
LoadDefaultDisplaySettings()
SaveDisplaySettings()
endif
ApplyDisplaySettings()
endfunction
function ApplyDisplaySettings()
// get rid of current render image and sprite
if GetImageExists(gDisplay.renderImage)
DeleteImage(gDisplay.renderImage)
endif
if GetSpriteExists(gDisplay.renderSprite)
DeleteSprite(gDisplay.renderSprite)
endif
// setup window
SetWindowSize(GAME_WIDTH * gDisplay.settings.windowSize, GAME_HEIGHT * gDisplay.settings.windowSize, gDisplay.settings.fullscreen)
gDisplay.screenWidth = GetDeviceWidth()
gDisplay.screenHeight = GetDeviceHeight()
SetVirtualResolution(gDisplay.screenWidth, gDisplay.screenHeight)
SetWindowAllowResize(0)
SetSyncRate(gDisplay.settings.refreshRate, 1)
SetVSync(gDisplay.settings.vsync)
// create render image and sprite
gDisplay.renderImage = CreateRenderImage(GAME_WIDTH, GAME_HEIGHT, 0, 0)
// create render sprite
gDisplay.renderSprite = CreateSprite(gDisplay.renderImage)
// find the render sprite size based on settings
_scaleW# = gDisplay.screenWidth / _toFloat(GAME_WIDTH)
_scaleH# = gDisplay.screenHeight / _toFloat(GAME_HEIGHT)
_scale# = _scaleW#
if _scaleH# < _scaleW#
_scale# = _scaleH#
endif
if gDisplay.settings.pixelPerfect
_scale# = floor(_scale#)
endif
SetSpriteSize(gDisplay.renderSprite, GAME_WIDTH * _scale#, GAME_HEIGHT * _scale#)
SetSpriteOffset(gDisplay.renderSprite, GetSpriteWidth(gDisplay.renderSprite) / 2, GetSpriteHeight(gDisplay.renderSprite) / 2)
SetSpritePositionByOffset(gDisplay.renderSprite, gDisplay.screenWidth / 2, gDisplay.screenHeight / 2)
FixSpriteToScreen(gDisplay.renderSprite, 1)
// setup render image for drawing
SetVirtualResolution(GAME_HEIGHT, GAME_WIDTH)
SetRenderToImage(gDisplay.renderImage, -1)
SetSpriteVisible(gDisplay.renderSprite, 0)
endfunction
function LoadDefaultDisplaySettings()
gDisplay.settings.windowSize = 3
gDisplay.settings.vsync = 1
gDisplay.settings.fullscreen = 0
gDisplay.settings.pixelPerfect = 1
gDisplay.settings.refreshRate = 0
endfunction
function SaveDisplaySettings()
_file = OpenToWrite("display_settings")
_json$ = gDisplay.settings.toJSON()
WriteString(_file, _json$)
CloseFile(_file)
endfunction
function UpdateDisplay()
Update(GetFrameTime())
Render()
SetRenderToScreen()
SetVirtualResolution(GetDeviceWidth(), GetDeviceHeight())
SetSpriteVisible(gDisplay.renderSprite, 1)
DrawSprite(gDisplay.renderSprite)
Swap()
SetSpriteVisible(gDisplay.renderSprite, 0)
SetRenderToImage(gDisplay.renderImage, -1)
SetVirtualResolution(GAME_WIDTH, GAME_HEIGHT)
SetCameraAspect(1, _toFloat(GAME_WIDTH) / _toFloat(GAME_HEIGHT))
SetClearColor(0,0,0)
ClearScreen()
SetClearColor(64,64,64)
endfunction
function ToggleFullscreen()
gDisplay.settings.fullScreen = 1 - gDisplay.settings.fullScreen
ApplyDisplaySettings()
endfunction
function TogglePixelPerfect()
gDisplay.settings.pixelPerfect = 1 - gDisplay.settings.pixelPerfect
ApplyDisplaySettings()
endfunction
function ToggleVSync()
gDisplay.settings.vsync = 1 - gDisplay.settings.vsync
ApplyDisplaySettings()
endfunction
function SetDisplayWindowSize(size as integer)
if size < 1 then exitfunction
if size = gDisplay.settings.windowSize then exitfunction
if gDisplay.settings.fullscreen then ToggleFullscreen()
gDisplay.settings.windowSize = size
ApplyDisplaySettings()
endfunction
function GetGameXFromScreen(x as float)
_gx# = (x / gDisplay.screenWidth) * GAME_WIDTH
endfunction _gx#
function GetGameYFromScreen(y as float)
_gy# = (y / gDisplay.screenHeight) * GAME_HEIGHT
endfunction _gy#
function _toFloat(_value as float)
endfunction _value
Save it as display.agc in your project. Here's an example of how to use it. Note that you don't need to call Sync() in your main loop.
#include "display.agc"
CreateObjectBox(1, 10, 10, 10)
InitDisplay()
do
RotateObjectGlobalY(1, 90 * GetFrameTime())
Print(ScreenFPS())
// press space to toggle integer scaling
if GetRawKeyPressed(32)
TogglePixelPerfect()
endif
// press F to toggle fullscreen
if GetRawKeyPressed(70)
ToggleFullscreen()
endif
// press V to toggle vsync
if GetRawKeyPressed(86)
ToggleVSync()
endif
// press 1 - 4 to set window size
select GetRawLastKey()
case 49:
SetDisplayWindowSize(1)
endcase
case 50:
SetDisplayWindowSize(2)
endcase
case 51:
SetDisplayWindowSize(3)
endcase
case 52:
SetDisplayWindowSize(4)
endcase
endselect
UpdateDisplay()
loop
EDIT: This reminded me that there were some things I hadn't implemented yet. Updated.