Posted: 24th Jun 2021 15:23
Hello all,

I'm currently helping my son make a game, where he draws stuff and I animate it using Spriter. I'm new to using Skeletons and have trouble detecting collisions. In this thread, I was given (helpful!) advice to add sprites to my skeleton with the FixSpriteToSkeleton2D-command and use these as hitboxes. I've added several of them, but now I encounter a new problem: As you can see in the attached image, I've added several sprites to one of the Skeletons (I've made two of them visible in this picture, located at the arms of the red monster). However, the GetSpriteCollision-command doesn't detect anything if I check it against the mummy, which is a regular, non-skeleton animated sprite.

Perhaps it has something to do with the offset of the sprites I attached to to the Skeleton? As the debug-text shows, the X and Y-co?rdinates of all the sprites are set to 0,0... They don't reflect the 'real world' co?rdinates. Is there something I can do about this? Perhaps I am missing something...?
Posted: 24th Jun 2021 20:24
Without seeing your code I've only a guess but it seems the sprite x,y is local to the bone so it will always report 0,0, try using the bone location, as far as I know GetSpriteCollision should work, its been a while since I used this stuff so my memory is foggy but I'll have a play here and see if I can figure it out, I'm pretty sure I just attached a sprite as hitboxes.

Maybe because its attached to a parent it needs a physics shape for the collision, not sure Ill have a play
Posted: 24th Jun 2021 21:34
GetWorldX/YFromSprite()
Posted: 25th Jun 2021 8:10
Hi PartTimeCoder and blink0k,

thank you for assisting me! I have been able to use the command GetSpriteHit() to check if the X and Y-co?rdinates of a bone hit the Mummy-sprite. While that seems to work, it only detects a single location. Ideally, I would like to detect a proper "sprite on sprite"-collision.
I've attached my project with the media to this post as well as the raw code below.

The GetWorldXFromSprite() command seems to keep reporting 'local' values (e.g. 10, 10)... I'm probably not using it right. (I've changed lines 344 and 345 with "sx# = GetGetXWorldFromSprite(s, 0, 0) )



+ Code Snippet
// Project: Shot Monsters 
// Created: 21-06-18

// show all errors

SetErrorMode(2)

// set window properties
SetWindowTitle( "Shot Monsters" )
SetWindowSize( 1280, 720, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window

// set display properties
SetVirtualResolution( 1280, 720 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 60, 0 ) 
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 )
SetPrintSize(20)


`======================================================================================
` Variabelen maken
`--------------------------------------------------------------------------------------

// booleaanse operatoren
#constant False				= 0
#constant True				= 1


// constanten voor keyboard
#constant KEY_BACK			= 8
#constant KEY_TAB  			= 9
#constant KEY_ENTER   		= 13
#constant KEY_SHIFT  		= 16
#constant KEY_CONTROL		= 17
#constant KEY_ESCAPE  		= 27
#constant KEY_SPACE   		= 32
#constant KEY_PAGEUP  		= 33
#constant KEY_PAGEDOWN		= 34
#constant KEY_END    		= 35
#constant KEY_HOME   		= 36
#constant KEY_LEFT   		= 37
#constant KEY_UP     		= 38
#constant KEY_RIGHT   		= 39
#constant KEY_DOWN    		= 40
#constant KEY_INSERT 		= 45
#constant KEY_DELETE  		= 46
#constant KEY_TILDE			= 192


// constanten voor joystick
#constant JOY_A 				= 1
#constant JOY_B 				= 2
#constant JOY_X 				= 3
#constant JOY_Y 				= 4
#constant JOY_A_ALT			= 2				` 8Bitdo SF30 Pro
#constant JOY_B_ALT 			= 1				` 8Bitdo SF30 Pro
#constant JOY_X_ALT 			= 5				` 8Bitdo SF30 Pro
#constant JOY_Y_ALT			= 4				` 8Bitdo SF30 Pro
#constant JOY_LB 			= 9
#constant JOY_LT 			= 7
#constant JOY_RB 			= 10
#constant JOY_RT 			= 8
#constant JOY_SELECT 		= 11
#constant JOY_START 			= 12
#constant JOY_PADUP 			= 13
#constant JOY_PADDOWN 		= 17
#constant JOY_PADLEFT 		= 18
#constant JOY_PADRIGHT 		= 16
#constant JOY_ANALOGLEFT 	= 14
#constant JOY_ANALOGRIGHT	= 15


// constanten voor entiteit-categorie?n
#constant ctNull				= 0
#constant ctSpeler			= 1
#constant ctMonster			= 2
#constant ctExplosie			= 4


// constanten voor GameState
#constant gsVoorbereiden		= 1
#constant gsHoofdmenu		= 2
#constant gsSpel				= 3
#constant gsEinde			= 4
#constant gsPauze			= 5

// constanten voor typen sprites die voor collision-detection worden gebruikt
#constant stWapen			= 1
#constant stSchild			= 2
#constant stLichaam			= 3


type HitClass
	BotId					as integer		` pointer naar het nummer van het bot waarop de sprite is geplaatst
	SprId					as integer		` pointer naar het nummer van de sprite die voor collision detection wordt gebruikt
	SprType					as integer		` duiding van type hit-sprite (bijv. stWapen, stLichaam etc.)
endtype

`--------------------------------------------------------------------------------------
type MonstClass
	// animaties
	MagAnimeren#				as float			` timer voor animaties
	AnmTimer#				as float			` minimum tijd tussen animatie-frames
	AnmHuidigFrame#			as float			` huidig frame
	SprHoogte#				as float			` hoogte van de sprite
	SprBreedte#				as float			` breedte van de sprite
	SprSchaal#				as float			` schaal van de sprite X
	BotArmL					as integer		` Id bot arm links
	BotArmR					as integer		` Id bot arm rechts
	BotBeenL					as integer		` Id bot been links
	BotBeenR					as integer		` Id bot been rechts
	BotHoofd					as integer		` Id bot hoofd
	BotLijf					as integer		` Id van bot voor lijf
	
	Skeleton					as integer		` pointer naar iSkeleton voor Spriter-animatie
	Spr   					as integer		` pointer naar sprite nummer
	SprArmL					as integer		` pointer naar sprite op bone voor collision-detection
	SprArmR					as integer		` "
	SprBeenL					as integer		` "
	SprBeenR					as integer		` "
	SprHoofd					as integer		` "
	SprLijf					as integer		` "
	AnmNaam$					as string		` naam van de animatie om te gebruiken
		

	// input en acties
	MagBewegen#				as float			` gebruikt om te kijken of tijd ingesteld met.bwgTimer# verstreken is, zodat monster iets kan doen.
	BwgTimer#				as float			` minimum wachttijd tussen acties
	BwgNiet					as integer 		` als [waar] = monster beweegt niet
 	BwgOmlaag				as integer 		` als [waar] = monster beweegt omlaag
 	BwgLinks					as integer 		` als [waar] = monster beweegt links
 	BwgRechts				as integer 		` als [waar] = monster beweegt rechts
 	BwgOmhoog				as integer 		` als [waar] = monster beweegt omhoog
 	DoeAaanval				as integer		` als [waar] = monster valt aan
 	DoeSpring				as integer 		` als [waar] = monster springt 
 	DoeSpecial				as integer 		` als [waar] = monster doet iets speciaals
 
 
 	// snelheid en positie
	PosX#					as float			` x-pos op scherm
	PosY#					as float			` y-pos op scherm
	VersnelX#				as float			` versnelling voor links / rechts
	VersnelY#				as float			` versnelling voor omhoog / omlaag
	SnelheidMaxX#			as float			` max snelheid links / rechts
	SnelheidMaxY#			as float			` max snelheid omhoog / omlaag
	SnelheidX#				as float			` bewegingssnelheid op de x-as
	SnelheidY#				as float			` bewegingssnelheid y-as
	DoelX#					as float			` x-co?rdinaat doel
	DoelY#					as float			` y-co?rdinaat doel

	
	// andere variabelen
	Categorie				as integer		` type monster (speler, tegenstander)
	Intentie					as integer		` bevat waarde voor uit te voeren actie
	Status					as integer		` bevat waarde voor bewegen, aanvallen, KO etc.
	Vorm						as integer		` sprite-collision vorm
	Raakpunt					as HitClass[5]	` sub-array met waarden voor het toekennen en detecteren van hit-sprites
endtype


`--------------------------------------------------------------------------------------
// globale variabelen
global FrameTime# 			as float			` voor registratie frametijd
global FPScnt#				as float			` huidige FPS
global FPSavg# 				as float			` gemiddelde FPS
global FPSmax#				as float			` maximum gemeten FPS
global FPStot# 				as float			` totale FPS (om gemiddelde te berekenen)
global JoyPosX# 				as float			` X-waarde joystick / joypad
global JoyPosY# 				as float			` Y-waarde joystick / joypad
global JoyScale#				as float			` holds the size of the joystick (percentage of screen)
global Debug					as integer		` geeft aan of debug-info moet worden weergegeven

// scherm variabelen
global MaxX#					as float			` X-size of screen (with borders)
global MaxY#					as float			` Y-size of screen (with borders)
global MinX#					as float			` min X-size (with borders)
global MinY#					as float			` min Y-size	(with borders)
global ScreenAspect#			as float			` Aspect of chosen resolution
global WindowHeight#			as float			` determines window Y-size
global WindowWidth#			as float			` determines window X-size

// variabelen voor monsters
global GameState				as integer		` variable om aan te geven wat de huidige staat van het spel is
global Speler				as integer		` Id voor speler
global Vijand				as integer		` Id voor vijand
global Monster				as MonstClass[0]	` array voor monster klasse


Debug 		= 0
Speler 		= Monster.Length
GameState 	= gsSpel



`--------------------------------------------------------------------------------------
// -- maak de speler / set up player --
	Monster[Speler].Skeleton = Speler + 1
	Monster[Speler].SprSchaal# = 0.5
	LoadSkeleton2DFromSpriterFile(Monster[Speler].Skeleton, "Sprites\VuurGhast\VuurGhast04.scon", Monster[Speler].SprSchaal#, 0 )
	
	// algemene informatie / general variables
	Monster[Speler].Categorie = ctSpeler
	Monster[Speler].PosX# = GetSkeleton2DX(Monster[Speler].Skeleton) + 100
	Monster[Speler].PosY# = (GetDeviceHeight() / 2)
	Monster[Speler].SnelheidX# = 300
	Monster[Speler].SnelheidY# = 300
	Monster[Speler].BwgTimer# = 0.5
	SetSkeleton2DPosition(Monster[Speler].Skeleton, Monster[Speler].PosX#, Monster[Speler].PosY#)
	
	// maak aparte sprites voor collision-detection op de verschillende bones / set up seperate sprites for hit-detection

	// linkerarm
	Monster[Speler].Raakpunt[0].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_arm_links_top")
	Monster[Speler].Raakpunt[0].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[0].SprType = stWapen
	b = Monster[Speler].Raakpunt[0].BotId
	s = Monster[Speler].Raakpunt[0].SprId
	t = Monster[Speler].Raakpunt[0].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 4, Monster[Speler].SprSchaal# * 4)
	` SetSpritePositionByOffset(s, 5, 0)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)
	

	// rechterarm
	Monster[Speler].Raakpunt[1].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_arm_rechts_top")
	Monster[Speler].Raakpunt[1].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[1].SprType = stWapen
	b = Monster[Speler].Raakpunt[1].BotId 
	s = Monster[Speler].Raakpunt[1].SprId
	t = Monster[Speler].Raakpunt[1].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 4, Monster[Speler].SprSchaal# * 4)
	` SetSpritePositionByOffset(s, 3, 0)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)	

	// linkerhoorn
	Monster[Speler].Raakpunt[2].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_hoorn_links")
	Monster[Speler].Raakpunt[2].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[2].SprType = stWapen
	b = Monster[Speler].Raakpunt[2].BotId 
	s = Monster[Speler].Raakpunt[2].SprId
	t = Monster[Speler].Raakpunt[2].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 18, Monster[Speler].SprSchaal# * 4)
	` SetSpritePositionByOffset(s, 5, -1)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)
	
	// rechterhoorn
	Monster[Speler].Raakpunt[3].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_hoorn_rechts")
	Monster[Speler].Raakpunt[3].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[3].SprType = stWapen
	b = Monster[Speler].Raakpunt[3].BotId 
	s = Monster[Speler].Raakpunt[3].SprId
	t = Monster[Speler].Raakpunt[3].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 16, Monster[Speler].SprSchaal# * 4)
	` SetSpritePositionByOffset(s, 1, -1)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)

	
	// lijf
	Monster[Speler].Raakpunt[4].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_lijf")
	Monster[Speler].Raakpunt[4].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[4].SprType = stLichaam
	b = Monster[Speler].Raakpunt[4].BotId 
	s = Monster[Speler].Raakpunt[4].SprId
	t = Monster[Speler].Raakpunt[4].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 15, Monster[Speler].SprSchaal# * 17)
	` SetSpritePositionByOffset(s, 15, -3)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)


	// mond
	Monster[Speler].Raakpunt[5].BotId = GetSkeleton2DBone(Monster[Speler].Skeleton, "bot_mond")
	Monster[Speler].Raakpunt[5].SprId = CreateSprite(0)
	Monster[Speler].Raakpunt[5].SprType = stLichaam
	b = Monster[Speler].Raakpunt[5].BotId 
	s = Monster[Speler].Raakpunt[5].SprId
	t = Monster[Speler].Raakpunt[5].SprType
	FixSpriteToSkeleton2D(s, Monster[Speler].Skeleton, b, 0)
	SetSpriteScale(s, Monster[Speler].SprSchaal# * 12, Monster[Speler].SprSchaal# * 6)
	` SetSpritePositionByOffset(s, 15, 0)
	if Debug = 0 then SetSpriteVisible(s, 0)
	SetSpriteActive(s, 1)

	
	// animeer speler / animate player
	AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
	Monster[Speler].AnmNaam$ = "Sta"
	SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
	PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, 0, 1, 0.3 )
// -- einde creatie speler / end of player setup --



`--------------------------------------------------------------------------------------
// -- maak de tegenstander / set up opponent --
	Monster.Length = Monster.Length + 1
	Vijand = Monster.Length
	Monster[Vijand].Spr = LoadSprite("Sprites\Mummy\Mummy02.png")
	Monster[Vijand].Categorie = ctMonster
	Monster[Vijand].SprSchaal# = 0.5
	SetSpriteScale(Monster[Vijand].Spr, Monster[Vijand].SprSchaal#, Monster[Vijand].SprSchaal#)
	Monster[Vijand].PosX# = (GetDeviceWidth() - GetSpriteWidth(Monster[Vijand].Spr))
	Monster[Vijand].PosY# = (GetDeviceHeight() / 2) - (GetSpriteWidth(Monster[Vijand].Spr) / 2)
	Monster[Vijand].SnelheidX# = 300
	Monster[Vijand].SnelheidY# = 300
	Monster[Vijand].BwgTimer# = 0.5
	SetSpriteShape(Monster[Vijand].Spr, 3)
// -- end of opponent setup -- 



`======================================================================================
` Hoofdprogramma / main program
`--------------------------------------------------------------------------------------
if Debug = 1 then SetPhysicsDebugOn()

repeat
	CheckFPS()
	CheckInput()
	BeweegSpeler()
	BeweegVijand()
	PlaatsMonster()
	
	// -- print info voor debug / collision detection --
		print("FPS: " + str(Screenfps(),2))
		print("")

		for i = 0 to 5
			x# = GetSkeleton2dBoneCurrX(Monster[Speler].Skeleton, Monster[Speler].Raakpunt[i].BotId)
			y# = GetSkeleton2dBoneCurrY(Monster[Speler].Skeleton, Monster[Speler].Raakpunt[i].BotId)
			s = Monster[Speler].Raakpunt[i].SprId
			sx# = GetSpriteX(s)
			sy# = GetSpriteY(s)
			
			print("Hitpoint " + str(i) + " is bone nr. [" + str(Monster[Speler].Raakpunt[i].BotId) + "] at: " + str(x#,2) + ", " + str(y#,2) + ". With sprite [" + str(s) + "] at " + str(sx#,2) + ", " + str(sy#,2))
			if GetSpriteCollision(Monster[Speler].Raakpunt[i].SprId, Monster[Vijand].Spr) = 1 then message("HIT!!")
		next i
	// -- einde debug --
	
    Sync()
Until GameState <> gsSpel



`======================================================================================
` CheckInput() : functie om te kijken wat er met input van speler moet worden gedaan
`--------------------------------------------------------------------------------------
function CheckInput()

	// signaleer einde van spel
	if GetRawKeyPressed(KEY_ESCAPE) = 1 then GameState = gsEinde

	// signaleer beweging / movement
	if GetRawKeyState(KEY_LEFT) = 1
		Monster[Speler].BwgNiet = 0
		Monster[Speler].BwgLinks = 1
	endif
	
	if GetRawKeyState(KEY_RIGHT) = 1
		Monster[Speler].BwgNiet = 0
		Monster[Speler].BwgRechts = 1
	endif
	
	if GetRawKeyState(KEY_UP) = 1
		Monster[Speler].BwgNiet = 0
		Monster[Speler].BwgOmhoog = 1
	endif
	
	if GetRawKeyState(KEY_DOWN) = 1
		Monster[Speler].BwgNiet = 0
		Monster[Speler].BwgOmlaag = 1
	endif
endfunction



`======================================================================================
` BeweegSpeler() : Functie om input van speler om te zetten in acties
`--------------------------------------------------------------------------------------
function BeweegSpeler()

	// beweeg speler links / move player left
	if Monster[Speler].BwgLinks = 1
		if Monster[Speler].PosX# > 0
			if Monster[Speler].AnmNaam$ <> "Loop" and GetSkeleton2DIsAnimating(Monster[Speler].Skeleton) = 1
				AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
				Monster[Speler].AnmNaam$ = "Loop"
				SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
				PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$ , 0, 0, 0)
			endif 
			Monster[Speler].PosX# = Monster[Speler].PosX# - (Monster[Speler].SnelheidX# * FrameTime#)
		endif
	endif
	
	// beweeg speler right / move player right
	if Monster[Speler].BwgRechts = 1
		if Monster[Speler].PosX# < (GetDeviceWidth())
			if Monster[Speler].AnmNaam$ <> "Loop" and GetSkeleton2DIsAnimating(Monster[Speler].Skeleton) = 1
				AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
				Monster[Speler].AnmNaam$ = "Loop"
				SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
				PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$ , 0, 0, 0)
			endif 
			Monster[Speler].PosX# = Monster[Speler].PosX# + (Monster[Speler].SnelheidX# * FrameTime#)
		endif
	endif

	// beweeg speler omhoog / move player up
	if Monster[Speler].BwgOmhoog = 1
		if Monster[Speler].PosY# > 0
			if Monster[Speler].AnmNaam$ <> "Loop" and GetSkeleton2DIsAnimating(Monster[Speler].Skeleton) = 1
				AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
				Monster[Speler].AnmNaam$ = "Loop"
				SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
				PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$ , 0, 0, 0)
			endif 
			Monster[Speler].PosY# = Monster[Speler].PosY# - (Monster[Speler].SnelheidY# * FrameTime#)
		endif
	endif
	
	// beweeg speler beneden / move player down
	if Monster[Speler].BwgOmlaag = 1
		if Monster[Speler].PosY# < (GetDeviceHeight())
			if Monster[Speler].AnmNaam$ <> "Loop" and GetSkeleton2DIsAnimating(Monster[Speler].Skeleton) = 1
				AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
				Monster[Speler].AnmNaam$ = "Loop"
				SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
				PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$ , 0, 0, 0)
			endif 
			Monster[Speler].PosY# = Monster[Speler].PosY# + (Monster[Speler].SnelheidY# * FrameTime#)
		endif
	endif

	// reset bewegingen / reset movement
	Monster[Speler].BwgLinks = 0
	Monster[Speler].BwgRechts = 0
	Monster[Speler].BwgOmlaag = 0	
	Monster[Speler].BwgOmhoog = 0
	Monster[Speler].BwgNiet = 1
	if GetSkeleton2DIsAnimating(Monster[Speler].Skeleton) = 0
		AnmHuidigFrame# = GetSkeleton2DCurrentTime(Monster[Speler].Skeleton)
		Monster[Speler].AnmNaam$ = "Sta"
		SetSkeleton2DAnimationFrame(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, AnmHuidigFrame#, AnmHuidigFrame#)
		PlaySkeleton2DAnimation(Monster[Speler].Skeleton, Monster[Speler].AnmNaam$, 0, 1, 0.3 )
	endif
							
endfunction


`======================================================================================
` BeweegVijand() : Functie om input van speler om te zetten in acties
`--------------------------------------------------------------------------------------
function BeweegVijand()

	// code to move enemy comes here in the future
	remstart
	local pX# as float
	local pY# as float
	
	if timer() > Monster[Vijand].MagBewegen#
		pX# = Random(0, GetDeviceWidth() - GetSpriteWidth(Monster[Vijand].Spr))
		pY# = Random(0, GetDeviceHeight() - GetSpriteHeight(Monster[Vijand].Spr))
		Monster[Vijand].PosX# = pX#
		Monster[Vijand].PosY# = pY#
		Monster[Vijand].MagBewegen# = timer() + Monster[Vijand].BwgTimer#
	endif
	remend
	
endfunction


`======================================================================================
` PlaatsSpeler() : Functie om spelers op het scherm te plaatsen
`--------------------------------------------------------------------------------------
function PlaatsMonster()

	// code to place player and enemies
	for Id = 0 to Monster.Length
		if GetSkeleton2DExists(Monster[Id].Skeleton) = 1
			SetSkeleton2DPosition(Monster[Id].Skeleton, Monster[Id].PosX#, Monster[Id].PosY#)
		else
			SetSpritePosition(Monster[Id].Spr, Monster[Id].PosX#, Monster[Id].PosY#)
		endif
	next Id

endfunction


`======================================================================================
` CheckFPS() : Functie om framerate te berekenen
`--------------------------------------------------------------------------------------
function CheckFPS()
	FrameTime# = GetFrameTime()
    
	FPScnt# = ScreenFPS()   
	if FPScnt# > 0
		FPSavg# = FPSavg# * FPStot#
		FPStot# = FPStot# + 1.0
		FPSavg# = FPSavg# + FPScnt#
		FPSavg# = FPSavg# / FPStot#
	endif
endfunction