nexus-am/apps/typing/game.c

120 lines
2.0 KiB
C

#include "game.h"
static int real_fps;
void set_fps(int value) {
real_fps = value;
}
int get_fps() {
return real_fps;
}
int main (){
_ioe_init();
init_screen();
int num_draw = 0, frames = 0;
unsigned long next_frame = 0, next_refresh = 0;
while(1) {
unsigned long time;
bool redraw = false;
while (1) {
time = uptime();
if (time >= next_frame) break;
}
frames ++;
if (time > next_refresh) {
redraw = true;
next_refresh += 1000 / FPS;
}
next_frame += 1000 / HZ;
while (keyboard_event());
while (update_keypress());
if (frames % (HZ / CHARACTER_PER_SECOND) == 0) {
create_new_letter();
}
if (frames % (HZ / UPDATE_PER_SECOND) == 0) {
update_letter_pos();
}
if(redraw) {
num_draw ++;
set_fps(num_draw * 1000 / time);
redraw_screen();
}
}
}
LINKLIST_IMPL(fly, 1000)
static fly_t head = NULL;
static int hit = 0, miss = 0;
int get_hit(){
return hit;
}
int get_miss(){
return miss;
}
fly_t characters(){
return head;
}
void create_new_letter(){
if(head == NULL){
head = fly_new();
}
else{
fly_t now = fly_new();
fly_insert(NULL,head,now);
head = now;
}
head->y = 0;
head->x = rand() % (W / 8 - 2) * 8 + 8;
head->v = (rand() % 1000)/(2000) + 1;
head->text = rand() % 26;
release_key(head->text);
}
void update_letter_pos() {
fly_t it;
for(it = head;it != NULL;){
fly_t next = it->_next;
it->y += it->v;
if (it->y < 0 || it->y + 8 > H){
if(it->y < 0)
hit++;
else
miss++;
fly_remove(it);
fly_free(it);
if(it == head)
head = next;
}
it = next;
}
}
bool update_keypress() {
fly_t it,target = NULL;
int min = -100;
for(it = head; it != NULL; it = it->_next){
if(it->v > 0 && it->y > min && query_key(it->text)){
min = it->y;
target = it;
}
}
if(target != NULL){
release_key(target->text);
target->v = -3;
return true;
}
return false;
}