10-04-2024, 05:36 PM
(This post was last modified: 10-04-2024, 05:39 PM by aliensoldier.)
(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.
(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.