SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Помогите с алгоритмом реального отталкивания шарика от кубиков в игре Арканоид.
В этой теме 2 ответа, 2 участника, последнее обновление woods 8 года/лет, 1 месяц назад.
Просмотр 3 сообщений - с 1 по 3 (из 3 всего)
-
АвторСообщения
-
C++123456789101112131415std::list<Entity*> bricks; //список с объектами Энтитиstd::list<Entity*>::iterator it; //итератор для прохождения по списку///////////////////////столкновение мяча с кубиками////////////////////////////for(it = bricks.begin(); it != bricks.end(); ){if((*it)->getRect().intersects(ball.getRect())){ball.interactionWithBrick(bricks, it);delete *it;it = bricks.erase(it);Platform.playerscore++;}else ++it;}C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899#include "Ball.h"#include <iostream>Ball::Ball(sf::String F, float X, float Y, float W, float H):Entity(F, X, Y, W, H){SPEED = 0.15;speedX = SPEED;speedY = SPEED;}void Ball::update(float time){if(speedY < 0.15) speedY = 0.05; //ограничение скорости вертикал. движенияif(speedY > 0.55) speedY = 0.05;switch(dir) //реализуем поведение в зависимости от направления. (каждая цифра соответствует направлению){case 0: dx = - speedX; dy = - speedY; break; //влево вверхcase 1: dx = - speedX; dy = speedY; break; //влево внизcase 2: dx = speedX; dy = - speedY; break; //вправо вверхcase 3: dx = speedX; dy = speedY; break; //вправо вниз}x += dx*time;y += dy*time;//////////СТОЛКНОВЕНИЯ С ГРАНИЦАМИ КАРТЫ///////////////if(x <= 20) //столкновение мяча с левой границей{if(dir == 0) dir = 2;if(dir == 1) dir = 3;}if(x + 32 >= 800 - 20) //столкновение мяча с правой границей{if(dir == 2) dir = 0;if(dir == 3) dir = 1;}if(y <= 20) //столкновение мяча с верхней границей{if(dir == 0) dir = 1;if(dir == 2) dir = 3;}if(y + 32 >= 600 - 20) //столкновение мяча с нижней границей{if(dir == 1) dir = 0;if(dir == 3) dir = 2;}sprite.setPosition(x, y); //иначе бы спрайт стоял на месте.}void Ball::interactionWithPlayer(Player &player) //проверка пересечения игрока с мячом{if(player.getRect().intersects(getRect())) //если прямоугольник игрока пересекается с прямоугольником мяча{if(dir == 1) dir = 0; //если влево вниз, то влево вверхelse dir = 2; //иначе вправо вверхy -= 10;}}void Ball::interactionWithBrick(std::list<Entity*> list, std::list<Entity*>::iterator it) //проверка пересечения с кубиками{if (x + w >= (*it)->x) //если мячик слева от кубика{if (dir == 2) dir = 0;if (dir == 3) dir = 1;x -= 10; //отпрыгивает на 10 пксstd::cout << "mja4 sleva\n";}else if (x <= (*it)->x + (*it)->w) //если мячик справа от кубика{if (dir == 0) dir = 2;if (dir == 1) dir = 3;x += 10;std::cout << "mja4 sprava\n";}else if (y + h >= (*it)->y ) //если мячик сверху от кубика{if (dir == 1) dir = 0;if (dir == 3) dir = 2;y -= 10;std::cout << "mja4 sverhu\n";}else if (y <= (*it)->y + (*it)->h) //если мячик снизу от кубика{if (dir == 0) dir = 1;if (dir == 2) dir = 3;y += 10;std::cout << "mja4 sleva\n";}}
Проблема в том, что в функции срабатывает только этот код, т.к. консолька выводит только надпись “mja4 sleva”. И, естественно, отпрыгивает только иногда, если мячик при касании слева от кубика.
C++1234567if (x + w >= (*it)->x) //если мячик слева от кубика{if (dir == 2) dir = 0;if (dir == 3) dir = 1;x -= 10; //отпрыгивает на 10 пксstd::cout << "mja4 sleva\n";}Убери else в условиях ниже, и посмотри что получится.
Теперь отталкивается от всех границ, кроме когда мячик сверху кубика и движется справа налево. в консоле при первом касании кубика выдет след. картину. т.е. обрабатываются все циклы кроме низу, а цикл слева 2 раза аж…
Вложения:
You must be logged in to view attached files. -
АвторСообщения
Просмотр 3 сообщений - с 1 по 3 (из 3 всего)
Для ответа в этой теме необходимо авторизоваться.