예제 #1
0
int main (void)
{
    int tick;
    boing_state_t balls[3];

    system_init ();
    tinygl_init (LOOP_RATE);

    pacer_init (LOOP_RATE);
    tick = 0;

    balls[0] = boing_init (0, 1, DIR_NE);
    balls[1] = boing_init (4, 5, DIR_SE);
    balls[2] = boing_init (4, 5, DIR_SW);

    /* Paced loop.  */
    while (1)
    {
        /* Wait for next tick.  */
        pacer_wait ();

        tick++;

        /* Flash the first two balls at different rates.  */
        tinygl_draw_point (balls[0].pos, tick % 2 < 1);
        tinygl_draw_point (balls[1].pos, tick % 4 < 2);

        if (tick >= 40)
        {
            int i;

            tick = 0;

            for (i = 0; i < 3; i++)
            {
                /* Erase previous position.  */
                tinygl_draw_point (balls[i].pos, 0);
                
                /* Check for collision; if so reverse direction.  */
                balls[i] = boing_update (balls[i]);

                /* Perhaps should make ball that is hit reverse as well?  */
                if (collision_detect (balls, 2, i) > 0)
                {
                    balls[i] = boing_reverse (balls[i]);
                }

                /* Draw previous position.  */
                tinygl_draw_point (balls[i].pos, 1);
            }
        }

        tinygl_update ();
    }
}
예제 #2
0
파일: paint.c 프로젝트: kki32/BlinkItAll
/** Initialise pen for both player
    use setPenP1 and setPenP2
    Pen position for player1 is [top-left]
    Pen position for player2 is [bottom-right]
    @param player - which player are you? */
void initPen(int player){
  paintP1 = 0;
  paintP2 = 0;

  initPenP1(player);
  initPenP2(player);

  tinygl_init (LOOP_RATE);
  //light red led on both players origin
  //player1 [top-left] player2 [bottom-right]
  tinygl_draw_point (player1_pen.pos, player1_pen.state);
  tinygl_draw_point (player2_pen.pos, player2_pen.state);

  //turn blue led on to indicate game starts
  led_set (LED1, player1_pen.state);
}
예제 #3
0
static void monster_move (monster_t *monsters, uint8_t num)
{
    uint8_t x;
    uint8_t y;
    uint8_t this;

    this = monster_choose (monsters, num);

    tinygl_draw_point (monsters[this].pos, 0);

    x = monsters[this].pos.x;
    y = monsters[this].pos.y;

    while (1)
    {
        int8_t dx[] = {

        int8_t dx;
        int8_t dy;
        
        dx = (rand () % 3) - 1;
        dy = (rand () % 3) - 1;

        if ((dx || dy)
            && x + dx >= 0 && x + dx < TINYGL_WIDTH
            && y + dy >= 0 && y + dy < TINYGL_HEIGHT)
        {
            int8_t other;
            
            other = monster_find (monsters, num, x + dx, y + dy);

            if (other != -1)
                monsters[other].alive = 0;

            monsters[this].pos.x = x + dx;
            monsters[this].pos.y = y + dy;
            tinygl_draw_point (monsters[this].pos, 1);
            return;
        }
    }
}
예제 #4
0
int main (void)
{
    snake_t snake;
    int tick = 0;

    system_init ();

    snake.dir = DIR_N;
    snake.pos.x = TINYGL_WIDTH / 2;
    snake.pos.y = TINYGL_HEIGHT - 1;

    tinygl_init (LOOP_RATE);

    navswitch_init ();

    pacer_init (LOOP_RATE);

    tinygl_draw_point (snake.pos, 1);

    /* Paced loop.  */
    while (1)
    {
        /* Wait for next tick.  */
        pacer_wait ();

        navswitch_update ();

        tick = tick + 1;
        if (tick > LOOP_RATE / SNAKE_SPEED)
        {   
            tick = 0;
            snake = snake_move (snake);
        }

        if (navswitch_push_event_p (NAVSWITCH_WEST))
        {
            snake = snake_turn_left (snake);
        }

        if (navswitch_push_event_p (NAVSWITCH_EAST))
        {
            snake = snake_turn_right (snake);
        }

  
        tinygl_update ();
    }

    return 0;
}
예제 #5
0
static void monsters_create (monster_t *monsters, uint8_t num)
{
    uint8_t i;

    for (i = 0; i < num; i++)
    {
        uint8_t x;
        uint8_t y;

        do
        {
            x = rand () % TINYGL_WIDTH;
            y = rand () % TINYGL_HEIGHT;
        } while (monster_find (monsters, i, x, y) != -1);
        
        monsters[i].pos.x = x;
        monsters[i].pos.y = y;
        monsters[i].alive = 1;

        tinygl_draw_point (tinygl_point (x, y), 1);
    }
}
예제 #6
0
static snake_t snake_move (snake_t snake)
{
    switch (snake.dir)
    {
        case DIR_N:
            snake.pos.y = snake.pos.y - 1;
            break;

        case DIR_E:
            snake.pos.x = snake.pos.x + 1;
            break;

        case DIR_S:
            snake.pos.y = snake.pos.y + 1;
            break;

        case DIR_W:
            snake.pos.x = snake.pos.x - 1;
            break;
    }
    tinygl_draw_point (snake.pos, 1);
    return snake;
}
예제 #7
0
int
main (void)
{
    uint8_t game_ticks;
    uint8_t game_over_ticks;
    state_t state = STATE_INIT;
    flasher_t flashers[SPACEY_PIX_TYPE_NUM];
    uint8_t flasher_state[SPACEY_PIX_TYPE_NUM];
    flasher_obj_t flashers_info[SPACEY_PIX_TYPE_NUM];
    uint8_t display[TINYGL_WIDTH * TINYGL_HEIGHT];
    uint8_t i;
    uint8_t j;
    game_data_t data;
    char message[44];
    ir_serial_ret_t ret;
    uint8_t ir_data;

    system_init ();

    /* The first time EEPROM is read all the bytes are 0xFF so set to
       sensible defaults.  */
    eeprom_read (0, &data, sizeof (data));
    if (data.level == 0xff)
    {
        data.level = 0;
        data.games = 0;
    }

    for (i = 0; i < ARRAY_SIZE (flashers); i++)
    {
        flashers[i] = flasher_init (&flashers_info[i]);
        flasher_state[i] = 0;
    }

    for (i = 0; i < ARRAY_SIZE (display); i++)
        display[i] = 0;

    /* Set up flash patterns for different pixel types.  */
    flasher_pattern_set (flashers[SPACEY_PIX_GUN],
                         &flasher_patterns[FLASH_MODE_GUN]);
    flasher_pattern_set (flashers[SPACEY_PIX_SHELL],
                         &flasher_patterns[FLASH_MODE_SHELL]);
    flasher_pattern_set (flashers[SPACEY_PIX_ALIEN],
                         &flasher_patterns[FLASH_MODE_ALIEN]);
    
    tinygl_init (LOOP_RATE);
    tinygl_font_set (&font3x5_1);
    tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL);
    tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);
    tinygl_text_speed_set (10);

    spacey_init (GAME_UPDATE_RATE, TINYGL_WIDTH, TINYGL_HEIGHT, 
                 display_handler, display);

    spacey_event_handler_set (game_event, 0);

    game_ticks = 0;
    game_over_ticks = 0;

    pacer_init (LOOP_RATE);

    while (1)
    {
        pacer_wait ();

        if (state == STATE_PLAYING)
        {
            uint8_t *src;

            /* Update flasher states.  NB, the first flasher is always off.  */
            for (i = 1; i < ARRAY_SIZE (flashers); i++)
                flasher_state[i] = flasher_update (flashers[i]);
            
            /* Update display.  */
            src = display;
            for (j = 0; j < TINYGL_HEIGHT; j++)
                for (i = 0; i < TINYGL_WIDTH; i++)
                {
                    tinygl_point_t point = {i, j};

                    tinygl_draw_point (point, flasher_state[*src++]);
                }
        }

        /* Advance messages and refresh display.  */
        tinygl_update ();
        
        game_ticks++;
        if (game_ticks >= LOOP_RATE / GAME_UPDATE_RATE)
        {
            game_ticks = 0;
                
            switch (state)
            {
            case STATE_PLAYING:
                if (! spacey_update ())
                {
                    game_over_display (message);
                    game_over_ticks = 0;
                    state = STATE_OVER;
                }
                break;
                
            case STATE_INIT:
                tinygl_text ("SPACEY READY V" VERSION " BY MPH ");
                state = STATE_READY;
                break;
                
            case STATE_OVER:
                game_over_ticks ++;
                if (game_over_ticks >= GAME_UPDATE_RATE * GAME_OVER_PERIOD)
                    state = STATE_READY;
                /* Fall through.  */
                
            case STATE_READY:
            case STATE_MENU_LEVEL:
            default:
                break;
                
            case STATE_START:
                /* Turn that bloody blimey space invader off...  */
                game_start (&data);
                state = STATE_PLAYING;
                break;
            }
        }

        ret = ir_serial_receive (&ir_data);
        if (ret == IR_SERIAL_OK)
        {
            if (ir_data == 1)
            {
                switch (state)
                {
                case STATE_READY:
                    state = STATE_MENU_LEVEL;
                    game_level_display (data.level, message);
                    break;

                case STATE_MENU_LEVEL:
                    state = STATE_INIT;
                    break;

                case STATE_PLAYING:
                    spacey_gun_move_right ();
                    break;

                default:
                    break;
                }
            }

            if (ir_data == 2)
            {
                switch (state)
                {
                case STATE_READY:
                    state = STATE_START;
                    break;

                case STATE_PLAYING:
                    spacey_gun_fire ();
                    break;

                case STATE_MENU_LEVEL:
                    data.level++;
                    if (data.level > GAME_LEVEL_MAX)
                        data.level = 0;
                    game_level_display (data.level, message);
                    break;

                default:
                    break;
                }
            }
        }
    }
}
예제 #8
0
int main (void)
{
    uint16_t pulsate_tick = 0;
    uint8_t pwm_tick = 0;
    uint8_t x;
    uint8_t y;
    uint8_t update_col = 0;
    uint8_t col;
    uint8_t luminance = 0;
    /* This controls the luminance levels.  */
    const uint8_t levels[] = {4, 8, 16, 32, 64, 100, 64, 32, 16, 4};

    system_init ();

    tinygl_init (LOOP_RATE);
    led_init ();

    pacer_init (LOOP_RATE);

    while (1)
    {
        uint8_t state;

        /* Refresh display.  */
        for (col = 0; col < TINYGL_WIDTH; col++)
        {
            pacer_wait ();

            tinygl_update ();

            if (update_col != col)
                continue;
            
            if (update_col == 0)
                update_col = TINYGL_WIDTH;
            update_col--;
            
            pulsate_tick++;
            if (pulsate_tick >= UPDATE_RATE / PULSATE_RATE)
            {
                pulsate_tick = 0;
                
                if (luminance == 0)
                    luminance = ARRAY_SIZE (levels) - 1;
                else
                    luminance--;
            }
            
            state = levels[luminance] > pwm_tick * 100 / LUMINANCE_STEPS;
            
            /* Pulse width modulate pixels to control luminance.  */
            for (x = 0; x < TINYGL_WIDTH; x++)
            {
                for (y = 0; y < TINYGL_HEIGHT; y++)
                {
                    tinygl_draw_point (tinygl_point (x, y), state);
                }
            }
            
            led_set (LED1, state);
            
            pwm_tick++;
            if (pwm_tick >= UPDATE_RATE / PWM_RATE)
            {
                pwm_tick = 0;
            }
        }
    }
    return 0;
}
예제 #9
0
파일: paint.c 프로젝트: kki32/BlinkItAll
void painting(void){
  //receive from other players
  if (ir_uart_read_ready_p ()){
      paintP2 = 1;
      //get their position from the signal
      player2_pen.pos.x = ir_uart_getc();
      player2_pen.pos.y = ir_uart_getc();

      /* update the information about other player territory. */
      setTerritoryP2(player2_pen.pos.y, player2_pen.pos.x);
      tinygl_update ();
}

if (navswitch_push_event_p (NAVSWITCH_NORTH) && player1_pen.pos.y > 0)
{
    player1_pen.pos.y--;
    paintP1= 1;

     ir_uart_putc(player1_pen.pos.x);
     ir_uart_putc(player1_pen.pos.y);

     //check if the player lands on their own territory
     if(!isTerritoryTakenP1(player1_pen.pos.y, player1_pen.pos.x)){
       //check if the player lands on other player territory
        if(isTerritoryTakenP2(player1_pen.pos.y, player1_pen.pos.x)){
           specialScore();
        }
        //the player lands on territory that hasn't been painted
        else{
          incrementScore();
        }
     }
     //update information about the player territory
         setTerritoryP1(player1_pen.pos.y, player1_pen.pos.x);

}

if (navswitch_push_event_p (NAVSWITCH_SOUTH) && player1_pen.pos.y < TINYGL_HEIGHT - 1)
{
    player1_pen.pos.y++;
    paintP1= 1;

       ir_uart_putc(player1_pen.pos.x);
       ir_uart_putc(player1_pen.pos.y);

       //check if the player lands on their own territory
       if(!isTerritoryTakenP1(player1_pen.pos.y, player1_pen.pos.x)){
          //check if the player lands on other player territory
          if(isTerritoryTakenP2(player1_pen.pos.y, player1_pen.pos.x)){
             specialScore();
          }
          //the player lands on territory that hasn't been painted
          else{
            incrementScore();
          }
       }
       //update information about the player territory
       setTerritoryP1(player1_pen.pos.y, player1_pen.pos.x);
}
if (navswitch_push_event_p (NAVSWITCH_EAST) && player1_pen.pos.x < TINYGL_WIDTH - 1)
{
    player1_pen.pos.x++;
    paintP1= 1;

     ir_uart_putc(player1_pen.pos.x);
     ir_uart_putc(player1_pen.pos.y);

     //check if the player lands on their own territory
     if(!isTerritoryTakenP1(player1_pen.pos.y, player1_pen.pos.x)){
        //check if the player lands on other player territory
        if(isTerritoryTakenP2(player1_pen.pos.y, player1_pen.pos.x)){
           specialScore();
        }
        //the player lands on territory that hasn't been painted
        else{
          incrementScore();
        }
     }
   //update information about the player territory
   setTerritoryP1(player1_pen.pos.y, player1_pen.pos.x);

}

if(navswitch_push_event_p(NAVSWITCH_WEST) && player1_pen.pos.x > 0)
{
  player1_pen.pos.x--;
  paintP1= 1;

  ir_uart_putc(player1_pen.pos.x);
  ir_uart_putc(player1_pen.pos.y);

  //check if the player lands on their own territory
  if(!isTerritoryTakenP1(player1_pen.pos.y, player1_pen.pos.x)){
     //check if the player lands on other player territory
     if(isTerritoryTakenP2(player1_pen.pos.y, player1_pen.pos.x)){
        specialScore();
     }
     //the player lands on territory that hasn't been painted
     else{
       incrementScore();
     }
  }
  //update information about the player territory
   setTerritoryP1(player1_pen.pos.y, player1_pen.pos.x);
}


    if (paintP1)
        tinygl_draw_point (player1_pen.pos, player1_pen.state);
        tinygl_update();


   if (paintP2)
        tinygl_draw_point (player2_pen.pos, player2_pen.state);
        tinygl_update();
}