Почему не назначается только один из моих индексов массива? - PullRequest
0 голосов
/ 08 мая 2020

Так странно.

Я кодирую немного физики для своей игры, немного гравитации между планетами. Не работает, но не в этом дело.

Я запускаю игру l oop. Для каждого кадра в моем основном l oop я вызываю void calculate_gravity(GameState *game). В этой функции задействованы четыре объекта Wall из моего массива из 36 стен, в частности от wall_tiles[32] до [35]. Я использую эту функцию для вычисления speed_x и speed_y для моего плеера. Для этого я сделал al oop от 32 до 35, индексы соответствующих стен от wall_tiles[]. Следующий фрагмент кода длинный, но по большей части это операторы отладки printf:

void calculate_gravity(GameState *game)
{
    Player *player = &game->player;
    int factor;
    float speed_x, speed_y;
    float speeds_x[16];
    float speeds_y[16];

    factor = 2000;

    for (int i = 32; i < NUMBER_OF_WALLS; ++i)
    {
        float vector_x;
        float vector_y;
        float get_vector_x(GameState*, int);
        float get_vector_y(GameState*, int);
        float this_speed_x;
        float this_speed_y;


        vector_x = get_vector_x(game, i);
        vector_y = get_vector_y(game, i);

        printf("Vector: player to object %d = [%0.3f, %0.3f]",
               i, vector_x, vector_y);



        float  gravity_pull, distance;

        distance = game->wall_tiles[i].magnitude_from_player;
        if (distance < 100)
        {
            distance = 100;
        }

        // object direction = vector
        gravity_pull = factor*(1/(distance*distance));

        this_speed_x = vector_x * gravity_pull;
        this_speed_y = vector_y * gravity_pull;

        speeds_x[i-32] = this_speed_x;
        speeds_y[i-32] = this_speed_y;
        printf("\t i-32 = %d\n", i-32);



    }

    // Calculate average speed
    speed_x = (speeds_x[0] + speeds_x[1] + speeds_x[2] + speeds_x[3]) / 4;
    speed_y = (speeds_y[0] + speeds_y[1] + speeds_y[2] + speeds_y[3]) / 4;


    printf("speeds_x = [");
    for (int i = 0; i < 4; ++i)
    {
        printf("%0.2f,", speeds_x[i]);
    }
    printf("]\n");
    printf("Speed_x: %0.3f\n", speed_x);

    printf("speeds_y = [");
    for (int i = 0; i < 4; ++i)
    {
        printf("%0.2f,", speeds_y[i]);
    }
    printf("]\n");
    printf("Speed_y: %0.3f\n\n", speed_y);


    printf("\n");

    player->x += speed_x;
    player->y += speed_y;


}

А вот и самая странная часть. Или не. Мои массивы speed_x[] и 'speed_y []' работают нормально для индексов 0, 1 и 3, но для индекса 2 он всегда равен нулю.

Вот отладочный текст, который я напечатал, только первые три кадра :

Vector: player to object 32 = [-1000.000, -372.000]      i-32 = 0
Vector: player to object 33 = [-1300.000, -72.000]       i-32 = 1
Vector: player to object 34 = [-1600.000, -372.000]      i-32 = 2
Vector: player to object 35 = [-1300.000, -672.000]      i-32 = 3
speeds_x = [-200.00,-260.00,-0.00,-260.00,]
Speed_x: -180.000
speeds_y = [-74.40,-14.40,-0.00,-134.40,]
Speed_y: -55.800


Vector: player to object 32 = [-820.000, -316.200]       i-32 = 0
Vector: player to object 33 = [-1120.000, -16.200]       i-32 = 1
Vector: player to object 34 = [-1420.000, -316.200]      i-32 = 2
Vector: player to object 35 = [-1120.000, -616.200]      i-32 = 3
speeds_x = [-164.00,-224.00,-0.00,-224.00,]
Speed_x: -153.000
speeds_y = [-63.24,-3.24,-0.00,-123.24,]
Speed_y: -47.430


Vector: player to object 32 = [-667.000, -268.770]       i-32 = 0
Vector: player to object 33 = [-967.000, 31.230]         i-32 = 1
Vector: player to object 34 = [-1267.000, -268.770]      i-32 = 2
Vector: player to object 35 = [-967.000, -568.770]       i-32 = 3
speeds_x = [-133.40,-193.40,-0.00,-193.40,]
Speed_x: -130.050
speeds_y = [-53.75,6.25,-0.00,-113.75,]
Speed_y: -40.316

Я пробовал объявить speeds_x[16] как speeds_x[4] и speeds_x[100], но это не имело значения. Что мне не хватает? Почему только speeds_x[2] и speeds_y[2] всегда равны 0, а не другие индексы?

1 Ответ

1 голос
/ 08 мая 2020

Так ребята в комментариях все сказали. Если кто-нибудь это прочитает, не забудьте вызвать свои функции ... (в частности, distance = vector_magnitude(game, game->wall_tiles[i]);). И оператор% g - это хорошо. Это действительно помогло получить более чистый экран отладки. Теперь это работает, спасибо вам, ребята!

____________________________________________________________________________________________________

Object's ID: 32
Vector (player to object):                      [-998.6, -371.6]
Distance (player to object):                    1065.47
Object's gravity pull:                          0.00176175
Object's speed effect (x, y):                   [-1.75924, -1.75924]

Object's ID: 33
Vector (player to object):                      [-1298.6, -71.6]
Distance (player to object):                    1300.55
Object's gravity pull:                          0.00118243
Object's speed effect (x, y):                   [-1.53548, -1.53548]

Object's ID: 34
Vector (player to object):                      [-1598.6, -371.6]
Distance (player to object):                    1641.2
Object's gravity pull:                          0.00074252
Object's speed effect (x, y):                   [-1.18698, -1.18698]

Object's ID: 35
Vector (player to object):                      [-1298.6, -671.6]
Distance (player to object):                    1461.96
Object's gravity pull:                          0.000935744
Object's speed effect (x, y):                   [-1.21514, -1.21514]

Array of speed values (x):                      [-1.76,-1.54,-1.19,-1.22] |             Average: -1.42
Array of speed values (y):                      [-0.65,-0.08,-0.28,-0.63] |             Average: -0.41
____________________________________________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...