Thank you!
A question:
if my program takes more than 10 ms to "work" the code from DO to Sync?
You mean that If my program takes more than 10 so you CUT OFF the main program cycle to start the next main program cycle?
If yes so I don't understand well.. 'cause in this way sure you make the main program cycle not exceeding 10ms but you get the code cut so some operations and calculations were not performed!!!
Here the code (without the code called with some gosub command).
Sync On
Sync Rate 60
AutoCam Off
global terrainID = 10000
testo_si = 1
Position Camera 2201.45, 50.87, 1812.40 rem Position Camera 2259, 35, 1953
SET CAMERA RANGE 1, 30000
cy# = 0 rem CAMERA ORIENTATION
cx# = 30
DYN START
DYN SET PARAMETER 9, 1
DYN SET PARAMETER 39, 1
DYN SET PARAMETER 28, 1
DYN SET PARAMETER 29, 1
DYN SET GRAVITY 0.0, -9.8, 0.0
rem ///////////////// BUILDING THE AIRPLANE
gosub creazione_aereo
rem ///////////////// AN OBJECT 1,8 meter TALL
size_object_Y# = 3.7 rem altezza in pixel ---> 1,8m
Make object box 8996,1.09,size_object_Y#,1.5
half_size_Y# = size_object_Y# / 2
position_final_Y# = 0 + half_size_Y#
position object 8996,2080,position_final_Y#,1854
DYN MAKE BOX 8996,1.0
rem ///////////////// AN OBJECT IN THE SKY
make object box 8995,150,30,50
position object 8995,170,400,150
rem ///////////////// THE RUNWAY
make object box 8810,2400,0.3,100
rem position object 8810, 2464,45,1642
position object 8810, 2464.4597168, 43.04390704632, 1630.58166504
rotate object 8810, -0.562681257725, -6.48277139664, 2.75179934502
load image "asfalto3.jpg",1
texture object 8810,1
DYN MAKE BOX 8810,60.0
rem >>>>>>>>>>>> THESE OBJECTS ARE TEST OBJECTS TO MAKE SOME FORCE TESTS >>>>>>>>>>>>
rem LINE OBJECT TO USE TO SHOW FORCE
intensita_ogg_forza_X# = 5
intensita_ogg_forza_Y# = 5
intensita_ogg_forza_Z# = 5
make object box 20007, 0.5,85,0.5
position object 20007,2000,10,1800
color object 20007, rgb(255,0,0)
DYN MAKE BOX 20007,10
rem OBJECT1 TEST LOCAL AND GLOBAL (building)
size_object2_Y# = 50 rem altezza in pixel ---> 1,8m
make object box 20008, 5,50,5
half_size2_Y# = size_object2_Y# / 2
position_final2_Y# = 2 + half_size2_Y#
position object 20008,2050,position_final2_Y#,1850
DYN MAKE BOX 20008,10
rem OGGETTO2 TEST LOCAL AND GLOBAL (sheet)
rem Make object box 20009,80,4,40
Make object box 20009,160,8,80
scale object 20009,50,50,50
position object 20009,2100,5,1900
DYN MAKE BOX 20009,10
rem >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
rem //////////////// OBJECT AIR ZONE
grand_zona_part_X# = 45 rem 60 rem larghezza
grand_zona_part_Y# = 25 rem 30
grand_zona_part_Z# = 55 rem 60 rel lunghezza
size_object_Y# = grand_zona_part_Y#
make object box 8997, grand_zona_part_X#,size_object_Y#,grand_zona_part_Z#
half_size_Y# = size_object_Y# / 2
position_final_Y# = 5 + half_size_Y#
rem position object 8997,2198,position_final_Y#/2,1972
position object 8997,object position x(8999),object position y(8999),object position z(8999)
color object 8997,rgb(255,0,0)
set object wireframe 8997,1
rem ///////////////// AIR PARTICLES
ok_movement as integer
ok_movement = 0
forza_iniziale_lancio# = 0
forza_lancio# = forza_iniziale_lancio#
num_max_particelle_da_lanciare = 10
num_max_particelle_da_lanciare_appo = 0
prossima_partic_da_sparare = 1
max_numb_DBPro_cubes = 3000 rem NUMBER OF AIR PARTICLES
grand_partic# = 0.2 rem 0.2
half_fan_position_X# as float
half_fan_position_X# = 0
fan_position_X# as float
fan_position_X# = 0
gosub creazione_particelle
rem ///////////////// MAKING THE TERRAIN
terreno_scelto = 2
IF terreno_scelto = 1
DYN MAKE GROUND PLANE
make object box 10000, 5000,10,5000
color object 10000,rgb(50,210,10)
position object 10000,0,0,0
DYN MAKE BOX 10000, 0.0 //Static terreno
ENDIF
IF terreno_scelto = 2 then makeTerrain()
rem ///////////////// MAKING LIGHT AND SHADOWS
gosub luci_e_ombre
rem ///////////////// SKYBOX
load object "skybox2.x", 20000
set object light 20000, 0
set object texture 20000, 3, 1
position object 20000, 1000, 2000, 4000
scale object 20000, 30000, 30000, 30000
rem ---------------------------------------------------------------------------
rem BLOCCHIAMO PRIMA DEL LOOP LA GRAVITA' SOLO ALLE PARTICELLE
FOR a = 1 to max_numb_DBPro_cubes
DYN ENABLE GRAVITY a,0
NEXT
rem ************************ COLLISIONE GROUPS **********************
FOR a = 8999 to 9008 rem airplane pieces
DYN set group a,1
NEXT
FOR a = 9009 to 9012 rem right engine
DYN set group a,1
NEXT
FOR a = 9020 to 9023 rem left engine
DYN set group a,1
NEXT
FOR a = 10001 to 10020 rem wings details
DYN set group a,11
NEXT
FOR a = 10051 to 10058 rem tail details
DYN set group a,11
NEXT
DYN GROUP SET COLLISION 1,1,0
DYN GROUP SET COLLISION 1,2,0
DYN GROUP SET COLLISION 2,2,0
rem settiamo le particelle nel gruppo collisione 9
FOR partk = 1 to max_numb_DBPro_cubes
DYN SET GROUP partk,9
NEXT
rem settiamo il terreno nel gruppo collisione 10
DYN SET GROUP 10000,10
rem settiamo il rapporto collisione tra gruppo coll 1 e gruppo coll 2
DYN GROUP SET COLLISION 9,10,0
DYN GROUP SET COLLISION 9,11,0
rem **********************
rem *****************************************************
rem ************************************************************************
rem ********************************************************************************
rem ********************************************************************************
rem ******************************** MAIN LOOP *************************************
rem ********************************************************************************
rem ********************************************************************************
cambio_posizione_oggetto = 1
DYN SIMULATE
DO
DYN FETCH RESULTS
DYN UPDATE
rem dyn set timing (1/40.0)/4.0 ,4,0 rem OK PIU PRECISIONE
DYN WHEEL UPDATE 9100, 0
DYN WHEEL UPDATE 9101, 0
DYN WHEEL UPDATE 9102, 0
processUserInput()
rem DYN DEBUG RENDER
..................... "MOVING AIR PARTICLES" AND "AIR PARTICLES MUST TO STAY IN THE AIR ZONE"
........................ ARE THE BAD BLOW TO MY PROGRAM SPEED!
...........................
.............................. I THINK THESE FOR CYCLES ARE THE CAUSE
........................... OF THE SLOW FPS. I NEED TO MAKE
........................ MANY FOR CYCLES TO HANDLE MY 3000 AIR
..................... PARTICLES
rem ///////////////////////////////////////////////////////////////
rem ////// UPDATE AIR ZONE POSITION
rem ///////////////////////////////////////////////////////////////
position object 8997,object position x(8999),object position y(8999),object position z(8999)
rem ///////////////////////////////////////////////////////////////
rem ////// MOVING AIR PARTICLES
rem ///////////////////////////////////////////////////////////////
TEXT 10,500,">>> TARGET ACCELLERATION FOR PARTICLES = "+str$(acc_target_partic_test#)
IF lower$(inkey$()) = "a"
acc_target_partic_test# = acc_target_partic_test# -0.5
ENDIF
IF lower$(inkey$()) = "s"
acc_target_partic_test# = acc_target_partic_test# +0.5
ENDIF
FOR partic = 1 to max_numb_DBPro_cubes
DYN ADD FORCE partic, acc_target_partic_test#,0,0
rem DYN SET LINEAR VELOCITY partic, vel_partic_test#,0,0
NEXT
rem ///////////////////////////////////////////////////////////////
rem ////// AIR PARTICLES MUST TO STAY IN THE AIR ZONE
rem ///////////////////////////////////////////////////////////////
fan_position_X# = object position x(8997) - (object size x(8997)/2)
fan_position_Y# = object position y(8997) - (object size y(8997)/2) + 2
fan_position_Z# = object position z(8997) - (object size z(8997)/2)
FOR az = 1 to max_numb_DBPro_cubes
posiz_X_attuale_part# = object position x(az)
posiz_Y_attuale_part# = object position y(az)
posiz_Z_attuale_part# = object position z(az)
IF posiz_X_attuale_part# > fan_position_X# + grand_zona_part_X#
part_pos_X# = fan_position_X# + rnd(grand_zona_part_X#)
DYN SET POSITION az, part_pos_X#, object position y(az),object position z(az)
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
IF posiz_Y_attuale_part# > fan_position_Y# + grand_zona_part_Y#
part_pos_Y# = fan_position_Y# + rnd(grand_zona_part_Y#)
DYN SET POSITION az, object position x(az), part_pos_Y#,object position z(az)
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
IF posiz_Z_attuale_part# > fan_position_Z# + grand_zona_part_Z#
part_pos_Z# = fan_position_Z# + rnd(grand_zona_part_Z#)
DYN SET POSITION az, object position x(az), object position y(az),part_pos_Z#
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
rem -----
IF posiz_X_attuale_part# < fan_position_X#
part_pos_X# = fan_position_X# + rnd(grand_zona_part_X#)
DYN SET POSITION az, part_pos_X#, object position y(az),object position z(az)
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
IF posiz_Y_attuale_part# < fan_position_Y#
part_pos_Y# = fan_position_Y# + rnd(grand_zona_part_Y#)
DYN SET POSITION az, object position x(az), part_pos_Y#,object position z(az)
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
IF posiz_Z_attuale_part# < fan_position_Z#
part_pos_Z# = fan_position_Z# + rnd(grand_zona_part_Z#)
DYN SET POSITION az, object position x(az), object position y(az),part_pos_Z#
DYN SET LINEAR VELOCITY az,0,0,0
ENDIF
NEXT
rem //////////////////////////////////////////////////////////////////
rem /////////////////// MOVING 1,8 meter OBJECT
rem //////////////////////////////////////////////////////////////////
IF lillox = 0
rem settiamo le coordinate XYZ del corpo alto 1,8 metri
zpuntatore_X# = object position x(8996)
zpuntatore_Y# = object position y(8996)
zpuntatore_Z# = object position z(8996)
lillox = 1
ENDIF
tasto_premuto_abilitato = 0 rem a 0 disattiva il lancio particelle con freccia su
IF leftkey()=1
zpuntatore_X# = zpuntatore_X# - 0.2
DYN SET POSITION 8996,zpuntatore_X#,zpuntatore_Y#,zpuntatore_Z#
ENDIF
IF rightkey()=1
zpuntatore_X# = zpuntatore_X# + 0.2
DYN SET POSITION 8996,zpuntatore_X#,zpuntatore_Y#,zpuntatore_Z#
ENDIF
IF downkey()=1
zpuntatore_Z# = zpuntatore_Z# - 0.2
DYN SET POSITION 8996,zpuntatore_X#,zpuntatore_Y#,zpuntatore_Z#
ENDIF
IF upkey()=1
zpuntatore_Z# = zpuntatore_Z# + 0.2
DYN SET POSITION 8996,zpuntatore_X#,zpuntatore_Y#,zpuntatore_Z#
ENDIF
rem ////////////////////////////////////////////////////////////////
rem ////// CHANGING OBJECT XYZ POSITION WITH DYN COMMAND
rem ////////////////////////////////////////////////////////////////
IF lower$(inkey$()) = "0"
greg = 1
ENDIF
IF greg = 1
if greg2 = 0
DYN SET POSITION 20004,100,20,100
greg2 = 1
endif
ENDIF
rem //////////////////////////////////////////////////////////
rem ////// CODICE PER TESTARE I TIPI DI FORZE GLOBALI E LOCALI
rem //////////////////////////////////////////////////////////
oggetto_per_test = 20009
intensita_della_forza# = 1945000
rem make object box 20008, 5,50,5 PALAZZO
rem Make object box 20009,80,4,40 LAMIERA
IF lower$(inkey$()) = "1"
TEXT 600,190," DYN ADD FORCE"
TEXT 600,220," FORZA GENERALE CHE SCORRE LUNGO L'ASSE GLOBALE X"
TEXT 600,240," TALE FORZA COLPIRA' TOTALMENTE L'OGGETTO"
rem applichiamo la forza
DYN ADD FORCE oggetto_per_test,-intensita_della_forza#,0,0
ENDIF
IF lower$(inkey$()) = "2"
TEXT 600,190," DYN ADD FORCE AT LOCAL POS"
TEXT 600,200," FORZA GENERALE CHE SCORRE LUNGO L'ASSE GLOBALE Y "
TEXT 600,220," MA CHE INFLUENZA UN PUNTO PRECISO DELL'OGGETTO"
TEXT 600,240," "
bla_X# = 0
bla_Z# = 0
rem applichiamo la forza
IF oggetto_per_test = 20009 rem lamier
DYN ADD FORCE AT LOCAL POS oggetto_per_test,0,intensita_della_forza#,0 ,-40,2,-20
ENDIF
ENDIF
IF lower$(inkey$()) = "3"
TEXT 600,190," DYN ADD LOCAL FORCE AT LOCAL POS"
TEXT 600,200," FORZA LOCALE CHE SCORRE LUNGO L'ASSE LOCALE Y "
TEXT 600,220," E CHE INFLUENZA UN PUNTO PRECISO DELL'OGGETTO"
TEXT 600,240," "
bla_X# = 0
bla_Z# = 0
rem applichiamo la forza
rem DYN ADD LOCAL FORCE AT LOCAL POS oggetto_per_test,0,intensita_della_forza#,0 , -40,2,-20
rem Make object box 20009,80,4,40 LAMIERA
rem L'oggetto e' di size X = 80 e size Z = 40
rem Per settare coordinate locali che coprano tutto l'asse X locale, useremo
rem un range da X=-80 a X=+80 dove X=0 sara' la meta' della lunghezza X
rem
rem Per settare coordinate locali che coprano tutto l'asse Z locale, useremo
rem un range da Z=-40 a Z=+40 dove Z=0 sara' la meta' della lunghezza X
forc_local_X# = 80 : forc_local_Y# = 0 : forc_local_Z# = 40
DYN ADD LOCAL FORCE AT LOCAL POS oggetto_per_test, 0,intensita_della_forza#,0 , forc_local_X#,forc_local_Y#,forc_local_Z#
position object 20007, object position x(oggetto_per_test)+forc_local_X#/2, object position y(oggetto_per_test),object position z(oggetto_per_test)+forc_local_Z#/2
ENDIF
rem //////////////////////////////////////////////////////////////////
rem /////////////////// ROUTINE LANCIO PARTICELLE
rem //////////////////////////////////////////////////////////////////
gosub lancio_particelle
rem //////////////////////////////////////////////////////
rem ///////////////////// GRAVITA GENEREALE (F=on - G=off)
rem //////////////////////////////////////////////////////
gosub gravita_generale_on_off
rem //////////////////////////////////////////////////////
rem ///////////////// RILEVAMENTO COLLISSIONE TRA 2 ATTORI
rem //////////////////////////////////////////////////////
gosub collisione_tra_attori
DYN SIMULATE
fps_live = SCREEN FPS()
rem //////////////////////////////////////////////////////
rem ////////////////// SCELTA MODALITA' SIMULATORE (0 o 1)
rem //////////////////////////////////////////////////////
IF lower$(inkey$()) = "e" then modalita_simulatore = 0 rem modalità lancio particelle
IF lower$(inkey$()) = "r" then modalita_simulatore = 1 rem modalità puntatore editor
rem //////////////////////////////////////////////////////
rem /////////////////////////////////// VISTA CON IL MOUSE
rem //////////////////////////////////////////////////////
gosub vista_con_mouse
rem //////////////////////////////////////////////////////
rem /////////////////////////////////// TESTO
rem //////////////////////////////////////////////////////
gosub testo
text 10,10,"CAMERA POS X = "+str$(camera position x())
text 10,20,"CAMERA POS Y = "+str$(camera position y())
text 10,30,"CAMERA POS Z = "+str$(camera position z())
text 10,50,"acx# = "+str$(acx#)
text 10,60,"acy# = "+str$(acy#)
Sync
loop
DYN FETCH RESULTS
//-- Release terrain actor which was instanced from height field.
DYN DELETE ACTOR terrainID
//-- Now we can release height field
rem DYN DELETE HEIGHT FIELD heightFieldID
DYN STOP
rem --------------------------------------------------------------------------------
rem ------------------------------------ FUNCTIONS ---------------------------------
rem --------------------------------------------------------------------------------
function makeTerrain()
load object "mappa_aldo3.x",terrainID
color object terrainID,rgb(92,120,25) rem rgb(107,125,2)
position object terrainID,0,-302.25,0
DYN COOK TRIANGLE MESH terrainID,1
DYN MAKE TRIANGLE MESH terrainID,1
endfunction
function makeHeightField()
x = Get Terrain X Size(terrainID)
z = Get Terrain Z Size(terrainID)
//-- Create a height field desc structure to hold our
//-- height data. This structure must be the correct size
//-- for the terrain, in this case 256x256.
descID = 1
rem (int ID, int columns, int rows, float verticalExtent, float thickness, float convexEdgeThreshold)
DYN MAKE HEIGHT FIELD DESC descID, x, z, -1000, 0, 0
//-- Retrieve and then set our height data, remembering the terrain is scaled.
for i = 0 to x - 1
for j = 0 to z - 1
height = Get Terrain ground Height(terrainID, i * terrainScale, j * terrainScale)
DYN HEIGHT FIELD DESC SET DATA descID, i, j, height
next j
next i
//-- Now all our data is set we create a height field, this height field can
//-- be instanced as many times as you like, this is useful if you have repeated
//-- your terrain to save memory.
DYN MAKE HEIGHT FIELD heightFieldID, descID
//-- We no longer need desc.
DYN DELETE HEIGHT FIELD DESC descID
//-- This is where we create our actor instanced from the height field
//-- we have created.
//-- Since the data was collected from a scaled up area we need to scale our
//-- height field to match.
rem (int ID, int heightFieldID, float heightScale, float rowScale, float columnScale)
DYN INSTANCE HEIGHT FIELD terrainID, heightFieldID, 1, terrainScale, terrainScale
endfunction
//-- Fixed jo fixes two actors together as though they are one actor, they will not move
//-- or rotate relative to each other.
function makeJointFixed(jointID, objectA, objectB)
//-- Create descriptor data structure.
DYN MAKE JOINT DESC 1
//-- Locked motion relative to joint position.
DYN JOINT DESC SET MOTION X 1, 0
DYN JOINT DESC SET MOTION Y 1, 0
DYN JOINT DESC SET MOTION Z 1, 0
//-- Locked rotation also.
DYN JOINT DESC SET SWING1 MOTION 1, 0
DYN JOINT DESC SET SWING2 MOTION 1, 0
DYN JOINT DESC SET TWIST MOTION 1, 0
//-- What actors are involved?
DYN JOINT DESC SET ACTOR A 1, objectA
DYN JOINT DESC SET ACTOR B 1, objectB
//-- Must set this after actors have been set.
//-- Location of anchor can be anything for a fixed joint.
DYN JOINT DESC SET GLOBAL ANCHOR 1, 0, 0, 0
DYN JOINT DESC SET GLOBAL AXIS 1, 0, 1, 0
//-- Create joint.
DYN MAKE JOINT jointID, 1
//-- No longer need descriptor.
DYN DELETE JOINT DESC 1
endfunction
function processUserInput()
torque# = 0.0
steer# = 0.0
if upkey()
DYN ADD LOCAL FORCE 8999, 0, 0, 10 `Wakes up actor if asleep, wheels will not do this.
torque# = 100
endif
if downkey()
torque# = -100
endif
if leftkey()
steer# = -20
endif
if rightkey()
steer# = 20
endif
DYN WHEEL SET MOTOR TORQUE 9101, 0, torque#
DYN WHEEL SET MOTOR TORQUE 9102, 0, torque#
DYN WHEEL SET STEER ANGLE 9100, 0, steer#
endfunction
There was 2 PIECES OF CODE THAT ARE A BAD HIT TO MY SIMULATION SPEED. THESE CODES ARE REALLY LITTLE BUT MAKING SOME FOR CYCLES. EACH OF THESE FOR CYCLES ARE CYCLING 3000 OBJECTS (THE AIR PARTICLES).
Here the name of these 2 pieces of code:
MOVING AIR PARTICLES
AIR PARTICLES MUST TO STAY IN THE AIR ZONE