Add 3D example

This commit is contained in:
Fierelier 2023-08-10 02:10:09 +02:00
parent 411de3d7c7
commit 0df6d91934
16 changed files with 251 additions and 62 deletions

215
mods/main/script/game.lua Normal file
View File

@ -0,0 +1,215 @@
package.path = basepath.. "/mods/main/script/?.lua;" ..basepath.. "/mods/main/script/?/main.lua;" ..package.path
function bp(pth)
return basepath .. "/mods/main/" ..pth
end
local width = 320
local height = 240
local px = -1
local py = -0.4
local pz = 0.5
local prx = 0
local pry = 0
function main()
window = engine_window_create(width,height,"engine")
-- Load chars
loadchar("invalid","invalid")
for ch=0,9,1 do loadchar(tostring(ch),tostring(ch)) end
loadchar("space"," ")
loadchar("dot",".")
loadchar("minus","-")
engine_rendertarget_set(engine_window_texture_get(window))
-- Clear window
engine_color_set(0,0,0,255)
engine_rendertarget_fill(0,0,width - 1,height - 1)
while true do
event = engine_event_get()
eventData = {engine_lua_event_get_data(event)}
engine_event_free(event)
if eventData[1] ~= ENGINE_EVENT_TYPE_NONE then
handleEvent(event,eventData)
else
tick()
end
end
end
function logic()
engine_color_set(0,0,20,255)
engine_rendertarget_fill(0,0,width - 1,height - 1)
if pressedKeys[26] then -- w
prx = prx + (0.1 * frametime)
end
if pressedKeys[22] then -- s
prx = prx - (0.1 * frametime)
end
if pressedKeys[7] then -- d
pry = pry + (0.1 * frametime)
end
if pressedKeys[4] then -- a
pry = pry - (0.1 * frametime)
end
local fwdX,fwdY,fwdZ = engine_3d_rotate_position(1,0,0,0,-pry,0)
local rgtX,rgtY,rgtZ = engine_3d_rotate_position(0,0,1,0,-pry,0)
if pressedKeys[82] then -- up
px = px + (fwdX * (0.01 * frametime))
py = py + (fwdY * (0.01 * frametime))
pz = pz + (fwdZ * (0.01 * frametime))
end
if pressedKeys[81] then -- down
px = px - (fwdX * (0.01 * frametime))
py = py - (fwdY * (0.01 * frametime))
pz = pz - (fwdZ * (0.01 * frametime))
end
if pressedKeys[80] then -- left
px = px - (rgtX * (0.01 * frametime))
py = py - (rgtY * (0.01 * frametime))
pz = pz - (rgtZ * (0.01 * frametime))
end
if pressedKeys[79] then -- right
px = px + (rgtX * (0.01 * frametime))
py = py + (rgtY * (0.01 * frametime))
pz = pz + (rgtZ * (0.01 * frametime))
end
if pressedKeys[75] then -- pgup
py = py - (0.01 * frametime)
end
if pressedKeys[78] then -- pgdown
py = py + (0.01 * frametime)
end
engine_color_set(255,0,255,255)
for i=0,1,0.1 do draw3dpoint(i,0,0) end
for i=0,1,0.1 do draw3dpoint(i,1,0) end
engine_color_set(64,0,64,255)
for i=0,1,0.1 do draw3dpoint(i,0,1) end
for i=0,1,0.1 do draw3dpoint(i,1,1) end
engine_color_set(255,0,255,255)
for i=0,1,0.1 do draw3dpoint(0,i,0) end
for i=0,1,0.1 do draw3dpoint(1,i,0) end
engine_color_set(64,0,64,255)
for i=0,1,0.1 do draw3dpoint(0,i,1) end
for i=0,1,0.1 do draw3dpoint(1,i,1) end
for i=0,1,0.1 do engine_color_set(255 - math.ceil(192 * i),0,255 - math.ceil(192 * i),255) draw3dpoint(0,0,i) end
for i=0,1,0.1 do engine_color_set(255 - math.ceil(192 * i),0,255 - math.ceil(192 * i),255) draw3dpoint(1,0,i) end
for i=0,1,0.1 do engine_color_set(255 - math.ceil(192 * i),0,255 - math.ceil(192 * i),255) draw3dpoint(0,1,i) end
for i=0,1,0.1 do engine_color_set(255 - math.ceil(192 * i),0,255 - math.ceil(192 * i),255) draw3dpoint(1,1,i) end
if framerate ~= nil then drawText(framerate,0,0) end
drawText(prettyNumber(px),0,16)
drawText(prettyNumber(py),0,24)
drawText(prettyNumber(pz),0,32)
drawText(prettyNumber(prx),0,48)
drawText(prettyNumber(pry),0,56)
end
lastFrame = engine_time_get()
frametime = 16
function tick()
logic()
engine_window_present(window)
trackFps()
local curFrame = engine_time_get()
frametime = (curFrame - lastFrame)
local wait = 16 - frametime
if wait > 0 then engine_time_sleep(wait) end
lastFrame = engine_time_get()
end
pressedKeys = {}
function handleEvent()
if eventData[1] == ENGINE_EVENT_TYPE_EXIT then
os.exit()
end
if eventData[1] == ENGINE_EVENT_TYPE_INPUT_KB then
if eventData[3] == 1 then
print(tostring(eventData[2]).. " pressed")
pressedKeys[eventData[2]] = true
else
print(tostring(eventData[2]).. " released")
pressedKeys[eventData[2]] = nil
end
end
end
framerate = 0
local frameSec = 0
local lastSec = 0
function trackFps()
frameSec = frameSec + 1
t = engine_time_get()
if t - lastSec >= 1000 then
framerate = frameSec
lastSec = t
frameSec = 0
end
end
function draw3dpoint(x,y,z)
x = px - x
y = py - y
z = pz - z
local sx,sy = engine_3d_project(x,y,z,prx,pry,0,90);
sx = math.floor((width * 0.5) + (sx * (width * 0.5)))
sy = math.floor((height * 0.5) + (sy * (height * 0.5)))
-- Clip point within bounds (debugging)
if sx < 0 then sx = 0 end
if sx > width - 1 then sx = width - 1 end
if sy < 0 then sy = 0 end
if sy > height - 1 then sy = height - 1 end
if sx < 0 or sx > width - 1 then return end
if sy < 0 or sy > height - 1 then return end
engine_rendertarget_draw_point(sx,sy)
end
chars = {}
function loadchar(fi,ch)
local tex = engine_texture_create(8,8)
engine_rendertarget_set(tex)
engine_rendertarget_draw_file(bp("texture/char/" ..fi.. ".rgba"))
chars[ch] = tex
end
function drawText(text,x,y)
local len = string.len(text)
local index = 1
while index <= len do
local char = string.sub(text,index,index)
if chars[char] == nil then char = "invalid" end
engine_rendertarget_draw_texture(chars[char],x + (8 * (index - 1)),y)
index = index + 1
end
end
function prettyNumber(nr)
local out = string.format("%.2f",nr)
if string.sub(out,1,1) ~= "-" then out = " " ..out end
return out
end
main()

View File

@ -1,63 +1,37 @@
function main()
math.randomseed(os.time())
window = engine_window_create(96,64,"Game")
texture = engine_texture_create(8,8)
engine_rendertarget_set(texture)
engine_rendertarget_draw_file(bp("texture/fier.rgba"))
engine_rendertarget_set(engine_window_texture_get(window))
while true do
event = engine_event_get()
eventData = {engine_lua_event_get_data(event)}
if eventData[1] ~= ENGINE_EVENT_TYPE_NONE then
handleEvent(event,eventData)
else
tick()
end
engine_event_free(event)
end
end
lastFrame = 0
function tick()
engine_rendertarget_draw_texture(texture,math.random(-8,104),math.random(-8,72))
engine_window_present(window)
trackFps()
local curFrame = engine_time_get()
local wait = 16 - (curFrame - lastFrame)
if wait > 0 then engine_time_sleep(wait) end
lastFrame = engine_time_get()
end
function handleEvent(event,eventData)
if eventData[1] == ENGINE_EVENT_TYPE_EXIT then
os.exit()
end
if eventData[1] == ENGINE_EVENT_TYPE_INPUT_KB then
for _,val in pairs(eventData) do
print(tostring(val))
end
end
end
local frameSec = 0
local lastSec = 0
function trackFps()
frameSec = frameSec + 1
t = engine_time_get()
if t - lastSec >= 1000 then
print("FPS: " ..tostring(frameSec))
lastSec = t
frameSec = 0
end
end
function bp(pth)
return basepath .. "/mods/main/" ..pth
end
basepath = (debug.getinfo(1, "S").source:sub(2):match("(.*[/\\])") or "./"):sub(1,-2) .. "/../../.." -- Lazy, fix
package.path = basepath.. "/mods/main/script/?.lua;" ..basepath.. "/mods/main/script/?/main.lua;" ..package.path
main()
function main()
dofile(basepath .. "/mods/main/script/game.lua")
end
xpcall(main,function(err)
local function splitString(str,sep)
if sep == nil then
sep = "%s"
end
local t={}
for strs in string.gmatch(str, "([^"..sep.."]+)") do
table.insert(t, strs)
end
return t
end
local function joinString(t,sep)
local str = t[1]
local index = 2
local length = #t
while index < length do
str = str .. sep .. t[index]
index = index + 1
end
return str
end
local debugString = splitString(debug.traceback(),"\n")
debugString[#debugString] = nil
debugString[#debugString] = nil
debugString[#debugString] = nil
table.remove(debugString,2)
print("\n--- ERROR ---\n" .. err .. "\n\n" .. joinString(debugString,"\n"))
os.exit(1)
end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.