gay and drepresed
fdggf
This commit is contained in:
parent
21c89ae7f9
commit
1d5c402f19
|
@ -19,7 +19,7 @@ enum CtrlType {
|
|||
ESCAPE
|
||||
};
|
||||
|
||||
struct CtrlRecord {
|
||||
struct Record {
|
||||
u16 id;
|
||||
u8 type;
|
||||
|
||||
|
@ -40,19 +40,11 @@ struct CtrlRecord {
|
|||
};
|
||||
|
||||
struct RecordBuffer {
|
||||
struct CtrlRecord records[IO_BUF_SIZE];
|
||||
struct Record records[IO_BUF_SIZE];
|
||||
size_t count;
|
||||
pthread_mutex_t mutex;
|
||||
};
|
||||
|
||||
struct RecordBuffer NewInputBuffer()
|
||||
{
|
||||
struct RecordBuffer buf;
|
||||
buf.count = 0;
|
||||
buf.mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
return buf;
|
||||
}
|
||||
|
||||
struct Axis {
|
||||
union {
|
||||
struct {
|
||||
|
@ -263,7 +255,7 @@ struct Axis *CtrlGet(struct Ctrl *ctrl, u16f code, u8f type)
|
|||
return code_bkt->axis;
|
||||
}
|
||||
|
||||
void update_key(struct Axis *axis, struct CtrlRecord *record)
|
||||
void update_key(struct Axis *axis, struct Record *record)
|
||||
{
|
||||
if (record->data.key.is_down)
|
||||
axis->last_pressed = record->timestamp;
|
||||
|
@ -273,13 +265,13 @@ void update_key(struct Axis *axis, struct CtrlRecord *record)
|
|||
axis->data.key.is_down = record->data.key.is_down;
|
||||
}
|
||||
|
||||
void update_axis(struct Axis *axis, struct CtrlRecord *record)
|
||||
void update_axis(struct Axis *axis, struct Record *record)
|
||||
{
|
||||
axis->data.axis.value = record->data.axis.value;
|
||||
axis->last_pressed = record->timestamp;
|
||||
}
|
||||
|
||||
void update_joystick(struct Axis *axis, struct CtrlRecord *record)
|
||||
void update_joystick(struct Axis *axis, struct Record *record)
|
||||
{
|
||||
axis->data.joystick.x = record->data.joystick.x;
|
||||
axis->data.joystick.y = record->data.joystick.y;
|
||||
|
@ -289,7 +281,7 @@ void update_joystick(struct Axis *axis, struct CtrlRecord *record)
|
|||
bool CtrlPoll(struct Ctrl *ctrl, struct RecordBuffer *rec_buf)
|
||||
{
|
||||
for (size_t i = 0; i < rec_buf->count; i++) {
|
||||
struct CtrlRecord *rec = &rec_buf->records[i];
|
||||
struct Record *rec = &rec_buf->records[i];
|
||||
|
||||
struct Axis *axis = find_axis(&ctrl->binds, rec->id, rec->type);
|
||||
if (axis == nullptr)
|
||||
|
|
|
@ -19,7 +19,7 @@ enum CtrlType {
|
|||
ESCAPE
|
||||
};
|
||||
|
||||
struct CtrlRecord {
|
||||
struct Record {
|
||||
u16 id;
|
||||
u8 type;
|
||||
|
||||
|
@ -40,13 +40,11 @@ struct CtrlRecord {
|
|||
};
|
||||
|
||||
struct RecordBuffer {
|
||||
struct CtrlRecord records[IO_BUF_SIZE];
|
||||
struct Record records[IO_BUF_SIZE];
|
||||
size_t count;
|
||||
pthread_mutex_t mutex;
|
||||
};
|
||||
|
||||
struct RecordBuffer NewInputBuffer();
|
||||
|
||||
struct Axis {
|
||||
union {
|
||||
struct {
|
||||
|
@ -105,7 +103,7 @@ struct Ctrl {
|
|||
pthread_mutex_t mutex;
|
||||
};
|
||||
|
||||
struct Ctrl NewCtrl(struct ctrl_dict *codes, struct ctrl_dict *binds, struct Axis *axes);
|
||||
struct Ctrl NewCtrl();
|
||||
|
||||
bool CtrlMap(struct Ctrl *ctrl, u16f code, u16f bind, u8f type);
|
||||
|
||||
|
|
|
@ -32,12 +32,12 @@ void *block_input(void *args_ptr)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void StartInput(Ctrl *ctrl, struct RecordBuffer *buf)
|
||||
void StartInput(struct Ctrl *ctrl, struct RecordBuffer *buf)
|
||||
{
|
||||
pthread_create(&ctrl->thread, nullptr, block_input, buf);
|
||||
}
|
||||
|
||||
void JoinInput(Ctrl *ctrl)
|
||||
void JoinInput(struct Ctrl *ctrl)
|
||||
{
|
||||
pthread_join(ctrl->thread, nullptr);
|
||||
}
|
|
@ -68,7 +68,7 @@ bool WinGetRefreshRate(u32f *out)
|
|||
return true;
|
||||
}
|
||||
|
||||
void set_key_record(struct CtrlRecord *record, KEY_EVENT_RECORD win_key)
|
||||
void set_key_record(struct Record *record, KEY_EVENT_RECORD win_key)
|
||||
{
|
||||
record->type = KEY;
|
||||
record->id = win_key.wVirtualKeyCode;
|
||||
|
@ -78,7 +78,7 @@ void set_key_record(struct CtrlRecord *record, KEY_EVENT_RECORD win_key)
|
|||
record->type = ESCAPE;
|
||||
}
|
||||
|
||||
bool set_mouse_record(struct CtrlRecord *record, MOUSE_EVENT_RECORD win_mouse)
|
||||
bool set_mouse_record(struct Record *record, MOUSE_EVENT_RECORD win_mouse)
|
||||
{
|
||||
switch (win_mouse.dwEventFlags) {
|
||||
case MOUSE_WHEELED:
|
||||
|
@ -103,7 +103,7 @@ bool set_mouse_record(struct CtrlRecord *record, MOUSE_EVENT_RECORD win_mouse)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool dispatch_record(struct CtrlRecord *record, INPUT_RECORD win_record)
|
||||
bool dispatch_record(struct Record *record, INPUT_RECORD win_record)
|
||||
{
|
||||
switch (win_record.EventType) {
|
||||
case KEY_EVENT:
|
||||
|
@ -140,7 +140,7 @@ bool WinBlockInput(struct RecordBuffer *buf)
|
|||
pthread_mutex_lock(&buf->mutex);
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
struct CtrlRecord record;
|
||||
struct Record record;
|
||||
record.timestamp = now;
|
||||
|
||||
bool include = dispatch_record(&record, win_buf[i]);
|
||||
|
|
|
@ -90,49 +90,19 @@ const struct CtrlBind ctrl_binds[12] = {
|
|||
{ MOUSE, 0, JOYSTICK }
|
||||
};
|
||||
|
||||
void Draw(struct Terminal *term)
|
||||
void Draw(struct Instance *game)
|
||||
{
|
||||
pthread_mutex_lock(&term->mutex);
|
||||
|
||||
struct TChar4 term_blks[term->area];
|
||||
|
||||
pthread_cond_signal(&term->is_initialized);
|
||||
pthread_mutex_unlock(&term->mutex);
|
||||
|
||||
size_t buf_size = TermBufSize(term);
|
||||
char buf[buf_size];
|
||||
|
||||
while (true) {
|
||||
pthread_mutex_lock(&term->mutex);
|
||||
pthread_cond_wait(&term->draw_ready, &term->mutex);
|
||||
|
||||
TermOut(term, buf, buf_size);
|
||||
|
||||
pthread_mutex_unlock(&term->mutex);
|
||||
|
||||
puts(buf);
|
||||
Call(&game->on_draw, game);
|
||||
}
|
||||
}
|
||||
|
||||
void Update(struct Terminal *term, struct Ctrl *ctrl, struct RecordBuffer *rec_buf)
|
||||
void Update(struct Instance *game)
|
||||
{
|
||||
pthread_mutex_lock(&term->mutex);
|
||||
pthread_cond_wait(&term->is_initialized, &term->mutex);
|
||||
pthread_mutex_unlock(&term->mutex);
|
||||
|
||||
|
||||
while (true) {
|
||||
// Input
|
||||
pthread_mutex_lock(&rec_buf->mutex);
|
||||
CtrlPoll(ctrl, rec_buf);
|
||||
pthread_mutex_unlock(&rec_buf->mutex);
|
||||
|
||||
// Game logic
|
||||
|
||||
|
||||
// Draw
|
||||
pthread_mutex_lock(&term->mutex);
|
||||
pthread_cond_signal(&term->draw_ready);
|
||||
pthread_mutex_unlock(&term->mutex);
|
||||
Call(&game->on_update, game);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,7 +148,7 @@ int main()
|
|||
};
|
||||
|
||||
struct Instance game = {
|
||||
.term = NewTerm(nullptr, 20, 20),
|
||||
.term = NewTerm(20, 20),
|
||||
.ctrl = NewCtrl(),
|
||||
|
||||
.on_start = NewDelegate(16),
|
||||
|
|
|
@ -27,17 +27,14 @@ struct Terminal {
|
|||
pthread_cond_t draw_ready;
|
||||
};
|
||||
|
||||
struct Terminal NewTerm(struct TChar4 *blks, size_t wid, size_t hgt)
|
||||
struct Terminal NewTerm(size_t wid, size_t hgt)
|
||||
{
|
||||
size_t area = wid * hgt;
|
||||
memset(blks, 0, sizeof(struct TChar4) * area);
|
||||
|
||||
return (struct Terminal) {
|
||||
.wid = wid,
|
||||
.hgt = hgt,
|
||||
.area = area,
|
||||
.area = wid * hgt,
|
||||
.refresh_rate = 60,
|
||||
.blks = blks,
|
||||
.blks = nullptr,
|
||||
|
||||
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
||||
.is_initialized = PTHREAD_COND_INITIALIZER,
|
||||
|
|
|
@ -28,7 +28,7 @@ struct Terminal {
|
|||
pthread_cond_t draw_ready;
|
||||
};
|
||||
|
||||
struct Terminal NewTerm(struct TChar4 *blks, size_t wid, size_t hgt);
|
||||
struct Terminal NewTerm(size_t wid, size_t hgt);
|
||||
|
||||
size_t TermBufSize(struct Terminal *term);
|
||||
|
||||
|
|
Loading…
Reference in a new issue