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) )
// 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