SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › логика и графика Match3 game( три в ряд) › Ответ в теме: логика и графика Match3 game( три в ряд)
Вот вам небольшая наброска того как я вижи решение задачи.Создал два класса: сетки и шариков. Сетка состоит из квадратов 30 на30, а шарики представляют и себя структур которая содержит : объект (круг,цвет,размер,и положение на координатной сетке) и маркер(красный,зелёный и синий). По маркеру можно будет отличать шарики в проверке на пересечения. В методе void rulechek() небольшой пример: если два красных шара соприкоснуться они удаляються.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
class net { public: vector<RectangleShape> netcell; void create(vector<Balls> ballArrey) { for (int i = 0; i < 81; i++) { RectangleShape cell; cell.setOutlineThickness(1); cell.setOutlineColor(Color::Black); cell.setFillColor(Color::Transparent); cell.setSize(Vector2f(30, 30)); netcell.push_back(cell); } pos.x = 0; pos.y = 0; for (int i = 0; i < netcell.size(); i++) { pos.x = x; pos.y = y; x += 31; ii++; if (ii > 9) { x = 0; y += 31; ii = 0; } netcell[i].setPosition(pos); } for (int i = 0; i < ballArrey.size(); i++) ballArrey[i].ball.setPosition(Vector2f(netcell[i].getPosition().x+1, netcell[i].getPosition().y+1)); } void drow(RenderWindow & win) { for (int i = 0; i < netcell.size(); i++) win.draw(netcell[i]); } private: int x = 0, y = 0, ii = 0; Vector2f pos; }; class Ball { public: struct Balls{ CircleShape ball; enum { Red, Green, Blue }color; }; vector<Balls> ballArrey; void create() { Balls ball; for (int i = 0; i < 25; i++) { CircleShape redball; redball.setFillColor(Color::Red); redball.setRadius(15); ball.ball = redball; ball.color = ball.Red; ballArrey.push_back(ball); } for (int i = 0; i < 25; i++) { CircleShape greenball; greenball.setFillColor(Color::Red); greenball.setRadius(15); ball.ball = greenball; ball.color = ball.Green; ballArrey.push_back(ball); } for (int i = 0; i < 25; i++) { CircleShape blueball; blueball.setFillColor(Color::Red); blueball.setRadius(15); ball.ball = blueball; ball.color = ball.Blue; ballArrey.push_back(ball); } for (int i = 0; i < ballArrey.size(); i++) { if (ballArrey[i].color == 0) Red.push_back(ballArrey[i]); if (ballArrey[i].color == 1) Green.push_back(ballArrey[i]); if (ballArrey[i].color == 2) Blue.push_back(ballArrey[i]); } } void update() { rulechek(); } void drow(RenderWindow & win) { for (int i = 0; i < ballArrey.size(); i++) win.draw(ballArrey[i].ball); } private: vector<Balls> Red; vector<Balls> Green; vector<Balls> Blue; void rulechek() { for (int i = 0; i < ballArrey.size(); i++) for (int ii = 0; ii < Red.size(); ii++) { if (Red[ii].ball.getGlobalBounds().intersects(ballArrey[i].ball.getLocalBounds())); if (ballArrey[i].color == 1) { // ballArrey.erase(ballArrey.begin() + i); // Red.erase(Red.begin() + ii); } } } void control() { } }; |