Потеря позиции прыгающего мяча - PullRequest
0 голосов
/ 01 мая 2011

Я пытаюсь нарисовать прыгающий шар с помощью WIN32 GUI, поэтому я определяю 2d вектор для положения шара и прямоугольная карта с размером моего экрана

struct pos {
    float x;
    float y;
};
RECT maprect = {0, 0, 800, 600};
pos ballpos;
ballpos.x=300;
ballpos.y=300;

(конечно, я использую класс для 2dvec, и это больше, чем это)

и я рисую эллипс

Ellipse(backbufferDC, (int)ballpos.x-45, (int)ballpos.y-45,
        (int)ballpos.x+45, (int)ballpos.y+45);

Теперь, чтобы заставить мой эллипс отскочить, я использую этот код в цикле сообщений, и он отлично работает:

bool balldown = false; 
if (ballpos.y > maprect.bottom-40) {
    balldown = true;
}
else if (ballpos.y < maprect.top+300) {
    balldown = false;
}

if (ballpos.y > maprect.bottom-40) {
    balldown = true ;
}
else if(ballpos.y < maprect.top+300) {
    balldown = false;
}

if (!balldown) {
    vel+=1;
    ballpos.y +=3;
}
else {
    ballpos.y-=3;
}


Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
        (int)tankpos.x+45, (int)tankpos.y+45);

но чтобы она выглядела более реалистично, я решил изменить скорость мяча на ходу так что я в конечном итоге с этим кодом

float vel;
if (ballpos.y > maprect.bottom-40) {
    balldown = true ;
}
else if (ballpos.y < maprect.top+300) {
    balldown = false ;
}

if (!balldown) {
    vel+=0.5f;
    ballpos.y +=vel;
}
else {
    vel-=0.5f;
    ballpos.y-=vel;
}



Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
        (int)tankpos.x+45, (int)tankpos.y+45);

и теперь это выглядит намного лучше, но проблема в том, что мяч просто отскакивает один раз, затем во второй раз он падает на землю и исчезает!

Ответы [ 2 ]

1 голос
/ 02 мая 2011
if (!balldown) {
    vel+=0.5f;
    ballpos.y +=vel;
}
else {
    vel-=0.5f;
    ballpos.y-=vel;
}

Эта логика неверна. Гравитация всегда вызывает ускорение в одном и том же направлении, вниз.

Что вы должны сделать, это справиться со столкновением. Упругое столкновение с массивной стенкой может выглядеть как

vel = -vel;

Итак, в итоге у вас есть

vel -= 0.5f;
ballpos.y += vel;
if (ballpos.y <= floory) {
    vel = -vel;
    ballpos.y = 2*floory - ballpos.y;
}
0 голосов
/ 01 мая 2011
 else {
        vel-=0.5f;
        ballpos.y-=vel;
      }

Возможно, вы получаете отрицательные значения здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...