summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2023-11-13 15:57:15 +0000
committerubq323 <ubq323@ubq323.website>2023-11-13 15:57:15 +0000
commitd7f3df7e9e69d91061b65f56a57ffb3a40c6cd5d (patch)
tree227720c188ac9a24b4f67aeb41c4e6d69ecddb0d
parentd413e6b54d0c505a529ca6a9a90ddf73c07a8c42 (diff)
fix flickering by not redrawing everything all the timeHEADtrunk
-rw-r--r--main.ha67
1 files changed, 48 insertions, 19 deletions
diff --git a/main.ha b/main.ha
index 967e92c..b5410c8 100644
--- a/main.ha
+++ b/main.ha
@@ -30,14 +30,17 @@ fn set_tile_at(r: room, x: size, y: size, t: tile) void = {
r.tiles[ix] = t;
};
+fn tile_repr(t: tile) str = match(t) {
+ case floor => yield "\x1b[33m.";
+ case wall => yield "\x1b[32m\u2588";
+};
+
+
fn draw_room(t: *vt::term, r: room) void = {
for (let y = 0z; y < r.h; y+=1) {
vt::move(t, (y+1):uint, 0)!;
for (let x = 0z; x < r.w; x+=1) {
- fmt::fprint(t, match (tile_at(r,x,y)) {
- case floor => yield '.';
- case wall => yield '\u2588';
- })!;
+ fmt::fprint(t, tile_repr(tile_at(r,x,y)))!;
};
};
};
@@ -51,15 +54,8 @@ fn get_key() u8 = {
def W = 50;
def H = 40;
-
-export fn main() void = {
- const term = vt::open();
- defer vt::close(term);
-
- vt::enablealt(term)!;
- vt::disablecur(term)!;
-
- const tiles: [W*H]tile = [floor...];
+fn get_room() room = {
+ static const tiles: [W*H]tile = [floor...];
const room = room { w=W, h=H, tiles=tiles };
for (let i = 0z; i < W; i+=1) {
@@ -78,9 +74,34 @@ export fn main() void = {
set_tile_at(room, x,y, wall);
};
+ return room;
+};
+
+fn can_move(r: room, x: size, y: size) bool =
+ tile_at(r,x,y) is floor;
+
+
+fn clear_ent(t: *vt::term, r: room, x:size, y:size) void = {
+ vt::move(t,y:uint+1,x:uint+1)!;
+ vt::print(t,tile_repr(tile_at(r,x,y)))!;
+};
+fn draw_ent(t: *vt::term, r: room, x:size, y:size, s:str) void = {
+ vt::move(t,y:uint+1,x:uint+1)!;
+ vt::print(t,s)!;
+};
+
+
+export fn main() void = {
+ const term = vt::open();
+ defer vt::close(term);
+
+ vt::enablealt(term)!;
+ vt::disablecur(term)!;
+
let player = player { x=1, y=1 };
- const playerpen = vt::newpen(vt::color::BLACK, vt::color::RED);
- const playerstr = vt::tag(playerpen, "@");
+ const playerstr = "\x1b[31m@";
+
+ const room = get_room();
let entities: []entity = [];
for (let i = 0u; i < 1; i += 1) {
@@ -88,16 +109,17 @@ export fn main() void = {
entities[i].x=i*2;
};
+ vt::clear(term)!;
+ draw_room(term, room);
+
+
for (true) {
- vt::clear(term)!;
- draw_room(term, room);
for (let i = 0z; i < len(entities); i +=1)
entity_draw(&entities[i], term);
vt::move(term, player.y:uint+1, player.x:uint+1)!;
vt::print(term, playerstr)!;
-
match (get_input(term)) {
case let m: move => {
let nx = player.x;
@@ -109,7 +131,9 @@ export fn main() void = {
case move::RIGHT => nx += 1;
};
- if (tile_at(room, nx: size, ny: size) is floor) {
+ if (can_move(room,nx,ny)) {
+ clear_ent(term,room,player.x,player.y);
+ draw_ent(term,room,nx,ny,playerstr);
player.x = nx;
player.y = ny;
};
@@ -118,6 +142,11 @@ export fn main() void = {
case => yield;
};
+ for (let i = 0z; i < len(entities); i += 1) {
+ const ent = entities[i];
+ clear_ent(term,room,ent.x,ent.y);
+ };
+
for (let i = 0z; i < len(entities); i += 1)
entity_tick(&entities[i],&room);