onEachFrame: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Lou Montana (talk | contribs) m (Some wiki formatting) |
||
Line 12: | Line 12: | ||
|gr1= Event Handlers | |gr1= Event Handlers | ||
|descr= Runs given statement every frame. | |descr= Runs given statement every frame in an [[Scheduler#Unscheduled Environment|unscheduled environment]]. | ||
{{Feature|arma3 | | {{Feature|arma3| | ||
In order to keep compatibility between official and community content: | In order to keep compatibility between official and community content: | ||
* Since {{arma3}} v1.57 a stackable version of this EH is available: [[Arma 3: Mission Event Handlers#EachFrame|EachFrame Mission Event Handler]] | * Since {{arma3}} v1.57 a stackable version of this EH is available: [[Arma 3: Mission Event Handlers#EachFrame|EachFrame Mission Event Handler]] | ||
* Before that, the scripted version of the event handler should be used instead (using [[BIS_fnc_addStackedEventHandler]] and [[BIS_fnc_removeStackedEventHandler]]).}} | * Before that, the scripted version of the event handler should be used instead (using [[BIS_fnc_addStackedEventHandler]] and [[BIS_fnc_removeStackedEventHandler]]). | ||
}} | |||
|s1= [[onEachFrame]] statement | |s1= [[onEachFrame]] statement | ||
Line 24: | Line 25: | ||
|r1= [[Nothing]] | |r1= [[Nothing]] | ||
|x1= <sqf>onEachFrame { hintSilent str | |x1= <sqf>onEachFrame { hintSilent str getPosWorld player }; // hints position every frame</sqf> | ||
|x2= Private variables defined outside of the [[onEachFrame]] scope are not inherited: | |x2= Private variables defined outside of the [[onEachFrame]] scope are not inherited: | ||
<sqf> | <sqf> | ||
_myVar = "bob"; | |||
MyVar = "bill"; | |||
onEachFrame { hintSilent str [ | onEachFrame { hintSilent str [_myVar, MyVar]; }; | ||
// Result: [any, "bill"] | // Result: [any, "bill"] | ||
</sqf> | </sqf> | ||
|x3= Only one [[onEachFrame]] loop can exist at any time: | |x3= Only one [[onEachFrame]] loop can exist at any time: | ||
<sqf>onEachFrame { player sideChat "first"; }; | <sqf> | ||
onEachFrame { player sideChat "second"; }; | onEachFrame { player sideChat "first"; }; | ||
// | onEachFrame { player sideChat "second"; }; // replaces the first one | ||
onEachFrame {}; // reset to the initial state | |||
</sqf> | |||
|x4= Script suspension is not permitted within [[onEachFrame]] scope: | |x4= Script suspension is not permitted within [[onEachFrame]] scope: | ||
<sqf>// | <sqf> | ||
onEachFrame { sleep 1; };</sqf> | // will throw an error | ||
onEachFrame { sleep 1; }; | |||
</sqf> | |||
|x5= <sqf>onEachFrame {}; // | |x5= <sqf> | ||
onEachFrame { if (diag_frameNo mod 60 isEqualTo 0) then { /* code */ } }; // executes every 60 frames (every second @ 60 FPS, every two seconds @ 30 FPS, etc) | |||
onEachFrame { // this version is the closest to a precise 1 second tick | |||
if (isNil "TAG_LastHint") then | |||
{ | |||
TAG_LastHint = diag_tickTime; | |||
} | |||
else | |||
{ | |||
if (diag_tickTime - TAG_LastHint >= 1) then // set the duration in seconds here | |||
{ | |||
hint format ["a second has passed (%1s since game start)", diag_tickTime]; | |||
TAG_LastHint = diag_tickTime; | |||
}; | |||
}; | |||
}; | |||
</sqf> | |||
|seealso= [[diag_frameNo]] [[diag_fps]] | |seealso= [[diag_frameNo]] [[diag_fps]] | ||
}} | }} |
Revision as of 11:58, 6 January 2023
Description
- Description:
- Runs given statement every frame in an unscheduled environment.
- Groups:
- Event Handlers
Syntax
- Syntax:
- onEachFrame statement
- Parameters:
- statement: String or Code
- Return Value:
- Nothing
Examples
- Example 1:
- Example 2:
- Private variables defined outside of the onEachFrame scope are not inherited:
_myVar = "bob"; MyVar = "bill"; onEachFrame { hintSilent str [_myVar, MyVar]; }; // Result: [any, "bill"]
- Example 3:
- Only one onEachFrame loop can exist at any time:
- Example 4:
- Script suspension is not permitted within onEachFrame scope:
- Example 5:
- onEachFrame { if (diag_frameNo mod 60 isEqualTo 0) then { /* code */ } }; // executes every 60 frames (every second @ 60 FPS, every two seconds @ 30 FPS, etc) onEachFrame { // this version is the closest to a precise 1 second tick if (isNil "TAG_LastHint") then { TAG_LastHint = diag_tickTime; } else { if (diag_tickTime - TAG_LastHint >= 1) then // set the duration in seconds here { hint format ["a second has passed (%1s since game start)", diag_tickTime]; TAG_LastHint = diag_tickTime; }; }; };
Additional Information
- See also:
- diag_frameNo diag_fps
Notes
-
Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note