TGC Codebase Backup



Extended API by GarBenjamin

5th Sep 2018 3:59
Summary

Implements some fundamental functionality that is not contained within the native API.



Description

Implements some fundamental functionality that is not contained within the native API. Ideally, in time, this will be split out into 3 different files: APIGeneral.agc, API2D.agc and API3D.agc Currently, I have put everything into the APIGeneral.agc file even though there are a few sprite functions. Implements the following... CONSTANT DECLARATIONS: TRUE, FALSE, TRANSPARENCY_MODE_OFF, TRANSPARENCY_MODE_ALPHA, TRANSPARENCY_MODE_ADDITIVE, KEY_LEFT, KEY_A, KEY_RIGHT, KEY_D, KEY_UP, KEY_W, KEY_DOWN, KEY_S, KEY_T, KEY_E, KEY_SPACE, KEY_N, KEY_ESC, KEY_Z, KEY_X, KEY_C, KEY_SHIFT, KEY_ENTER, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_F1, KEY_F2, KEY_F3 and KEY_F4. TYPES: TVector2D. GENERAL FUNCTIONS: InitDisplay(title as string, width as integer, height as integer, maxFrameRate as float, allowResize as integer, fullscreen as integer), MinF(value1 as float, value2 as float), Min(value1 as integer, value2 as integer), MaxF(value1 as float, value2 as float), Max(value1 as integer, value2 as integer), SgnF(value as float), Sgn(value as integer) and GetFormatedInteger(value as integer, totalLength as integer). 2D VECTOR FUNCTIONS: Vector2DGetRatios(v2d ref as TVector2D) and Vector2DNormalize(v2d ref as TVector2D). ANGLE FUNCTIONS: AngleGetDistanceToAngle(fromAngle as float, toAngle as float), AngleGetShortestDistanceToAngle(fromAngle as float, toAngle as float), AngleIsWithin(testAngle as float, AngleToCompareTo as float, degrees as float), AngleIsBetween(testAngle as float, Angle1 as float, Angle2 as float) and AngleAddWithLimits(angle as float, valueToAdd as float, angleMin as float, angleMax as float). SPRITE FUNCTIONS: SetSpriteFaceSprite(sprite as integer, SpriteToFace as integer), SetSpriteFacePosition(sprite as integer, targetX as float, targetY as float) and SetSpriteFaceMouse(sprite as integer).



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    
// ***********************************************************************
//   CONSTANT REFERENCES
// ***********************************************************************

#constant TRUE		1
#constant FALSE		0

#constant TRANSPARENCY_MODE_OFF			0
#constant TRANSPARENCY_MODE_ALPHA		1
#constant TRANSPARENCY_MODE_ADDITIVE	2

#constant KEY_LEFT		37
#constant KEY_A			65
#constant KEY_RIGHT		39
#constant KEY_D			68
#constant KEY_UP		38
#constant KEY_W			87
#constant KEY_DOWN		40
#constant KEY_S			83
#constant KEY_T			84
#constant KEY_E			69
#constant KEY_SPACE		32
#constant KEY_N			78
#constant KEY_ESC		27
#constant KEY_Z			90
#constant KEY_X			88
#constant KEY_C			67
#constant KEY_SHIFT		16
#constant KEY_ENTER		13
#constant KEY_1			49
#constant KEY_2			50
#constant KEY_3			51
#constant KEY_4			52
#constant KEY_5			53
#constant KEY_6			54
#constant KEY_F1		112
#constant KEY_F2		113
#constant KEY_F3		114
#constant KEY_F4		115



// ***********************************************************************
//   TYPES
// ***********************************************************************

type TVector2D
	x as float
	y as float
endtype



// ***********************************************************************
//   GENERAL FUNCTIONS
// ***********************************************************************

function InitDisplay(title as string, width as integer, height as integer, maxFrameRate as float, allowResize as integer, fullscreen as integer)
	SetWindowTitle(title)
	SetWindowSize(width, height, fullscreen)
	SetWindowAllowResize(allowResize)
	SetVirtualResolution(width, height)
	SetOrientationAllowed(1, 1, 1, 1)
	SetScissor(0,0,0,0)
	UseNewDefaultFonts(1)
	SetVSync(1)
	if maxFrameRate > 0 then SetSyncRate(maxFrameRate, 0)

	sync()
	sync()
	sleep(500)
endfunction

function MinF(value1 as float, value2 as float)
	result as float

	if value1 < value2
		result = value1
	else
		result = value2
	endif
endfunction result

function Min(value1 as integer, value2 as integer)
	result as integer

	if value1 < value2
		result = value1
	else
		result = value2
	endif
endfunction result

function MaxF(value1 as float, value2 as float)
	result as float

	if value1 > value2
		result = value1
	else
		result = value2
	endif
endfunction result

function Max(value1 as integer, value2 as integer)
	result as integer

	if value1 > value2
		result = value1
	else
		result = value2
	endif
endfunction result

function SgnF(value as float)
	result as float
	
	if value < 0
		result = -1
	elseif value > 0
		result = 1
	endif
endfunction result

function Sgn(value as integer)
	result as integer
	
	if value < 0
		result = -1
	elseif value > 0
		result = 1
	endif
endfunction result

function GetFormatedInteger(value as integer, totalLength as integer)
	formatted as String
	
	formatted = right("0000000000" + str(value), totalLength)
endfunction formatted



// ***********************************************************************
//   2D VECTOR FUNCTIONS
// ***********************************************************************

function Vector2DGetRatios(v2d ref as TVector2D)
	sgnX as integer
	sgnY as integer

	if v2d.x < 0
		sgnX = -1
	elseif v2d.x > 1
		sgnX = 1
	endif

	if v2d.y < 0
		sgnY = -1
	elseif v2d.y > 1
		sgnY = 1
	endif	

	if v2d.x = 0
		v2d.y = sgnY
		exitfunction
	endif

	if v2d.y = 0
		v2d.x = sgnX
		exitfunction
	endif	

	if abs(v2d.x) > abs(v2d.y)
		v2d.y = v2d.y / abs(v2d.x)
		v2d.x = sgnX
		v2d.x = v2d.x
		v2d.y = v2d.y
	elseif abs(v2d.x) < abs(v2d.y)
		v2d.x = v2d.x / abs(v2d.y)
		v2d.y = sgnY
		v2d.x = v2d.x
		v2d.y = v2d.y
	else
		v2d.x = sgnX
		v2d.y = sgnY
		v2d.x = v2d.x
		v2d.y = v2d.y
	endif
endfunction

function Vector2DNormalize(v2d ref as TVector2D)
	length as float

	length = sqrt((v2d.x * v2d.x) + (v2d.y * v2d.y))
	v2d.x = v2d.x / length
	v2d.y = v2d.y / length
endfunction



// ***********************************************************************
//   ANGLE FUNCTIONS
// ***********************************************************************

function AngleGetDistanceToAngle(fromAngle as float, toAngle as float)
	distance as float

	if fromAngle < 0 then inc fromAngle, 360
	if toAngle < 0 then inc toAngle, 360
	distance = toAngle - fromAngle
endfunction distance

function AngleGetShortestDistanceToAngle(fromAngle as float, toAngle as float)
	distance as float
	reverseDistance as float
	shortest as float

	distance = AngleGetDistanceToAngle(fromAngle, toAngle)
	if distance < 0
		reverseDistance = distance + 360
	else
		reverseDistance = distance - 360
	endif

	if abs(distance) <= abs(reverseDistance)
		 shortest = distance
	else
		shortest = reverseDistance
	endif
endfunction shortest

function AngleIsWithin(testAngle as float, AngleToCompareTo as float, degrees as float)
	result as integer

	if abs(AngleGetShortestDistanceToAngle(testAngle, AngleToCompareTo)) <= degrees then result = 1
endfunction result

function AngleIsBetween(testAngle as float, Angle1 as float, Angle2 as float)
	result as integer

	if testAngle < 0 then inc testAngle, 360
	testAngle = mod(testAngle, 360)

	if Angle1 < 0 then inc Angle1, 360
	Angle1 = mod(Angle1, 360)

	if Angle2 < 0 then inc Angle2, 360
	Angle2 = mod(Angle2, 360)

	if Angle1 < Angle2
		result = (Angle1 <= testAngle and testAngle <= Angle2)
	else
		result = (Angle1 <= testAngle or testAngle <= Angle2)
	endif
endfunction result

function AngleAddWithLimits(angle as float, valueToAdd as float, angleMin as float, angleMax as float)
	result as integer
	newa as float
	a1 as float
	a2 as float

	newa = angle
	a1 = angleMin
	a2 = angleMax

	if newa < 0 then inc newa, 360

	if a1 < 0
		inc a1, 360
		inc a2, 360
	elseif a2 < 0
		inc a1, 360
		inc a2, 360
	endif

	inc newa, valueToAdd

	if newa < a1
		newa = angleMin
	elseif newa > a2
		newa = angleMax
	endif

	if newa >= 360
		dec newa, 360
	elseif newa < 0
		inc newa, 360
	endif
endfunction newa



// ***********************************************************************
//   SPRITE FUNCTIONS
// ***********************************************************************

function SetSpriteFaceSprite(sprite as integer, SpriteToFace as integer)
	SetSpriteAngle(sprite, ATanFull(GetSpriteXByOffset(SpriteToFace)-GetSpriteXByOffset(sprite), GetSpriteYByOffset(SpriteToFace)-GetSpriteYByOffset(sprite)))
endfunction

function SetSpriteFacePosition(sprite as integer, targetX as float, targetY as float)
	SetSpriteAngle(sprite, ATanFull(targetX-GetSpriteXByOffset(sprite), targetY-GetSpriteYByOffset(sprite)))
endfunction

function SetSpriteFaceMouse(sprite as integer)
	SetSpriteAngle(sprite, ATanFull(GetRawMouseX()-GetSpriteXByOffset(sprite), GetRawMouseY()-GetSpriteYByOffset(sprite)))
endfunction