This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
4rpl:commands:signalgenerator [2022/07/25 19:42] – [Make a Unit Move or "Float" Above Terrain] more efficient code Karsten75 | 4rpl:commands:signalgenerator [2025/02/14 14:57] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
+ | < | ||
- | < | ||
====== SignalGenerator ====== | ====== SignalGenerator ====== | ||
Line 13: | Line 14: | ||
Arguments and type in order: | Arguments and type in order: | ||
- | * time: (floating point number) X coordinate | + | * time: (float) Current step in the waveform. For a wave duration of 10.0, a step of 2.5 is a quarter |
- | * frequency: (floating point number) The number | + | * frequency: (float) The frequency dictates the duration |
- | * phaseShift: (floating point number) An offset | + | * phaseShift: (float) A starting |
- | * invert: | + | * invert: (0/1) inverts the waveform |
* signalType: (0 to 6) | * signalType: (0 to 6) | ||
* 0 = NONE | * 0 = NONE | ||
Line 22: | Line 23: | ||
* 2 = SQUARE | * 2 = SQUARE | ||
* 3 = TRIANGLE | * 3 = TRIANGLE | ||
- | * 4 = SAW - TOOTH | + | * 4 = SAW-TOOTH |
* 5 = RANDOM | * 5 = RANDOM | ||
* 6 = CONSTANT | * 6 = CONSTANT | ||
- | ===== Notes ===== | + | The resulting variable sigValue contains |
- | ==== For all waveforms ==== | + | |
- | === Phase Shift === | + | |
- | The phase difference, or phase shift as it is also called, of a Sinusoidal Waveform is the angle Φ(Greek letter Phi), in degrees or radians that the waveform has shifted from a certain reference point along the horizontal zero axis. In other words phase shift is the lateral difference between two or more waveforms along a common axis. Sinusoidal waveforms of the same frequency can have a phase difference. | + | |
- | The phase difference, Φ of an alternating waveform can vary from between 0 to its maximum time period, T of the waveform during one complete cycle and this can be anywhere along the horizontal axis between, Φ = 0 to 2π(radians) or Φ = 0 to 360o depending upon the angular units used. | + | ===== Example ===== |
+ | To create a sine wave that should start at its peak and run for 80 frames until it repeats, we should set the frequency | ||
- | ==== For sine wave function | + | Play the following example in the editor console to spawn a continuous stream of creeper using the sine wave at the bottom of the map. |
- | === Time and Frequency | + | <code 4RPL> |
+ | $time:0 | ||
+ | $duration: | ||
+ | $phaseShift: | ||
+ | $invert:0 | ||
+ | $signalType: | ||
+ | |||
+ | SignalGenerator(< | ||
+ | <-time 1 add ->time | ||
+ | |||
+ | #Let's use the result to spawn some creeper in a range of cells: | ||
+ | AddCreeper(< | ||
+ | |||
+ | :Once | ||
+ | 1.0 < | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Patterns | ||
+ | [{{cw4_signalgenerator_1.png|1 - SINE, Pattern repeated every 60 cells}}] \\ | ||
+ | [{{cw4_signalgenerator_2.png|2 - SQUARE, Pattern repeated every 60 cells}}] | ||
+ | [{{cw4_signalgenerator_3.png|3 - TRIANGLE, Pattern repeated every 60 cells}}] \\ | ||
+ | [{{cw4_signalgenerator_4.png|4 - SAW-TOOTH, Pattern repeated every 60 cells}}] | ||
+ | [{{cw4_signalgenerator_5.png|5 - RANDOM, Pattern repeated every 5 cells}}] \\ | ||
+ | |||
+ | ===== Extra Notes ===== | ||
+ | This is how each wave is produced in the game's source code: | ||
+ | ==== Sine wave function ==== | ||
<code C#> | <code C#> | ||
float t = frequency * time + phase; | float t = frequency * time + phase; | ||
value = (float)Mathf.Sin(2f * Mathf.PI * t); | value = (float)Mathf.Sin(2f * Mathf.PI * t); | ||
</ | </ | ||
- | ==== For square | + | ==== Square |
- | === Time and Frequency | + | |
<code c#> | <code c#> | ||
- | Square: | + | value = Mathf.Sign(Mathf.Sin(2f * Mathf.PI * t)); |
</ | </ | ||
==== For triangle wave function ==== | ==== For triangle wave function ==== | ||
- | === Time and Frequency === | ||
<code c#> | <code c#> | ||
- | Triangle | + | value = 1f - 4f * (float)Mathf.Abs(Mathf.Round(t - 0.25f) - (t - 0.25f)); |
</ | </ | ||
- | ==== For sawtooth | + | ==== Saw-tooth |
- | === Time and Frequency | + | |
<code c#> | <code c#> | ||
- | Sawtooth: | + | value = 2f * (t - (float)Mathf.Floor(t + 0.5f)); |
</ | </ | ||
- | ==== For random | + | ==== Random |
- | === Time and Frequency === | + | The function will output the same number for a given interval. |
<code c#> | <code c#> | ||
- | Random: | + | float interval = 1 / frequency; |
- | int slot = (int)(time / interval) ; | + | int slot = (int)(time / interval) ; |
- | slot = (slot * 1431655781) + (slot * 1183186591) + (slot * 622729787) + (slot * 338294347); | + | slot = (slot * 1431655781) + (slot * 1183186591) + (slot * 622729787) + (slot * 338294347); |
- | if (slot < 0) slot = -slot; | + | if (slot < 0) slot = -slot; |
- | value = (float)GameSpace.instance.RandDoubleInput(randSeed + slot)*2-1; | + | value = (float)GameSpace.instance.RandDoubleInput(randSeed + slot)*2-1; |
</ | </ | ||
- | ===== Examples | + | ===== Extra examples |
==== Sine Wave Creeper on Terrain ==== | ==== Sine Wave Creeper on Terrain ==== | ||
<code 4rpl> | <code 4rpl> | ||
Line 90: | Line 113: | ||
{{sine_creeper.png? | {{sine_creeper.png? | ||
- | |||
- | |||
==== Make a Unit Move or " | ==== Make a Unit Move or " | ||
Line 119: | Line 140: | ||
1 -> | 1 -> | ||
0.5 -> | 0.5 -> | ||
- | |||
- | |||
- | |||
</ | </ | ||
< | < |