map2src
parent
7a9626f839
commit
d2c5ddd815
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tileset version="1.5" tiledversion="1.7.2" name="Wired" tilewidth="16" tileheight="16" tilecount="64" columns="8">
|
||||
<grid orientation="orthogonal" width="8" height="8"/>
|
||||
<image source="tiles.png" width="128" height="128"/>
|
||||
</tileset>
|
|
@ -0,0 +1,32 @@
|
|||
{ "compressionlevel":-1,
|
||||
"height":20,
|
||||
"infinite":false,
|
||||
"layers":[
|
||||
{
|
||||
"data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 19, 19, 18, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 51, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 2, 1, 37, 1, 54, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 19, 19, 19, 66, 54, 1, 1, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||
"height":20,
|
||||
"id":1,
|
||||
"name":"Tile Layer 1",
|
||||
"opacity":1,
|
||||
"type":"tilelayer",
|
||||
"visible":true,
|
||||
"width":20,
|
||||
"x":0,
|
||||
"y":0
|
||||
}],
|
||||
"nextlayerid":2,
|
||||
"nextobjectid":1,
|
||||
"orientation":"orthogonal",
|
||||
"renderorder":"right-down",
|
||||
"tiledversion":"1.7.2",
|
||||
"tileheight":8,
|
||||
"tilesets":[
|
||||
{
|
||||
"firstgid":1,
|
||||
"source":"wired.tsx"
|
||||
}],
|
||||
"tilewidth":8,
|
||||
"type":"map",
|
||||
"version":"1.6",
|
||||
"width":20
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="20" height="20" tilewidth="8" tileheight="8" infinite="0" nextlayerid="2" nextobjectid="1">
|
||||
<editorsettings>
|
||||
<export target="test.json" format="json"/>
|
||||
</editorsettings>
|
||||
<tileset firstgid="1" source="wired.tsx"/>
|
||||
<layer id="1" name="Tile Layer 1" width="20" height="20">
|
||||
<data encoding="csv">
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||
1,1,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,1,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,50,19,19,18,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,50,19,52,1,1,1,1,20,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,37,1,
|
||||
1,39,1,50,19,52,1,1,1,1,1,1,1,1,20,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,50,19,52,1,1,1,1,51,1,1,1,37,1,
|
||||
1,39,1,1,1,1,1,1,1,1,1,1,1,1,20,1,1,1,37,1,
|
||||
1,39,1,50,19,52,1,1,1,1,1,1,1,1,51,1,2,1,37,1,
|
||||
54,55,1,1,1,1,1,1,1,1,1,1,1,1,33,19,19,19,66,54,
|
||||
1,1,1,1,1,1,1,50,19,52,1,1,1,1,1,1,1,1,20,1,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,51,1,
|
||||
22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tileset version="1.5" tiledversion="1.7.2" name="wired" tilewidth="8" tileheight="8" tilecount="256" columns="16">
|
||||
<image source="../tiles.png" width="128" height="128"/>
|
||||
</tileset>
|
|
@ -0,0 +1 @@
|
|||
pub const map: [400]u8 = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 19, 19, 18, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 51, 1, 1, 1, 37, 1, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 37, 1, 1, 39, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 2, 1, 37, 1, 54, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 19, 19, 19, 66, 54, 1, 1, 1, 1, 1, 1, 1, 50, 19, 52, 1, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
|
|
@ -0,0 +1,65 @@
|
|||
const std = @import("std");
|
||||
|
||||
const Layer = struct {
|
||||
data: []u64,
|
||||
height: u64,
|
||||
id: u64,
|
||||
name: []const u8,
|
||||
opacity: u64,
|
||||
@"type": enum { tilelayer },
|
||||
visible: bool,
|
||||
width: u64,
|
||||
x: i64,
|
||||
y: i64,
|
||||
};
|
||||
|
||||
const MapType = struct {
|
||||
compressionlevel: i64 = -1,
|
||||
height: u64 = 0,
|
||||
infinite: bool = false,
|
||||
layers: []Layer,
|
||||
nextlayerid: u64 = 0,
|
||||
nextobjectid: u64 = 0,
|
||||
orientation: enum { orthogonal } = .orthogonal,
|
||||
renderorder: enum { @"right-down" } = .@"right-down",
|
||||
tiledversion: []const u8 = "",
|
||||
tileheight: u64 = 0,
|
||||
tilesets: []struct { firstgid: u64, source: []const u8 },
|
||||
tilewidth: u64 = 0,
|
||||
@"type": enum { map } = .map,
|
||||
version: []const u8 = "",
|
||||
width: u64 = 0,
|
||||
};
|
||||
|
||||
const KB = 1024;
|
||||
var heap: [64 * KB]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&heap);
|
||||
var alloc = fba.allocator();
|
||||
|
||||
pub fn main() anyerror!void {
|
||||
const cwd = std.fs.cwd();
|
||||
var output = try cwd.createFile("map.zig", .{});
|
||||
defer output.close();
|
||||
|
||||
var argsIter = std.process.args();
|
||||
const progName = (try argsIter.next(alloc)) orelse "";
|
||||
defer alloc.free(progName);
|
||||
std.log.info("{s}", .{progName});
|
||||
|
||||
while (try argsIter.next(alloc)) |arg| {
|
||||
defer alloc.free(arg);
|
||||
std.log.info("{s}", .{arg});
|
||||
var filebuffer: [64 * KB]u8 = undefined;
|
||||
var filecontents = try cwd.readFile(arg, &filebuffer);
|
||||
|
||||
@setEvalBranchQuota(10000);
|
||||
var tokenstream = std.json.TokenStream.init(filecontents);
|
||||
const options = std.json.ParseOptions{ .allocator = fba.allocator() };
|
||||
const map = try std.json.parse(MapType, &tokenstream, options);
|
||||
defer std.json.parseFree(MapType, map, options);
|
||||
|
||||
var outbuffer: [64 * KB]u8 = undefined;
|
||||
var outcontent = try std.fmt.bufPrint(&outbuffer, "pub const map: [{}]u8 = {any};\n", .{ map.layers[0].data.len, map.layers[0].data });
|
||||
_ = try output.writeAll(outcontent);
|
||||
}
|
||||
}
|
25
src/main.zig
25
src/main.zig
|
@ -48,8 +48,12 @@ const Anim = struct {
|
|||
|
||||
// Components
|
||||
const Pos = Vec2f;
|
||||
const Control = struct { controller: enum { player }, state: enum { stand, walk, jump, fall } };
|
||||
const Sprite = usize;
|
||||
const Control = struct {
|
||||
controller: enum { player },
|
||||
state: enum { stand, walk, jump, fall },
|
||||
facing: enum { left, right } = .right,
|
||||
};
|
||||
const Sprite = struct { index: usize, flags: w4.BlitFlags };
|
||||
const StaticAnim = Anim;
|
||||
const ControlAnim = struct { anims: []AnimData, state: Anim };
|
||||
const Component = struct {
|
||||
|
@ -89,7 +93,7 @@ export fn start() void {
|
|||
_ = world.create(.{
|
||||
.pos = .{ 76, 76 },
|
||||
.control = .{ .controller = .player, .state = .stand },
|
||||
.sprite = 0,
|
||||
.sprite = .{ .index = 0, .flags = .{ .bpp = .b1 } },
|
||||
.controlAnim = ControlAnim{
|
||||
.anims = playerAnim,
|
||||
.state = Anim{ .anim = &.{} },
|
||||
|
@ -116,19 +120,20 @@ export fn update() void {
|
|||
|
||||
fn drawProcess(_: f32, pos: *Pos, sprite: *Sprite) void {
|
||||
w4.DRAW_COLORS.* = 0x0030;
|
||||
const tx = (sprite.* * 8) % 128;
|
||||
const ty = (sprite.* * 8) / 128;
|
||||
w4.externs.blitSub(&assets.sprites, @floatToInt(i32, pos.*[0]), @floatToInt(i32, pos.*[1]), 8, 8, tx, ty, 128, assets.sprites_flags);
|
||||
const ipos = w4.Vec2{ @floatToInt(i32, pos.*[0]), @floatToInt(i32, pos.*[1]) };
|
||||
const t = w4.Vec2{ @intCast(i32, (sprite.index * 8) % 128), @intCast(i32, (sprite.index * 8) / 128) };
|
||||
w4.blitSub(&assets.sprites, ipos, .{ 8, 8 }, t, 128, sprite.flags);
|
||||
}
|
||||
|
||||
fn staticAnimProcess(_: f32, sprite: *Sprite, anim: *StaticAnim) void {
|
||||
anim.update(sprite);
|
||||
anim.update(&sprite.index);
|
||||
}
|
||||
|
||||
fn controlAnimProcess(_: f32, sprite: *Sprite, anim: *ControlAnim, control: *Control) void {
|
||||
const a: usize = if (control.state == .stand) 0 else 1;
|
||||
sprite.flags.flip_x = (control.facing == .left);
|
||||
anim.state.play(anim.anims[a]);
|
||||
anim.state.update(sprite);
|
||||
anim.state.update(&sprite.index);
|
||||
}
|
||||
|
||||
fn controlProcess(_: f32, pos: *Pos, control: *Control) void {
|
||||
|
@ -140,6 +145,10 @@ fn controlProcess(_: f32, pos: *Pos, control: *Control) void {
|
|||
if (delta[0] != 0 or delta[1] != 0) {
|
||||
control.state = .walk;
|
||||
pos.* += delta;
|
||||
if (pos.*[0] < 0) pos.*[0] = 0;
|
||||
if (pos.*[0] > 152) pos.*[0] = 152;
|
||||
if (delta[0] > 0) control.facing = .right;
|
||||
if (delta[0] < 0) control.facing = .left;
|
||||
} else {
|
||||
control.state = .stand;
|
||||
}
|
||||
|
|
|
@ -200,13 +200,13 @@ pub const externs = struct {
|
|||
|
||||
/// Copies pixels to the framebuffer.
|
||||
pub fn blit(sprite: []const u8, pos: Vec2, size: Vec2, flags: BlitFlags) void {
|
||||
if (sprite.len * 8 != size[x] * size[y]) unreachable;
|
||||
if (sprite.len * 8 < size[x] * size[y]) unreachable;
|
||||
externs.blit(sprite.ptr, pos[x], pos[y], size[x], size[y], @bitCast(u32, flags));
|
||||
}
|
||||
|
||||
/// Copies a subregion within a larger sprite atlas to the framebuffer.
|
||||
pub fn blitSub(sprite: []const u8, pos: Vec2, size: Vec2, src: Vec2, strie: i32, flags: BlitFlags) void {
|
||||
if (sprite.len * 8 >= size[x] * size[y]) trace("Sprite not large enough {}", .{sprite.len});
|
||||
if (sprite.len * 8 < size[x] * size[y]) unreachable;
|
||||
externs.blitSub(sprite.ptr, pos[x], pos[y], size[x], size[y], @intCast(u32, src[x]), @intCast(u32, src[y]), strie, @bitCast(u32, flags));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue