Hi Everybody,
I began a program in DarkBasic Pro which load a FPSC map (universe.dbo) and allow navigation into it, in the way of Dungeon Master or Legends of Grimrock.
Very knew to PureBasic and PureGDK, I tried to port it to PureGdk.
But I have memory errors.
Someone can help me to solve this problem?
It could be an interesting project for beginners coming on thi forum.
// #################################################################
// DECLARATIONS DES VARIABLES
// #################################################################
// ---- MONSTERS
global objMonster = 666
global imgMonster = 666
global gMonsterName$ =""
// ----
// --- DISPLAY SETTINGS
// set display mode 800,600,32,1
set display mode 400,300,32,1
gdividetexturesize=0
universefile$="universe.dbo"
Set Dir "Files"
Load Static Objects universefile$, gdividetexturesize
// DATA SETTING
// -- Movement
isMoving = 0
playerStep = 100
// HUD
draw To Front
afficheHud = -1
// MONSTER
setCurrentMonster("SPIDER")
LoadMonster()
PositionMonsterXYZ( 150,500,-250)
// Monster light
make light 2
set spot light 2, 30, 10
color light 2,255,255,0
//color light 2, 255,0,0
// --- CAMERA POSITION
rem Place camera (the center/ground tile of the FPSC level universe)
//Position Camera 50, 570, -50
//Point Camera 0, 570, 0
Position camera 50,560,-50
Rotate camera 0,90,0
Set Camera Range 0.5, 32768
Set Ambient Light 5
fog on
fog distance playerStep * 3
rem Main loop
//Backdrop On
//Hide Mouse
Sync On
Sync Rate 0
Disable Escapekey
while Escapekey()=0
rem Camera old information
cox#=Camera Position X()
coy#=Camera Position Y()
coz#=Camera Position Z()
rem Control camera movement
movement=0 : // playerStep=3.0
x#=Camera Angle X() : z#=Camera Angle Z() : sy#=Camera Angle Y() : y#=sy#
k$ = inkey$()
if k$="z"
avancer(playerStep,1)
WHILE inkey$()<>""
ENDWHILE
endif
if k$="s"
reculer(playerStep,1)
WHILE inkey$()<>""
ENDWHILE
endif
if inkey$()="q"
rotationY(-90,1)
ENDIF
if inkey$()="Q"
GlisseraGauche(playerStep)
ENDIF
if inkey$()="D"
GlisserADroite(playerStep)
ENDIF
if inkey$()="d"
rotationY(90,1)
ENDIF
if inkey$()="D"
GlisserADroite(playerStep)
ENDIF
if inkey$()=" "
afficheHud = AfficheHud*(-1)
while inkey$()<>""
ENDWHILE
endif
if afficheHud=1
load image "hud.jpg", 888
paste image 888, 1,1
//sync
ENDIF
rem Camera new information
cmx#=Camera Position X()
cmy#=Camera Position Y() //-grav#
cmz#=Camera Position Z()
rem Update camera position
Position Camera cmx#, cmy#, cmz#
rem --- INFOS
set cursor 10,10
print "X,Y,Z: ", camera position x()," ", camera position y()," ", camera position z()," "
set cursor 10,40
print "Angles: ", wrapvalue(camera Angle x())," ", wrapvalue(camera Angle y())," ", camera Angle z()," "
set cursor 10, 60
print "Case : ", int(camera position x() / 100)," , ", abs(int(camera position z()/100))
rem ---
point object objMonster, camera position x(), camera position y(), camera position z()
if distanceToCam(objMonster) < 110
loop object objMonster, 0,20
else
loop object objMonster, 80,100
endif
// ---- Clic on Object
if mouseclick() =1
numObj = pick object(mousex() , mousey(),objMonster,objMonster)
if numobj=objMonster
end
endif
ENDIF
rem --- Update
Sync
Endwhile
rem Close level
Enable Escapekey
Delete Static Objects
rem End program
End
FUNCTION RotationY( angleY, pVisual)
myStep = 5
nbRotation = abs(int(angleY/myStep))
startAngY = camera angle y()
signe = angleY / abs(angleY)
FOR i = 1 to nbRotation
rotate camera camera angle x(), wrapvalue(startAngY + (i*myStep*signe)), camera angle z()
if pVisual=1
sync
wait 25
endif
NEXT
ENDFUNCTION
FUNCTION Avancer(pPlayerStep, pVisual)
myStep = 5
signe = pPlayerStep / abs(pPlayerStep)
nbTurns = abs(int(pPlayerStep/myStep))
rem Camera old information
cox#=Camera Position X()
coy#=Camera Position Y() //-grav#
coz#=Camera Position Z()
rem On teste si on peut aller dans la case suivante
move camera (pplayerStep) * signe
rem Camera new information
cmx#=Camera Position X()
cmy#=Camera Position Y() // -grav#
cmz#=Camera Position Z()
rem On revient à la position initiale
position camera cox#, coy#, coz#
if Static Volume(cox#, coy#-20, coz#, cmx#, cmy#-20, cmz#, 1.0)=0
FOR i= 1 to nbTurns
move camera myStep * signe
rem Camera new information
cmx#=Camera Position X()
cmy#=Camera Position Y() // -grav#
cmz#=Camera Position Z()
rem Update camera position
Set Point Light 0, cmx#, cmy#, cmz#
Position Camera cmx#, cmy#, cmz#
if pVisual=1
sync
wait 25
endif
NEXT
endif
sync
ENDFUNCTION
FUNCTION Reculer( pPlayerStep, pVisual)
Avancer( pPlayerStep *(-1),pVisual)
ENDFUNCTION
FUNCTION GlisserAGauche(pPlayerStep)
rotationY(-90,1)
avancer(pPlayerStep,1)
rotationY(90,1)
ENDFUNCTION
FUNCTION GlisserADroite( pPlayerStep)
rotationY(90,1)
avancer(pPlayerStep,1)
rotationY(-90,1)
ENDFUNCTION
FUNCTION distanceToCam( objet)
VALRET = sqrt( (object position x(objet) - camera position x())^2 + (object position y(objet) - camera position y())^2 + (object position z(objet) - camera position z())^2 );
ENDFUNCTION VALRET
FUNCTION SetCurrentMonster( pMonsterName$)
gMonsterName$ = pMonsterName$
ENDFUNCTION
FUNCTION LoadMonster()
select gmonsterNAME$
case "SPIDER"
load object "spider.x",objMonster
load image "spider.dds",imgMonster
texture object objMonster,imgMonster
set object speed objMonster,40 : ` Sets the frame rate to 1 keyframe per 1 sync; 100% speed.
loop object objMonster,80,100
endcase
endselect
ENDFUNCTION
FUNCTION PositionMonsterXYZ( pX, pY, pZ)
position object objMonster,pX,pY,pZ
ENDFUNCTION
And here is the PureGDK code:
Procedure RotationY( angleY, pVisual)
myStep = 5
nbRotation = Abs(Int(angleY/myStep))
startAngY = dbCameraAngleY()
signe = angleY / Abs(angleY)
For i = 1 To nbRotation
dbRotateCamera(dbCameraAngleX(), dbWrapValue(startAngY + (i*myStep*signe)), dbCameraAngleZ())
If pVisual=1
dbSync()
Delay(25)
EndIf
Next
EndProcedure
Procedure Avancer(pPlayerStep, pVisual)
myStep = 5
signe = pPlayerStep / Abs(pPlayerStep)
nbTurns = Abs(Int(pPlayerStep/myStep))
; Camera old information
cox=dbCameraPositionX()
coy=dbCameraPositionY() ;-grav
coz=dbCameraPositionZ()
; On teste si on peut aller dans la Case suivante
dbMoveCamera((pplayerStep) * signe)
; Camera new information
cmx=dbCameraPositionX()
cmy=dbCameraPositionY() ; -grav
cmz=dbCameraPositionZ()
; On revient à la position initiale
dbPositionCamera(cox, coy, coz)
If dbStaticVolume(cox, coy-20, coz, cmx, cmy-20, cmz, 1.0)=0
For i= 1 To nbTurns
dbMoveCamera(myStep * signe)
; Camera new information
cmx=dbCameraPositionX()
cmy=dbCameraPositionY() ; -grav
cmz=dbCameraPositionZ()
; Update camera position
dbPositionCamera(cmx, cmy, cmz)
If pVisual=1
dbSync()
Delay(25)
EndIf
Next
EndIf
dbSync()
EndProcedure
Procedure Reculer( pPlayerStep, pVisual)
Avancer( pPlayerStep *(-1),pVisual)
EndProcedure
Procedure GlisserAGauche(pPlayerStep)
rotationY(-90,1)
avancer(pPlayerStep,1)
rotationY(90,1)
EndProcedure
Procedure GlisserADroite( pPlayerStep)
rotationY(90,1)
avancer(pPlayerStep,1)
rotationY(-90,1)
EndProcedure
Procedure distanceToCam( objet)
vX = Pow((dbObjectPositionX(objet) - dbCameraPositionX()),2)
vY = Pow((dbObjectPositionY(objet) - dbCameraPositionY()),2)
vZ = Pow((dbObjectPositionZ(objet) - dbCameraPositionZ()),2)
VALRET.f = Sqr(vX+vY+vZ)
ProcedureReturn VALRET.f
EndProcedure
Procedure SetCurrentMonster( pMonsterName$)
gMonsterName$ = pMonsterName$
EndProcedure
Procedure LoadMonster()
Select gmonsterNAME$
Case "SPIDER"
dbLoadObject("spider.x",objMonster)
dbLoadImage("spider.dds",imgMonster)
dbTextureObject(objMonster,imgMonster)
dbSetObjectSpeed(objMonster,40) ; ` Sets the frame rate To 1 keyframe per 1 sync 100% speed.
dbLoopObject(objMonster,80,100)
EndSelect
EndProcedure
Procedure PositionMonsterXYZ( pX, pY, pZ)
dbPositionObject(objMonster,pX,pY,pZ)
EndProcedure
;/ Initialize PureBasic desktop library
ExamineDesktops()
;/ Show the PureGDK render window
OpenWindow(0,0,0,400,300,"DarkBasic Professional - PureGDK",#PB_Window_BorderLess)
hDBWnd=OpenDBWnd(WindowID(0),0,0,400,300)
; DECLARATIONS DES VARIABLES
;---- MONSTERS
Global objMonster = 666
Global imgMonster = 666
Global gMonsterName$ =""
; --- DISPLAY SETTINGS
;set display mode 800,600,32,1
;dbSetDisplayMode( 400,300,32)
gdividetexturesize=0
universefile$="universe.dbo"
dbLoadStaticObjects( GetCurrentDirectory()+"\Files\"+universefile$, gdividetexturesize)
;--- Data SETTING
;-- Movement
isMoving = 0
playerStep = 100
;--- HUD
dbDrawToFront()
afficheHud = -1
;--- MONSTER
setCurrentMonster("SPIDER")
LoadMonster()
PositionMonsterXYZ(150,500,-250)
; --- CAMERA POSITION
; Place camera (the center/ground tile of the FPSC level universe)
;Position Camera 50, 570, -50
;Point Camera 0, 570, 0
dbPositionCamera( 50,560,-50)
dbRotateCamera( 0,90,0)
dbSetCameraRange(0.5, 32768)
dbSetAmbientLight(5)
dbFogOn()
dbFogDistance( playerStep * 3)
; Main loop
;Backdrop On
;Hide Mouse
dbSyncRate(0)
While dbEscapeKey()=0
; Camera old information
cox=dbCameraPositionX()
coy=dbCameraPositionY()
coz=dbCameraPositionZ()
; Control camera movement
movement=0 ; playerStep=3.0
x=dbCameraAngleX() : z=dbCameraAngleZ() : sy=dbCameraAngleY() : y=sy
k$ = dbInKey()
If k$="z"
avancer(playerStep,1)
While dbInKey()<>""
Wend
EndIf
If k$="s"
reculer(playerStep,1)
While dbInKey()<>""
Wend
EndIf
If k$="q"
rotationY(-90,1)
EndIf
If k$="Q"
GlisseraGauche(playerStep)
EndIf
If k$="D"
GlisserADroite(playerStep)
EndIf
If k$="d"
rotationY(90,1)
EndIf
If k$="D"
GlisserADroite(playerStep)
EndIf
If k$=" "
afficheHud = AfficheHud*(-1)
While dbInKey()<>""
Wend
EndIf
If afficheHud=1
dbLoadImage("hud.jpg", 888)
dbPasteImage(888, 1,1)
;sync
EndIf
; Camera new information
cmx=dbCameraPositionX()
cmy=dbCameraPositionY() ;-grav
cmz=dbCameraPositionZ()
; Update camera position
dbPositionCamera(cmx, cmy, cmz)
; --- INFOS
dbSetCursor(10,10)
;dbPrint("X,Y,Z:",dbCameraPositionX()," ", dbCameraPositionY()," ", dbCameraPositionZ()," ")
dbSetCursor(10,40)
;dbPrint("Angles: ", dbWrapValue(dbCameraAngleX())," ", dbWrapValue(dbCameraAngleY())," ", dbCameraAngleZ()," ")
dbSetCursor(10, 60)
;dbPrint("Case : ", Int(dbCameraPositionX() / 100)," , ", Abs(Int(dbCameraPositionZ()/100)))
; ---
dbPointObject(objMonster, dbCameraPositionX(), dbCameraPositionY(), dbCameraPositionZ())
If distanceToCam(objMonster) < 110
dbLoopObject(objMonster, 0,20)
Else
dbLoopObject(objMonster, 80,100)
EndIf
; ---- Clic on Object
If dbMouseClick() =1
numObj = dbPickObject(dbMouseX() , dbMouseY(),objMonster,objMonster)
If numobj=objMonster
End
EndIf
EndIf
; --- Update
dbSync()
Wend
; Close level
dbDeleteStaticObjects()
; End program
Cry "Havoc!" and let slip the dogs of war