Thread Rating:
  • 1 Vote(s) - 4 Average
  • 1
  • 2
  • 3
  • 4
  • 5
slow down time
#1
https://youtu.be/_MR_6p1_qzU

In this game there are moments where the action slows down, especially enemy shots and especially the shots of the final boss of each phase.

Thanks to this you can dodge enemy shots more easily, how could you program the game to slow down at specific moments?
Reply
#2
(09-28-2024, 01:45 PM)aliensoldier Wrote: https://youtu.be/_MR_6p1_qzU

In this game there are moments where the action slows down, especially enemy shots and especially the shots of the final boss of each phase.

Thanks to this you can dodge enemy shots more easily, how could you program the game to slow down at specific moments?

I haven't looked at the video. But it's alot easier if you're already using delta time for all your movements/animations (for some reason I only do this in 3d games). Then you can just modify one variable to make the entire game slow down. I'll see if I can write an example tomorrow Smile
Reply
#3
My apologies for butting in on your conversation... After reading the part about 'delta time', I could not help but recall a similar problem that I had using rcbasic... Movement of spites/bullets were moving way too fast.

Code:
timeDelay = 0

...

function updateDelta()
    dt = (Timer - timedelay) * 0.001
    timedelay = Timer
    return timedelay
end function

Calling updateDelta() during the main game loop solved my issue. Of course, this was not written with N7, but should be easily converted... I hope that I have not added to your difficulties... I will not be offended if you choose not to use this or find a better method...

J
Logic is the beginning of wisdom.
Reply
#4
Here's an old example of something where I just added a slowmotion effect.


Code:
include "polyline.n7"

set window "path", 512, 512
set redraw off

' Create ship image.
img = createimage(32, 23)
set image img
set color 192, 192, 192
draw poly [0, 0, 31, 12, 0, 22], true
set color 0, 128, 255
draw ellipse 8, 12, 6, 4, true
set image primary
set image colorkey img, 0, 0, 0

' Create path for ships to follow.
path = PolyLine([[-16, -16], [384, 128], [384, 384], [128, 384], [128, 128], [528, -16]], false)
' An array for the ships.
ships = []
' A counter, everytime it reaches 0 a new ship will spawn.
spawnTimer = 0

' Some background stars.
stars = []
for i = 1 to 250
    c = 64 + rnd(192)
    stars[sizeof(stars)] = [
            x: rnd(512), y: rnd(512),
            dy: 25 + rnd(200),
            c: [c, c, c],
            Update: function(dt)
                this.y = (this.y + this.dy*dt)%512
            endfunc,
            Draw: function()
                set color this.c
                draw pixel this.x, this.y
            endfunc]
next

' Game speed.
gameSpeed = 1

prevTime = clock()
while not keydown(KEY_ESCAPE)
    ' Delta time, low cap at 15 fps.
    t = clock()
    dt = (min(t - prevTime, 66))/1000
    prevTime = t

    ' Slow down by pressing spacebar.
    if keydown(KEY_SPACE)  gameSpeed = max(gameSpeed - 2*dt, 0.25)
    else  gameSpeed = min(gameSpeed + 2*dt, 1)
    ' Multiply delta time with gameSpeed.
    dt = dt*gameSpeed       

    ' Time to spawn a new ship?
    spawnTimer = spawnTimer - dt
    if spawnTimer <= 0
        spawnTimer = spawnTimer + 0.246
        ' Add a ship to the ships array.
        ships[sizeof(ships)] = [
                img: img,              ' Image
                x: 0, y: 0, angle: 0,  ' Position and angle.
                path: path, dist: 0,    ' Path and traveled distance along path.
                ' Update function.
                Update: function(dt)
                    ' Get position and direction from path.
                    pos = this.path.GetPoint(this.dist, true)
                    dir = this.path.GetDirection(this.dist, true)
                    ' Get point returns an unset variable if the distance parameter is invalid. In
                    ' that case the ship should be removed - return false.
                    if pos
                        this.x = pos[0]
                        this.y = pos[1]
                        this.angle = atan2(dir[1], dir[0])
                        ' Move 300 pixels per second.
                        this.dist = this.dist + 300*dt
                    else
                        return false
                    endif
                    return true
                endfunc,
                ' Draw function.
                Draw: function()
                    set color 255, 255, 255
                    draw image xform this.img, this.x, this.y, 1, 1, this.angle, 15, 12
                endfunc]
    endif
   
    ' Update ships.
    i = 0
    while i < sizeof(ships)
        ' If update returns false, the ship should be removed.
        if ships[i].Update(dt)  i = i + 1
        else  free key ships, i
    wend
   
    ' Update stars.
    foreach s in stars  s.Update(dt)
   
    ' Draw.
    set color 0, 0, 0
    cls
    foreach s in stars  s.Draw()
    foreach s in ships  s.Draw()
   
    set color 255, 255, 255
    set caret 256, 248
    center sizeof(ships) + " ships"
    set caret 256, 480
    center "Hold spacebar for slow motion!"
   
    redraw
    wait 1
wend
Reply
#5
(09-29-2024, 09:40 AM)Marcus Wrote:
Code:
include "polyline.n7"
...

' Game speed.
while not keydown(KEY_ESCAPE)
    ' Delta time, low cap at 15 fps.
    ' Slow down by pressing spacebar.
    ' Multiply delta time with gameSpeed.
    ' Time to spawn a new ship?
    ' Update ships.
    ' Update stars.   
    ' Draw.
wend

Awesome ! I've never seen before on how to code "slow motion effect" in a game ... 
I used to play text games in "super real slow motion" and  "super slow dot matrix printer" back then in 1980s  Big Grin Big Grin Big Grin
Reply
#6
(09-29-2024, 09:40 AM)Marcus Wrote: Here's an old example of something where I just added a slowmotion effect.


Code:
include "polyline.n7"

set window "path", 512, 512
set redraw off

' Create ship image.
img = createimage(32, 23)
set image img
set color 192, 192, 192
draw poly [0, 0, 31, 12, 0, 22], true
set color 0, 128, 255
draw ellipse 8, 12, 6, 4, true
set image primary
set image colorkey img, 0, 0, 0

' Create path for ships to follow.
path = PolyLine([[-16, -16], [384, 128], [384, 384], [128, 384], [128, 128], [528, -16]], false)
' An array for the ships.
ships = []
' A counter, everytime it reaches 0 a new ship will spawn.
spawnTimer = 0

' Some background stars.
stars = []
for i = 1 to 250
    c = 64 + rnd(192)
    stars[sizeof(stars)] = [
            x: rnd(512), y: rnd(512),
            dy: 25 + rnd(200),
            c: [c, c, c],
            Update: function(dt)
                this.y = (this.y + this.dy*dt)%512
            endfunc,
            Draw: function()
                set color this.c
                draw pixel this.x, this.y
            endfunc]
next

' Game speed.
gameSpeed = 1

prevTime = clock()
while not keydown(KEY_ESCAPE)
    ' Delta time, low cap at 15 fps.
    t = clock()
    dt = (min(t - prevTime, 66))/1000
    prevTime = t

    ' Slow down by pressing spacebar.
    if keydown(KEY_SPACE)  gameSpeed = max(gameSpeed - 2*dt, 0.25)
    else  gameSpeed = min(gameSpeed + 2*dt, 1)
    ' Multiply delta time with gameSpeed.
    dt = dt*gameSpeed       

    ' Time to spawn a new ship?
    spawnTimer = spawnTimer - dt
    if spawnTimer <= 0
        spawnTimer = spawnTimer + 0.246
        ' Add a ship to the ships array.
        ships[sizeof(ships)] = [
                img: img,              ' Image
                x: 0, y: 0, angle: 0,  ' Position and angle.
                path: path, dist: 0,    ' Path and traveled distance along path.
                ' Update function.
                Update: function(dt)
                    ' Get position and direction from path.
                    pos = this.path.GetPoint(this.dist, true)
                    dir = this.path.GetDirection(this.dist, true)
                    ' Get point returns an unset variable if the distance parameter is invalid. In
                    ' that case the ship should be removed - return false.
                    if pos
                        this.x = pos[0]
                        this.y = pos[1]
                        this.angle = atan2(dir[1], dir[0])
                        ' Move 300 pixels per second.
                        this.dist = this.dist + 300*dt
                    else
                        return false
                    endif
                    return true
                endfunc,
                ' Draw function.
                Draw: function()
                    set color 255, 255, 255
                    draw image xform this.img, this.x, this.y, 1, 1, this.angle, 15, 12
                endfunc]
    endif
   
    ' Update ships.
    i = 0
    while i < sizeof(ships)
        ' If update returns false, the ship should be removed.
        if ships[i].Update(dt)  i = i + 1
        else  free key ships, i
    wend
   
    ' Update stars.
    foreach s in stars  s.Update(dt)
   
    ' Draw.
    set color 0, 0, 0
    cls
    foreach s in stars  s.Draw()
    foreach s in ships  s.Draw()
   
    set color 255, 255, 255
    set caret 256, 248
    center sizeof(ships) + " ships"
    set caret 256, 480
    center "Hold spacebar for slow motion!"
   
    redraw
    wait 1
wend

Thank you very much Marcus, that's what I wanted. Smile

(09-28-2024, 09:28 PM)johnno56 Wrote: My apologies for butting in on your conversation... After reading the part about 'delta time', I could not help but recall a similar problem that I had using rcbasic... Movement of spites/bullets were moving way too fast.

Code:
timeDelay = 0

...

function updateDelta()
    dt = (Timer - timedelay) * 0.001
    timedelay = Timer
    return timedelay
end function

Calling updateDelta() during the main game loop solved my issue. Of course, this was not written with N7, but should be easily converted... I hope that I have not added to your difficulties... I will not be offended if you choose not to use this or find a better method...

J

Every example is always welcome, thank you. Smile
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)