Cześć! Od wczoraj się męczę z zaimplementowaniem skoku po bloczkach ( coś a'la Icy Tower ), niestety, albo wychodzi tylko na to, że postać podskakuje na pierwszy bloczek, na drugi już nie; nie wskakuje na żaden bloczek; lub w ogóle nie skacze.
W source.cpp metoda updateJump wykonywana jest w timerze. Czy może mnie ktoś naprowadzić? Byłbym wdzięczny! Pozdrawiam
Na dobrą sprawę to powinno według mnie wyglądać tak ( Skocz ; Sprawdź, czy jest na ziemi, jeżeli tak, ustaw na fałsz ; zwiększaj atrybuty x,y, w między czasie sprawdzaj, czy nie zachodzi kolizja z żadnym z bloczków, jeżeli tak to ustaw na prawdę ;
Dla sytuacji przedstawionej poniżej, kolizję wykrywa mi tylko z podłogą, czyli pierwszym(zerowym bloczkiem). Jeżeli nawet na 'sztywno' ustawiłem postaci większą współrzędną y, by "latać", to przy kolizji z bloczkiem w konsoli nie wykrywało kolizji.
character.cpp
void character::startJump(map& Map, character& player) {
if (Map.isCollidingBlock(player))
{
vel[1] = -11.0;
onGround = false;
}
}
void character::updateJump(map& Map, character& player) {
vel[1] += 0.5;
y += vel[1];
x += vel[0];
Map.isCollidingBlock(player);
if (y > 460){
y = 460;
vel[1] = 0.0;
onGround = true;
vel[0] = 0.0;
}
if ((x + width >= START_WALL_X && x <= WALL_WIDTH + START_WALL_X) || (x + width >= END_WALL_X &&x <= END_WALL_X + WALL_WIDTH)){
vel[0] *= -1;
bound = true;
if (direction == 1)
direction = 2;
else if (direction == 2)
direction = 1;
}
}
map.cpp
bool map::isCollidingBlock(character& player) { // kolizja gracza z bloczkami
for (int i = 0; i < MAX_BLOCKS; i++) {
if (player.x + player.width >= tab_axis[i][0] && player.x <= tab_axis[i][0] + tab_width[i] && player.y + player.height >= tab_axis[i][1] && player.y <= tab_axis[i][1] + block_height) {
printf("KOLIZJA");
return true;
}
else {
printf("BRAK KOLIZJA");
return false;
}
}
}
void map::FirstBlocks() { // tworzenie bloczków na mapie, 0 to podłoga
int count = 0;
tab_axis[0][0] = START_FLOOR_X;
tab_axis[0][1] = START_FLOOR_Y;
tab_width[0] = al_get_bitmap_width(floorbmp);
for (int i = 1; i < MAX_BLOCKS; i++) {
tab_width[i] = (rand() % MAX_RANDOM_X_SIZE) + MIN_RANDOM_X_SIZE;
while (tab_width[i] > MAX_RANDOM_X_SIZE) {
tab_width[i] = (rand() % MAX_RANDOM_X_SIZE) + MIN_RANDOM_X_SIZE;
}
}
for (int x = 1; x < MAX_BLOCKS; x++) {
for (int y = 0; y < 2; y++) {
if (y == 0) {
tab_axis[x][y] = rand() % END_WALL_X;
while (tab_axis[x][y] < WALL_WIDTH || tab_axis[x][y] + tab_width[x] >= END_WALL_X) {
tab_axis[x][y] = rand() % END_WALL_X;
}
}
else if (y == 1)
tab_axis[x][y] = 430 - count * 116;
}
count++;
}
}