Sometimes, I wonder how you code every game efficiently using min() or max() functions.
This is a piece of code to animate a Santa Claus :
- cell sprite animation
- move santa from left to the right
- make santa jump up and down
Please advice me how to make the code efficient, perhaps using min() or max() functions ?
Thank you.
Code:
'santa claus animation
'----------------------
'Cell Animation
draw image santa.run,santa.move,santa.jump,santa.cell
if santa.cell<11 then
santa.cell = santa.cell + dt*20
else
santa.cell = 0
endif
'Running Santa
if santa.move > 520 then
santa.move = -50
else
santa.move = santa.move + dt*50
endif
'Santa Position
if keydown(KEY_SPACE) then
santa.pos = 1 'santa position 0=stay 1=up 2=down
endif
if santa.pos=1 then
santa.jump = santa.jump - dt*100
elseif santa.pos=2 then
santa.jump = santa.jump + dt*100
else
santa.jump = 175
endif
if santa.jump <= 80 then
santa.pos = 2
elseif santa.jump >= 175 then
santa.pos = 0
endif
while not keydown(KEY_ESCAPE, true)
i = 0
while i < sizeof(plybullets)
b = plybullets[i]
b.pos.x = b.pos.x + b.spd.x
b.pos.y = b.pos.y + b.spd.y
if b.pos.x < -b.size.x or b.pos.x >= 256 or b.pos.y < -b.size.y or b.pos.y >= 224
free key plybullets, i
else
hit = false
for y = EROWS - 1 to 0
for x = 0 to ECOLS - 1
e = enms[x][y]
if e and Collides(b, e)
e.stm = e.stm - 1
if e.stm <= 0 enms[x][y] = unset
hit = true
break
endif
next
if hit break
next
if hit free key plybullets, i
else i = i + 1
endif
wend
i = 0
while i < sizeof(enmbullets)
b = enmbullets[i]
b.pos.x = b.pos.x + b.spd.x
b.pos.y = b.pos.y + b.spd.y
if b.pos.x < -b.size.x or b.pos.x >= 256 or b.pos.y < -b.size.y or b.pos.y >= 224
free key enmbullets, i
else
i = i + 1
endif
wend
divet = divet - 1
if divet <= 0
clear tmp
for y = 0 to EROWS - 1 for x = 0 to ECOLS - 1
if enms[x][y] and enms[x][y].p = unset tmp[sizeof(tmp)] = enms[x][y]
next
if sizeof(tmp)
e = tmp[rnd(sizeof(tmp))]
e.p = 0
e.c[0].x = e.pos.x; e.c[0].y = e.pos.y
e.c[1].x = rnd(242); e.c[1].y = 224
e.c[2].x = rnd(242); e.c[2].y = 224
e.c[3].x = e.pos.x; e.c[3].y = e.pos.y
divet = 120 + rnd(3)*60
else
divet = 60
endif
endif
enmshoott = enmshoott - 1
if enmshoott < 0
enmshoott = 180 + rnd(3)*60
clear tmp
for y = 0 to EROWS - 1 for x = 0 to ECOLS - 1
if enms[x][y] for i = 0 to enms[x][y].p <> unset tmp[sizeof(tmp)] = enms[x][y]
next
if sizeof(tmp)
e = tmp[rnd(sizeof(tmp))]
dx = ply.pos.x - e.pos.x
dy = ply.pos.y - e.pos.y
k = sqr(dx*dx + dy*dy)
if k > 0
dx = 2*dx/k
dy = 2*dy/k
enmbullets[sizeof(enmbullets)] = [
pos: Point(e.pos.x + e.size.x/2 - 2, e.pos.y + e.size.y/2 - 2),
size: Point(4, 4),
spd: Point(dx, dy)]
endif
endif
endif
enmsa = (enmsa + 1)%360
for y = 0 to EROWS - 1
offsx = 128 - ECOLS*8 + sin(rad(enmsa + y*22.5))*24
offsy = 24
for x = 0 to ECOLS - 1
e = enms[x][y]
if e
gx = x*16 + offsx + 1; gy = y*16 + offsy + 1
if typeof(e.p)
e.p = e.p + 0.005
if e.p >= 1
e.p = unset
e.pos.x = gx; e.pos.y = gy
else
e.c[3].x = gx; e.c[3].y = gy
EvalCBCD(e.pos, e.c, e.p)
e.a = atan2(e.pos.y, e.pos.x) - 0.5*PI
if e.p < 0.2 e.a = e.a*5*e.p
elseif e.p >= 0.8 e.a = e.a*(1 - e.p)/0.2
EvalCBC(e.pos, e.c, e.p)
endif
else
e.pos.x = gx
e.pos.y = gy
endif
endif
next
next
set color 0, 0, 0
cls
set color 255, 255, 255
for y = 0 to EROWS - 1 for x = 0 to ECOLS - 1
e = enms[x][y]
if e and e.p = unset draw image e.img, e.pos.x, e.pos.y
next
for y = 0 to EROWS - 1 for x = 0 to ECOLS - 1
e = enms[x][y]
if e and typeof(e.p)
draw image xform e.img, e.pos.x + 7, e.pos.y + 7, 1, 1, e.a, 7, 7
endif
next
draw image plyImg, ply.pos.x, ply.pos.y
set color 255, 255, 255
foreach b in plybullets draw rect b.pos.x, b.pos.y, b.size.x, b.size.y, true
set color 0, 255, 255
foreach b in enmbullets draw rect b.pos.x, b.pos.y, b.size.x, b.size.y, true
set color 255, 255, 255
set caret 0, 0
wln sizeof(plybullets)
wln sizeof(enmbullets)
function CreateBitmap(data, r, g, b)
img = createimage(sizeof(data[0]), sizeof(data))
set image img
for y = 0 to sizeof(data) - 1 for x = 0 to sizeof(data[0]) - 1
set color data[y][x]*r, data[y][x]*g, data[y][x]*b
set pixel x, y
next
set image primary
set image colorkey img, 0, 0, 0
return img
endfunc
' Set up 3d view.
S3D_SetView(primary, rad(90), 0.1, 20)
' Render polygons as we add them. If direct mode is false, all polygons are batched, sorted by
' distance and rendered when we call S3D_Render. Here we draw from back to front manually.
S3D_SetDirectMode(true)
road = []
for z = 0 to 999 road[z] = [x: sin(z*0.05)*6, y: sin(z*0.1)*3]
playerz = 0.0
playerx = 0
playery = -1
projected = dim(4) ' Don't want to spawn too many tables in a game loop, reused for calculations.
lastTick = clock()
while not keydown(KEY_ESCAPE, true)
t = clock()
dt = (t - lastTick)/1000
lastTick = t
playerz = playerz + 4*dt
' calculate camera y
if int(playerz) < sizeof(road) - 2
k = playerz%1
playery = (1 - k)*road[int(playerz)].y + k*road[int(playerz) + 1].y - 0.5
else
playery = road[sizeof(road) - 1].y - 0.5
endif
' move left and right
if keydown(KEY_LEFT) playerx = playerx - 4*dt
if keydown(KEY_RIGHT) playerx = playerx + 4*dt
set color 255, 255, 255
draw image bgImg, 0, -80 - playery*5
for i = int(playerz) + 20 to int(playerz)
if i < sizeof(road) - 2
strips = strips + 1
' Do we need to fill with snow color to hide distant objects?
S3D_Project(projected, 0, road[i + 1].y, i + 1)
y0 = round(projected[1])
S3D_Project(projected, 0, road[i].y, i)
y1 = round(projected[1])
if y1 > y0
if not didFill
didFill = true
fills = fills + 1
set color 218, 218, 218
draw rect 0, y0, width(primary), height(primary) - y0, true
set color 255, 255, 255
endif
else
didFill = false
endif
' Draw road.
x0 = road[i].x
x1 = road[i + 1].x
set color 255, 255, 255
S3D_Texture(roadImg)
S3D_Vertex(x0 - 2, road[i].y, i, 0, roadImgH)
S3D_Vertex(x0 + 2, road[i].y, i, roadImgW, roadImgH)
S3D_Vertex(x1 + 2, road[i + 1].y, i + 1, roadImgW, 0)
S3D_Vertex(x1 - 2, road[i + 1].y, i + 1, 0, 0)
' Draw sprites.
' Fade in.
z = (i + 1) - playerz
if z > 15
a = ((20 - z)/5)*255
set color 255, 255, 255, a
endif
if i%20 = 0
S3D_Texture(tunnelImg)
S3D_Vertex(road[i].x - 5, road[i].y + 0.2, i, 0, height(tunnelImg))
S3D_Vertex(road[i].x + 5, road[i].y + 0.2, i, width(tunnelImg), height(tunnelImg))
S3D_Vertex(road[i].x + 5, road[i].y - 3.5, i, width(tunnelImg), 0)
S3D_Vertex(road[i].x - 5, road[i].y - 3.5, i, 0, 0)
else
if i%2 = 0
S3D_Texture(decorImg)
x = x0 - 2.5
S3D_Vertex(x - 0.4, road[i].y, i, 0, height(decorImg))
S3D_Vertex(x + 0.4, road[i].y, i, width(decorImg), height(decorImg))
S3D_Vertex(x + 0.4, road[i].y - 1, i, width(decorImg), 0)
S3D_Vertex(x - 0.4, road[i].y - 1, i, 0, 0)
else
S3D_Texture(decorImg)
x = x0 + 2.5
S3D_Vertex(x - 0.4, road[i].y, i, 0, height(decorImg))
S3D_Vertex(x + 0.4, road[i].y, i, width(decorImg), height(decorImg))
S3D_Vertex(x + 0.4, road[i].y - 1, i, width(decorImg), 0)
S3D_Vertex(x - 0.4, road[i].y - 1, i, 0, 0)
endif
endif
endif
next
S3D_End()
'S3D_Render()
set caret 0, 0
wln round(1/dt)
wln strips
wln fills
redraw
wait 1
wend
I had a few spare moments and decided to have a look at N7 themes... as you know, I run N7 via Wine, on my Linux Mint machine. Although Wine does a fairly good job at running Windows applications, it is far from perfect.
As you can see, by the image provided, Linux Mint "estimates" the font if the correct font is not loaded... I figured that installing Microsoft's core fonts (sudo apt-get install msttcorefonts) would do the trick, but I already have the core fonts installed... The most logical question to ask is, "What fonts does NGUI Theme Editor expect to find on its host system"?
The program itself functions as it should without error... It's just me being a bit "picky" about the "appearance" of the GUI... lol
Thank you.
J
Update: Ran Theme Editor via Windows 7 (Virtual Machine) and all the text looks ok...
If I were to create, not that I will mind you, an old text-based adventure game** using N7, is there a way to scroll the text up the screen when the game output goes beyond a "screen full"?
** Interactive Fiction... I think is the going genre for text adventures...
If this is too involved or difficult then it would be best to ignore the request... after letting me know of course... lol
Looking through my drives, for anything Naalaa, I came across a reference to N4... Then I got to thinking (stop laughing) as to when Naalaa was created?
When you get a spare moment, would it be possible, to briefly go through the history of Naalaa? If you can, could you also include authorized video interviews; media references and general folk-lore? A twenty minute video or a 235page PDF would be appreciated... Nah! Kidding! It does not have to be authorized... lol
set color 0, 0, 0
cls
for x = 0 to sizeof(maze) - 1
for y = 0 to sizeof(maze[0]) - 1
dx = x*side
dy = y*side
set color 255, 255, 255
if not maze[x][y].l draw line dx, dy, dx, dy + side - 1
if not maze[x][y].r draw line dx + side - 1, dy, dx + side - 1, dy + side - 1
if not maze[x][y].u draw line dx, dy, dx + side - 1, dy
if not maze[x][y].d draw line dx, dy + side - 1, dx + side - 1, dy + side - 1
next
next
redraw
while not keydown(KEY_ESCAPE, true) fwait 60
' GenerateMaze
' ------------
' Return an array of the size w*h, where every element has four fields, l, r, u and d, telling if
' there's a way left, right, up and down.
function GenerateMaze(w, h)
maze = fill([vis: false, l: false, r: false, u: false, d: false], w, h)
GenerateMazeRec(maze, rnd(sizeof(maze)), rnd(sizeof(maze[0])), 0)
return maze
function GenerateMazeRec(maze, x, y, dir)
if x < 0 or x >= sizeof(maze) or y < 0 or y >= sizeof(maze[0]) return false
if maze[x][y].vis return false
maze[x][y].vis = true
if dir = 1
maze[x][y].r = true
maze[x + 1][y].l = true
elseif dir = 2
maze[x][y].l = true
maze[x - 1][y].r = true
elseif dir = 3
maze[x][y].d = true
maze[x][y + 1].u = true
elseif dir = 4
maze[x][y].u = true
maze[x][y - 1].d = true
endif
visit = [1, 2, 3, 4]
while sizeof(visit)
index = rnd(sizeof(visit))
if visit[index] = 1 GenerateMazeRec(maze, x - 1, y, 1)
elseif visit[index] = 2 GenerateMazeRec(maze, x + 1, y, 2)
elseif visit[index] = 3 GenerateMazeRec(maze, x, y - 1, 3)
else GenerateMazeRec(maze, x, y + 1, 4)
free key visit, index
wend
return true
endfunc
endfunc
I'll post some more code later, explaining how this can be used for creating a map for the wolf3d library.