SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Бомбы
В этой теме 4 ответа, 3 участника, последнее обновление Sanya 8 года/лет, 5 мес. назад.
-
АвторСообщения
-
Попыталась создать первую игру(простите за китайский код:)),в которой человек уворачивается от бомб. Перс и карта(вместо карты обычная картинка) работают нормально, а вот бомбы не получается вывести сразу много, или хоть несколько. Вводится одна, и улетает вниз. Помогите пожалуйста, как сделать, чтоб много бомб(падающих сверху, рандомно из разных точек х), и ограничить их(чтоб они не улетали, а, допустим стопарились внизу экрана)? Уроки смотрела, но попыталась написать полегче(без дочерних классов и т.д, а то путаюсь)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161class Player { // класс Игрокаfloat x, y;public:float w, h, dx, dy, speed = 0;bool life;int dir = 0;String File;Image image;Texture texture;Sprite sprite;Player(String F, float X,float Y, float W, float H){File = F;life = true;w = W; h = H;image.loadFromFile(“images/” + File);texture.loadFromImage(image);sprite.setTexture(texture);x = X; y = Y;sprite.setTextureRect(IntRect(0, 0, w, h));}void update(float time){switch (dir){case 0: dx = speed; dy = 0; break;case 1: dx = -speed; dy = 0; break;case 2: dx = 0; dy = speed; break;case 3: dx = 0; dy = -speed; break;}x += dx*time;y += dy*time;speed = 0;sprite.setPosition(x, y);if( life == false){ speed = 0; }}void update2(float time, int gameTime){if (gameTime > 0.5){dx = 0; dy = 0.1;y += dy*time;sprite.setPosition(x, y);}}float getplayercoordinateX(){return x;}float getplayercoordinateY(){return y;}};int main(){srand(time(NULL));RenderWindow window(sf::VideoMode(490, 500), “Lesson 8. kychka-pc.ru”);Image map_image;map_image.loadFromFile(“images/0009000.png”);Texture map;map.loadFromImage(map_image);Sprite s_map;s_map.setTexture(map);float CurrentFrame = 0;Clock clock;Clock gameTimeClock;int gameTime = 0;Player p(“sold2.png”, 232, 440, 25.0, 33.0);float xx = 0 + rand() % 300;Player v(“vrg.png”, xx, 0, 23, 42);while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();if (p.life) gameTime = gameTimeClock.getElapsedTime().asSeconds();clock.restart();time = time / 800;sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}p.sprite.setScale(1.5, 1.5);v.sprite.setScale(1.2, 1.2);if (p.life) {if ((Keyboard::isKeyPressed(Keyboard::Left))) {p.dir = 1; p.speed = 0.2;if (p.getplayercoordinateX() < 0){ p.speed = 0; }//ЗАПРЕЩЕНО ВЛЕВО CurrentFrame += 0.3*time; if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 32, 30, 32));}if ((Keyboard::isKeyPressed(Keyboard::Right))) {p.dir = 0; p.speed = 0.2;if (p.getplayercoordinateX() > 452){ p.speed = 0; }CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 64, 31, 32));}if ((Keyboard::isKeyPressed(Keyboard::Up))) {p.dir = 3; p.speed = 0.2;CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 96, 31, 32));}if ((Keyboard::isKeyPressed(Keyboard::Down))) {p.dir = 2; p.speed = 0.2;//направление вверх, см вышеif (p.getplayercoordinateY() > 440){ p.speed = 0; }CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 0, 31, 32));}}p.update(time);v.update2(time, gameTime);window.draw(v.sprite);for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){if ((TileMap[i][j] == ‘0’)) s_map.setTextureRect(IntRect(0, 0, 500, 500));window.draw(s_map);}window.draw(p.sprite);window.draw(v.sprite);window.display();}return 0;}Ознакомьтесь с возможностями библиотек
list, vector.А так же не забывайте пользоваться специальными возможностями вставки кода на форум.
У тебя уже есть одна бомба? она работает нормально? для начала ограничь её внизу и сделай всё для одной бомбы.
потом уже попробуем запихнуть эту бомбу в коллекцию
Да, бомба есть,это объект v класса Player.Но проблема в том, что так как бомба не в списке, нельзя удалить объект, когда y=500, тоесть когда бомба достигает конца окна. И неизвестно, как дальше делать..
Вот теперь работает всё для одной бомбы: Она летит до конца окна, и начинает все с начала, так же работает столкновением с персонажем(если столкновение,они оба замирают, потом сделаю взрыв), бомба- объект v класса Player, но не получается сделать, чтоб бомб было много, и они выводились с рандомной координатой x.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201class Player { // класс Игрокаfloat x, y;public:float w, h, dx, dy, speed = 0;bool life;int dir = 0;String File;Image image;Texture texture;Sprite sprite;Player(String F, float X,float Y, float W, float H){File = F;life = true;w = W; h = H;image.loadFromFile("images/" + File);texture.loadFromImage(image);sprite.setTexture(texture);x = X; y = Y;sprite.setTextureRect(IntRect(0, 0, w, h));}FloatRect getRect(){return FloatRect(x, y, w, h);}void update(float time){switch (dir){case 0: dx = speed; dy = 0; break;//по иксу задаем положительную скорость, по игреку зануляем. получаем, что персонаж идет только вправоcase 1: dx = -speed; dy = 0; break;//по иксу задаем отрицательную скорость, по игреку зануляем. получается, что персонаж идет только влевоcase 2: dx = 0; dy = speed; break;//по иксу задаем нулевое значение, по игреку положительное. получается, что персонаж идет только внизcase 3: dx = 0; dy = -speed; break;//по иксу задаем нулевое значение, по игреку отрицательное. получается, что персонаж идет только вверх}x += dx*time;//то движение из прошлого урока. наше ускорение на время получаем смещение координат и как следствие движениеy += dy*time;//аналогично по игрекуspeed = 0;sprite.setPosition(x, y);if( life == false){ speed = 0; }}void update2(float time, int gameTime, bool stoop) //функция время, работает бесконечно, давая движение бомбе.{if (stoop){if (gameTime > 0.5){dx = 0; dy = 0.1;y += dy*time;sprite.setPosition(x, y);if (y > 500){y = 0;sprite.setPosition(x, y);}}}}float getplayercoordinateX(){return x;}float getplayercoordinateY(){return y;}};int main(){srand(time(NULL));RenderWindow window(sf::VideoMode(490, 500), "Lesson 8. kychka-pc.ru");//Font font;//font.loadFromFile("CyrilicOld.ttf");//Text text("", font, 20);//text.setColor(Color::Red);//text.setStyle(Text::Bold);Image map_image;map_image.loadFromFile("images/0009000.png");//картаTexture map;//текстура картыmap.loadFromImage(map_image);//заряжаем текстуру картинкойSprite s_map;//создаём спрайт для картыs_map.setTexture(map);//заливаем текстуру спрайтомfloat CurrentFrame = 0;Clock clock;Clock gameTimeClock;int gameTime = 0;bool stoop=true;Player p("sold2.png", 232, 440, 25.0, 33.0);float xx = 0 + rand() % 300;Player v("vrg.png", xx, 0, 23, 42);while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();if (p.life) gameTime = gameTimeClock.getElapsedTime().asSeconds();clock.restart();time = time / 800;sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}p.sprite.setScale(1.5, 1.5);v.sprite.setScale(1.2, 1.2);if (p.life) {if ((Keyboard::isKeyPressed(Keyboard::Left))) {p.dir = 1; p.speed = 0.2;if (p.getplayercoordinateX() < 0){ p.speed = 0; }//ЗАПРЕЩЕНО ВЛЕВОCurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 32, 30, 32));}if ((Keyboard::isKeyPressed(Keyboard::Right))) {p.dir = 0; p.speed = 0.2;if (p.getplayercoordinateX() > 452){ p.speed = 0; }CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 64, 31, 32));}if ((Keyboard::isKeyPressed(Keyboard::Up))) {p.dir = 3; p.speed = 0.2;CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 96, 31, 32));}if ((Keyboard::isKeyPressed(Keyboard::Down))) {p.dir = 2; p.speed = 0.2;//направление вверх, см вышеif (p.getplayercoordinateY() > 440){ p.speed = 0; }CurrentFrame += 0.3*time;if (CurrentFrame > 3) CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(30 * int(CurrentFrame), 0, 31, 32));}if (v.getRect().intersects(p.getRect())) {p.life = false;stoop = false;}}p.update(time);/v.update2(time, gameTime, stoop);window.draw(v.sprite);for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){if ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(0, 0, 500, 500));window.draw(p.sprite);window.draw(v.sprite);window.display();}return 0;} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.