aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/im.lua2
-rw-r--r--src/objs/player.lua41
-rw-r--r--src/objs/room_editor.lua65
-rw-r--r--src/objs/tilemap.lua15
-rw-r--r--src/sprite.lua32
5 files changed, 112 insertions, 43 deletions
diff --git a/src/im.lua b/src/im.lua
index 2737ed5..cb583ff 100644
--- a/src/im.lua
+++ b/src/im.lua
@@ -9,7 +9,7 @@ im = {
text = {0.8, 0.8, 0.8},
},
padding = 1,
- scroll_speed = 5,
+ scroll_speed = 15,
slider_handle_width = 5,
resize_handle_size = 5,
}
diff --git a/src/objs/player.lua b/src/objs/player.lua
index 82c5ed5..ec04204 100644
--- a/src/objs/player.lua
+++ b/src/objs/player.lua
@@ -14,47 +14,11 @@ function body_sys(ent, dt)
ent.y = ent.box.y
end
-local tile = 1
-
function player_movement_sys(player, dt)
local inpx, inpy = input_direction("Left", "Right", "Up", "Down")
inpx, inpy = normalize(inpx, inpy)
player.vx = dlerp(player.vx, inpx * PLAYER_SPEED, 25 * dt)
player.vy = dlerp(player.vy, inpy * PLAYER_SPEED, 25 * dt)
-
- -- Testicle stuff, remove when testising is no longer needed
- if not im.has_focus() then
- if is_input_pressed("Right_Click") then
- local scn = get_current_scene()
- assert(scn, "no scene set.")
-
- local mx, my = get_mouse_pos()
- local tx, ty = to_tile_coords(mx, my)
- set_tile(scn.tilemap, tx, ty, tile)
- end
- if is_input_pressed("Left_Click") then
- local scn = get_current_scene()
- assert(scn, "no scene set.")
-
- local mx, my = get_mouse_pos()
- local tx, ty = to_tile_coords(mx, my)
- remove_tile(scn.tilemap, tx, ty)
- end
- end
-end
-
-function player_ui_sys(_)
- im.begin_window("Room Editor", 120, 5, 180, 320, {})
- im.layout({0.5, 0.75, 1})
- im.text("Tile: " .. tostring(tile))
- if im.button(" - ") then
- tile = math.max(tile - 1, 0)
- end
- if im.button("+ ") then
- tile = tile + 1
- end
- im.layout()
- im.end_window()
end
function new_player(x, y)
@@ -66,7 +30,10 @@ function new_player(x, y)
mask = {"hard"},
})
add_comp(ent, "Player")
- add_comp(ent, "Sprite", "res/img/player.ase")
+ add_comp(ent, "Sprite", "res/img/player.ase", {
+ offsetx = 0.5,
+ offsety = 0.5,
+ })
return ent
end
diff --git a/src/objs/room_editor.lua b/src/objs/room_editor.lua
new file mode 100644
index 0000000..70f0a86
--- /dev/null
+++ b/src/objs/room_editor.lua
@@ -0,0 +1,65 @@
+register_input("Next_Tileset", {{"key", "t"}})
+register_input("Prev_Tileset", {{"key", "r"}})
+
+register_comp("Room_Editor", function(ent)
+ ent.room_editor = {
+ tile = 1,
+ }
+end)
+
+function tile_place_sys(ent)
+ local room_editor = ent.room_editor
+
+ if not im.has_focus() then
+ if is_input_pressed("Right_Click") then
+ local scn = get_current_scene()
+ assert(scn, "no scene set.")
+
+ local mx, my = get_mouse_pos()
+ local tx, ty = to_tile_coords(mx, my)
+ set_tile(scn.tilemap, tx, ty, room_editor.tile)
+ end
+ if is_input_pressed("Left_Click") then
+ local scn = get_current_scene()
+ assert(scn, "no scene set.")
+
+ local mx, my = get_mouse_pos()
+ local tx, ty = to_tile_coords(mx, my)
+ remove_tile(scn.tilemap, tx, ty)
+ end
+ end
+
+ if is_input_just_pressed("Next_Tileset") then
+ room_editor.tile = math.min(room_editor.tile + 1, get_tileset_count())
+ end
+ if is_input_just_pressed("Prev_Tileset") then
+ room_editor.tile = math.max(room_editor.tile - 1, 1)
+ end
+end
+
+function room_editor_ui_sys(ent)
+ local room_editor = ent.room_editor
+ im.begin_window("Room Editor", 120, 5, 180, 320, {})
+ im.text("Tile: " .. tostring(room_editor.tile))
+ im.separator()
+ im.layout({0.1, 0.6, 1})
+
+ for tileset_id=1, get_tileset_count() do
+ local text = " "
+ if tileset_id == room_editor.tile then
+ text = "*"
+ elseif tileset_id == room_editor.tile - 1 then
+ text = "r"
+ elseif tileset_id == room_editor.tile + 1 then
+ text = "t"
+ end
+ im.text(text)
+ if im.button("select") then
+ room_editor.tile = tileset_id
+ end
+ im.image(TILE_TEX, get_tileset_quad(tileset_id))
+ end
+
+ im.layout()
+ im.end_window()
+end
diff --git a/src/objs/tilemap.lua b/src/objs/tilemap.lua
index 7904a19..834a770 100644
--- a/src/objs/tilemap.lua
+++ b/src/objs/tilemap.lua
@@ -107,7 +107,7 @@ function rebuild_tilemap(map)
end
end
-local TILE_TEX = get_tex("res/img/tilesets.png")
+TILE_TEX = get_tex("res/img/tilesets.png")
local TILE_QUAD = lg.newQuad(
0, 0,
TILESIZE, TILESIZE,
@@ -157,3 +157,16 @@ function remove_tile(map, x, y)
map.tiledata[ID(map, x, y)] = 0
map.needs_rebuild = true
end
+
+function get_tileset_quad(tileset)
+ local start_y = (tileset - 1) * 4 * TILESIZE
+ return lg.newQuad(
+ 0, start_y,
+ 4 * TILESIZE, 4 * TILESIZE,
+ TILE_TEX:getDimensions()
+ )
+end
+
+function get_tileset_count()
+ return TILE_TEX:getHeight() / (4 * TILESIZE)
+end
diff --git a/src/sprite.lua b/src/sprite.lua
index b7a7541..79a38bf 100644
--- a/src/sprite.lua
+++ b/src/sprite.lua
@@ -1,9 +1,11 @@
Sprite = {}
Sprite.__index = Sprite
-function Sprite.new(tex_name)
+function Sprite.new(tex_name, opts)
local self = setmetatable({}, Sprite)
+ opts = opts or {}
+
self.tex = get_tex(tex_name)
self.anim = get_anim(tex_name)
@@ -16,11 +18,25 @@ function Sprite.new(tex_name)
self.width = width / self.anim.frame_count
self.height = height
+ local offsetx = opts.offsetx or 0
+ local offsety = opts.offsety or 0
+
+ if offsetx < 1 and offsetx > -1 then
+ self.offsetx = self.width * offsetx
+ else
+ self.offsetx = offsetx
+ end
+ if offsety < 1 and offsety > -1 then
+ self.offsety = self.height * offsety
+ else
+ self.offsety = offsety
+ end
+
return self
end
-register_comp("Sprite", function(ent, tex_name)
- ent.sprite = Sprite.new(tex_name)
+register_comp("Sprite", function(ent, tex_name, opts)
+ ent.sprite = Sprite.new(tex_name, opts)
end)
function sprite_anim_sys(ent, dt)
@@ -49,5 +65,13 @@ function sprite_draw_sys(ent)
sprite.width, sprite.height,
sprite.tex:getDimensions()
)
- lg.draw(sprite.tex, q, ent.x or 0, ent.y or 0)
+ lg.setColor(1, 1, 1)
+ lg.draw(
+ sprite.tex, q,
+ ent.x or 0, ent.y or 0,
+ ent.rotation or 0,
+ ent.scalex or ent.scale or 1, ent.scaley or ent.scale or 1,
+ sprite.offsetx, sprite.offsety,
+ ent.shearx or 0, ent.sheary or 0
+ )
end