Lua's coroutines make easier to do different tasks simultaneously. Unfortunetaly, EGSL functions doesn't work properly when placed inside a coroutine. Look at this example (all files are attached, on Linux run from the terminal):
primes = coroutine.create(function()
for prime = 3, 1000000, 2 do
isprime = 1
for dziel = 3, math.ceil(math.sqrt(prime)), 2 do
if prime % dziel == 0 then
isprime = 0
break
end
end
if isprime == 1 then
print(prime)
end
coroutine.yield()
end
end)
function stars()
for k = 1, 200, 2 do
dot(stars1[k], stars1[k + 1])
end
for k = 1, 40, 2 do
fillbox(stars2[k], stars2[k + 1], stars2[k] + 1, stars2[k + 1] + 1)
end
for k = 1, 200, 2 do
if stars1[k] < 798 then
stars1[k] = stars1[k] + 1
else
stars1[k] = 1
end
end
for k = 1, 40, 2 do
if stars2[k] < 798 then
stars2[k] = stars2[k] + 3
else
stars2[k] = 1
end
end
end
function animation()
zx = zx + 3
zy = zy + 3
a = zx / 99
b = zy / 99
alphachannel(164)
for x = -1,1 do
for y = -1,1 do
for z = -1,1 do
y2 = y
x2 = x * math.cos(a) - y2 * math.sin(a)
y3 = x * math.sin(a) + y2 * math.cos(a)
y2 = y3
y3 = y2 * math.cos(b) - z * math.sin(b)
z2 = y2 * math.sin(b) + z * math.cos(b)
sx = x2 * (z2 + 2)
sy = y3 * (z2 + 2)
picture2 = zoomimage(picture, (z2 + 2) / 4, (z2 + 2) / 4)
putimage(sx * 40 + przes, sy * 40 + przes2, picture2)
freeimage(picture2)
przes = przes + stan2
przes2 = przes2 + stan3
if przes == 150 or przes == 550 then
stan2 = -stan2
end
if przes2 == 160 or przes2 == 260 then
stan3 = -stan3
end
end
end
end
alphachannel(255)
end
function scroll()
colour(kol, kol, kol)
kol = kol + stan
if kol >= 255 or kol < 10 then
stan = -stan
end
for k = 1, 98 do
drawtext((k * 8) + licz, 500, tekst[pocz + k])
end
licz = licz - 1
if licz < 0 then
pocz = pocz + 1
licz = 8
end
if pocz > table.maxn(tekst) then
pocz = 1
end
end
openwindow(800, 519, 0, "Simple demo")
setframetimer(50)
backcolour(0, 0, 0)
picture = loadimage("1.png")
colourkey(0, 0, 0)
stars1 = {}
stars2 = {}
tekst = {}
tekst2 = " Hi everybody! This is a simple demo made with EGSL - a very nice interpreter for making retro games. EGSL is based on Lua, an easy to learn scripting language that is often used in game industry. If you are interested in making simple 2d games or graphic demos, EGSL is something for you. It is free, open-source and multiplatform. Versions for Windows, Linux, Mac and Haiku are available. For more information, please visit http://egsl.retrogamecoding.org/. To exit, press 'Esc'. Code: Tomaaz."
a, b, zx, zy, x, y, z, y2, x2, y3, x3, z2, sx, sy = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
pocz = 1
licz = 8
kol = 10
stan = 5
stan2 = 0.125/2
stan3 = 0.125/4
przes = 500
przes2 = 250
for k = 1, string.len(tekst2) do
tekst[k] = string.sub(tekst2, k, k)
end
for k = 1, 200, 2 do
stars1[k] = math.random(1, 799)
stars1[k + 1] = math.random(20, 470)
end
for k = 1, 40, 2 do
stars2[k] = math.random(1, 799)
stars2[k + 1] = math.random(20, 470)
end
muz = loadmusic("1.ogg")
playmusic(muz, 99, 1000)
repeat
coroutine.resume(primes)
klawisz = getkey()
coroutine.resume(primes)
clearscreen()
coroutine.resume(primes)
colour(255, 255, 255)
coroutine.resume(primes)
stars()
coroutine.resume(primes)
animation()
coroutine.resume(primes)
scroll()
coroutine.resume(primes)
colour((255 - kol) / 4 + 64, (255 - kol) / 4 + 64, 0)
coroutine.resume(primes)
fillbox(0, 0, 799, 19)
coroutine.resume(primes)
fillbox(0, 515, 799, 518)
coroutine.resume(primes)
fillbox(0, 471, 799, 490)
coroutine.resume(primes)
colour(0, 0, 0)
coroutine.resume(primes)
fillbox (5, 499, 20, 514)
coroutine.resume(primes)
fillbox (779, 499, 799, 514)
coroutine.resume(primes)
sync()
until klawisz == 27
It runs simultaneously a demo (with graphics and sound) and a console program that counts all prime numbers less than one milion. It works only because the part that uses EGSL functions is outside a coroutine, but if any EGSL function would be placed inside a coroutine it wouldn't work properly.
Coroutines seem to be a perfect solution for games (different animations that take place at the same time, for example). Is it any way to use them with EGSL?