void main_menu() { /* Play a simulated game in the background */ unsigned char _; initialize(); while (1) { unsigned char key; screen_clear(screen); draw_actors(); draw_string(screen, 28, 0, "-- Pong --"); draw_string(screen, 8, 10, "Press ENTER to begin"); screen_draw(screen); update_ai(&left_paddle); update_ai(&right_paddle); update_ball(); key = app_get_key(&_); switch (key) { case KEY_ENTER: return; case KEY_MODE: exit(0); break; } ksleep(5); } }
void update() { do_input(); ai_frame = !ai_frame; if (ai_frame) { update_ball(); update_ai(&right_paddle); } ksleep(5); }
void draw_level(t_level *level) { t_list_node *cursor; t_brick *cur_brick; cursor = level->brick_list; while (cursor) { cur_brick = (t_brick *)cursor->value; if (cur_brick->val > 0) draw_brick(cur_brick); cursor = cursor->next; } update_ball(level->ball, level->brick_list); draw_ball(level->ball); update_pad(level->pad, level->ball); draw_pad(level->pad); draw_level_border(); draw_lives(level->lives); draw_score(level->score); }
void OnTimer(int value) { glutTimerFunc(20, &OnTimer, value); old_t = t; t = (GLfloat)glutGet(GLUT_ELAPSED_TIME)/1000.0; delta_t = (t - old_t); //printf("%f\n", delta_t); GLfloat tmpppp[3] = {cow.pos.x, cow.pos.y, cow.pos.z}; glUniform3fv(glGetUniformLocation(g_shader, "cow_pos"), 1, tmpppp); turn_cow(&cow, -m_angle); update_cow(&cow, delta_t); update_fence(&ff, &cow, delta_t); move_cow(&cow, m_angle); update_floor(&f, &cow); update_wall(&wall, &cow, delta_t); update_ball(&ball, &cow, delta_t); update_farmer(&farmer); if(keyIsDown('k')) update_ragdoll(&ragdoll, delta_t); if(check_collision_2(&cow.bb, &wall.bb)) { //printf("yey\n"); glUniform1i(glGetUniformLocation(g_shader, "collision"), 1); //cow.momentum = SetVector(-cow.momentum.x, cow.momentum.y, -cow.momentum.z); //wall_collision(wall, cow); } else glUniform1i(glGetUniformLocation(g_shader, "collision"), 0); //printf("%f, %f\n", delta_t, old_t); glUniform1f(glGetUniformLocation(g_shader, "time"), t); mat4 proj_matrix = frustum(-1, 1, -1, 1, 1, 750.0); mat4 cam_matrix = lookAt(cam_dist*cos(m_angle)+cow.pos.x, 9+cow.pos.y, cam_dist*sin(m_angle)+cow.pos.z, cow.pos.x, 8.5+cow.pos.y, cow.pos.z, 0.0, 1.0, 0.0); //mat4 cam_matrix = lookAt(200+200*cos(cam_angle), 0, 200, 0, 8, 0, 0.0, 1.0, 0.0); //g_shader = loadShaders("shader.vert" , "shader.frag"); //glUseProgram(g_shader); glUniformMatrix4fv(glGetUniformLocation(g_shader, "proj_matrix"), 1, GL_TRUE, proj_matrix.m); glUniformMatrix4fv(glGetUniformLocation(g_shader, "cam_matrix"), 1, GL_TRUE, cam_matrix.m); //glutDisplayFunc(DisplayWindow); //draw_cow(&cow, g_shader); //draw_bone(&bone, g_shader); mat4 tmp, testjoint, testjoint2; testjoint = IdentityMatrix(); joint_s * j = &head_joint[0]; joint_s * jc = j->child[0]; joint_s * jcc = jc->child[0]; //joint_s * jp = j->parent; //joint_s * jpp = jp->parent; float Ms[8][4*4]; float legMs[8][4*4]; float currpos[8*3] = {0}; float bonepos[8*3] = {0}; float legcurrpos[8*3] = {0}; float legbonepos[8*3] = {0}; //GLfloat * Mtmp = Ms; int i=0, ii=0; //jc->R = ArbRotate(SetVector(0,0,1), cos(4*t/(i+1))/2.5); //j->R = ArbRotate(SetVector(0,0,1), 0); j->R = ArbRotate(SetVector(0,0,1), sin(4*t/(3+1))/1.2); //jcc->R = ArbRotate(SetVector(0,0,1), cos(8*t/(2+1))/4); mat4 Mpacc, Minvacc, tmptrans, tmppp, invtrans; tmppp = IdentityMatrix(); float freq = 7;//Norm(cow.speed)/4; if(Norm(cow.momentum) < .5) freq = 0; else if(Norm(cow.momentum) > 5) freq = 20; //printf("%f\n", freq); j = &thigh_joint[0]; jc = j->child[0]; j->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/1.5); jc->R = ArbRotate(SetVector(0,0,1), cos(freq*t)/2.5); j = &thigh_joint[1]; jc = j->child[0]; j->R = ArbRotate(SetVector(0,0,1), -cos(freq*t)/2.5); jc->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/2.5); j = &thigh_joint[2]; jc = j->child[0]; j->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/1.5); jc->R = ArbRotate(SetVector(0,0,1), cos(freq*t)/2.5); j = &thigh_joint[3]; jc = j->child[0]; j->R = ArbRotate(SetVector(0,0,1), -cos(freq*t)/2.5); jc->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/2.5); j = &legbase_joint[0]; //j->R = ArbRotate(SetVector(1,0,0), -cos(7*t/(i+1))); //j->R = ArbRotate(SetVector(1,0,0), -M_PI/6); j = &thigh_joint[0]; //j->R = Mult(ArbRotate(SetVector(1,0,0), cos(7*t/(i+1))), j->R); //j->R = Mult(ArbRotate(SetVector(1,0,0), M_PI/6), j->R); i = 0; tmppp = IdentityMatrix(); //legbase_joint[0].R = ArbRotate(SetVector(0,0,1), cos(3*t)/2); //legs calc_bone_transform(&legbase_joint[0], 0); calc_bone_transform(&legbase_joint[1], 0); calc_bone_transform(&legbase_joint[2], 0); calc_bone_transform(&legbase_joint[3], 0); j = &tail_joint[0]; j->R = ArbRotate(SetVector(0,0,1), -M_PI/2.5); j = &tail_joint[1]; j->R = ArbRotate(SetVector(0,0,1), -M_PI/8.5); //j = &tail_joint[1]; //j->R = ArbRotate(SetVector(0,0,1), 0); j = &tail_joint[2]; //j->R = ArbRotate(SetVector(0,0,1), 0); j = &tail_joint[3]; j->R = ArbRotate(SetVector(0,0,1), 0); //body j = &body_joint[1]; //j->R = ArbRotate(SetVector(0,0,1), cos(t*7)/9.5); j->R = ArbRotate(SetVector(0,1,0), m_angle + cow.angle); j->R = Mult(j->R, ArbRotate(SetVector(0,0,1), cos(freq*t)/9)); calc_bone_transform(&body_joint[0],0); //tail //j = &tail_joint[1]; //j->R = ArbRotate(SetVector(0,0,1), -M_PI/2.5); //j = &tail_joint[1]; //j->R = ArbRotate(SetVector(0,0,1), 0); //j = &tail_joint[2]; //j->R = ArbRotate(SetVector(0,0,1), 0); //j = &tail_joint[3]; //j->R = ArbRotate(SetVector(0,0,1), 0); //calc_bone_transform(&tail_joint[0],0); //head j = &head_joint[0]; j->R = ArbRotate(SetVector(0,0,1), sin(7*t)/9.5); calc_bone_transform(&head_joint[0],0); j = &farmer.skeleton.joints[2]; //j->R = Rx(cos(4*t)); j->R = Mult(Rx(M_PI/2.2 + sin(5*t)/11), Ry(cos(-5*t)/2)); j = &farmer.skeleton.joints[3]; //j->R = Rx(cos(4*t)); j->R = Mult(Rx(-M_PI/2.2 + sin(5*t)/11), Ry(cos(5*t)/2)); //left shoulder (her right) //jc = &farmer.skeleton.joints[3]; //jc->R = Rx(-sin(3*t)); jc = &farmer.skeleton.joints[4]; jc->R = Ry(M_PI/3 + cos(5*t)/8); jc = &farmer.skeleton.joints[5]; jc->R = Ry(-M_PI/3 + cos(5*t)/8); jc = &farmer.skeleton.joints[10]; //jc->R = Rz(M_PI/3); jc->R = Rz(.5-cos(5*t)); jc = &farmer.skeleton.joints[12]; jc->R = Rz((-1-cos(5*t))/2); jc = &farmer.skeleton.joints[11]; //jc->R = Rz(M_PI/3); jc->R = Rz(.5+cos(5*t)); jc = &farmer.skeleton.joints[13]; jc->R = Rz((-1-cos(5*t))/2); calc_bone_transform(&farmer.skeleton.joints[0], 0); calc_bone_transform(&farmer.skeleton.joints[2], 0); calc_bone_transform(&farmer.skeleton.joints[3], 0); //calc_bone_transform(&farmer.skeleton.joints[4], 0); calc_bone_transform(&farmer.skeleton.joints[1], 0); calc_bone_transform(&farmer.skeleton.joints[10], 0); calc_bone_transform(&farmer.skeleton.joints[11], 0); // calc_bone_transform(&farmer.skeleton.joints[8], 0); // calc_bone_transform(&farmer.skeleton.joints[9], 0); glutPostRedisplay(); }
/* The main game loop */ static void do_game(game_t *p_game) { uint8_t exit=FALSE; while(!exit) { uint16_t input = get_input(p_game); uint16_t fire; int i; exit = input & FE_EVENT_EXIT; fire = input & FE_EVENT_SELECT; /* Move the paddle (according to input) */ update_paddle(&p_game->paddle, input & FE_EVENT_LEFT ? 4:0, input & FE_EVENT_RIGHT ? 4:0); /* Handle the ball(s) */ p_game->free_ball = -1; for (i=0; i<MAX_BALLS; i++) { /* Unused balls are skipped */ if (!(p_game->p_balls[i].state & BALL_STATE_ACTIVE)) { draw_ball(&p_game->p_balls[i]); p_game->free_ball = i; continue; } /* The player is holding the ball */ if (p_game->p_balls[i].state & BALL_STATE_HOLDING) { p_game->p_balls[i].lastx = p_game->p_balls[i].x; p_game->p_balls[i].x += p_game->paddle.x-p_game->paddle.lastx; if (fire) { /* The player relases the ball. The following will * clear the HOLDING-bit. It will also shoot the * ball away upwards. */ p_game->p_balls[i].dx = 1; p_game->p_balls[i].state &= (0xff ^ BALL_STATE_HOLDING); bounce_ball_paddle(p_game, &p_game->p_balls[i]); } } else if (paddle_ball_collide(&p_game->paddle, &p_game->p_balls[i])) { /* Hold the ball if the pad is sticky */ if (p_game->paddle.type & SPECIAL_STICKY) { p_game->p_balls[i].dy = 0; p_game->p_balls[i].dx = 0; p_game->p_balls[i].state |= BALL_STATE_HOLDING; p_game->paddle.type--; /* Sticky for maximum 3 rounds */ } else bounce_ball_paddle(p_game, &p_game->p_balls[i]); } /* Check collisions against blocks */ block_ball_collide(p_game, &p_game->p_balls[i]); draw_ball(&p_game->p_balls[i]); /* Update the ball (and check if it moves out of the playfield) */ if (update_ball(p_game, &p_game->p_balls[i])) { /* Ball is out of bounds - Remove it */ init_ball(&p_game->p_balls[i], 0, 0, 0); p_game->nr_balls--; } } /* Handle the specials */ p_game->free_special = -1; for (i=0; i<MAX_SPECIALS; i++) { int res; /* Always draw the specials for timing-reasons */ draw_special(&p_game->p_specials[i]); /* Inactive special - continue */ if (!p_game->p_specials[i].type) { p_game->free_special = i; continue; } /* This moves the special and also checks if it collides with the paddle */ res = update_special(p_game, &p_game->p_specials[i]); switch(res) { case 1: /* Player took the special */ switch(p_game->p_specials[i].type) { case SPECIAL_EXTRA_BALL: if (p_game->free_ball != -1) /* Check if there is free space for the ball */ { p_game->nr_balls++; init_ball(&p_game->p_balls[p_game->free_ball], p_game->paddle.x+PADDLE_WIDTH/2, PADDLE_Y-PADDLE_HEIGHT, BALL_STATE_ACTIVE); } break; case SPECIAL_LONG_PADDLE: p_game->paddle.width = PADDLE_LONG_WIDTH; break; case SPECIAL_SHORT_PADDLE: p_game->paddle.width = PADDLE_SHORT_WIDTH; break; case SPECIAL_EXTRA_LIFE: if (p_game->lives < MAX_LIVES) { p_game->lives++; draw_lives(p_game); } break; case SPECIAL_STICKY: /* * For the sticky and destroyers, we use the bits * from the flag and downwards as counters. * * i.e: SPECIAL_STICKY is the third bit, which means * that type becomes 0b00000111. type is then * lowered when the ball hits the paddle and after * zeroing the lower bits, the SPECIAL_STICKY bit is * finally cleared. This gives a maximum of three * sticky rounds. * * These two only adds 30 bytes to the binary :-) */ p_game->paddle.type = (SPECIAL_STICKY | (SPECIAL_STICKY-1)); break; case SPECIAL_DESTROYER: p_game->p_balls[0].state |= (BALL_STATE_DESTROYER | (BALL_STATE_DESTROYER-1)); break; case SPECIAL_FLOOR: p_game->state |= (SPECIAL_FLOOR | 2); /* Three times */ fe_fill_area(0, SCREEN_HEIGHT-FLOOR_HEIGHT, SCREEN_WIDTH, FLOOR_HEIGHT); break; } /* Fall through */ case -1: /* Remove the special */ p_game->nr_specials--; fe_clear_area(p_game->p_specials[i].x, p_game->p_specials[i].y-1, SPECIAL_WIDTH, SPECIAL_HEIGHT+1); p_game->p_specials[i].type = SPECIAL_NONE; break; } } /* No balls left in play */ if (!p_game->nr_balls) { if (--p_game->lives == 0) exit = TRUE; /* No lives left! */ else { /* Restart the game */ p_game->nr_balls = 1; draw_screen(p_game); init_paddle(&p_game->paddle, SPECIAL_NONE, SCREEN_WIDTH/2-PADDLE_WIDTH/2); init_ball(&p_game->p_balls[0], p_game->paddle.x+p_game->paddle.width/2, PADDLE_Y-PADDLE_HEIGHT, BALL_STATE_HOLDING | BALL_STATE_ACTIVE); } } /* No blocks left to remove */ if (!p_game->nr_blocks) { fe_sleep(LEVEL_SLEEP_PERIOD); if (handle_level_finished(p_game) < 0) exit = TRUE; /* Last level */ } draw_paddle(&p_game->paddle); /* Sleep for a short while. */ #if !defined(TARGET_REX) fe_sleep(SLEEP_PERIOD); #endif /* TARGET_REX */ } }