SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Передвижение персонажа по клику мыши › Ответ в теме: Передвижение персонажа по клику мыши
У тебя обновление позиции спрайта находится в пуле ивентов. Попробуй начать вводить текст с клавиатуры и увидишь тот же эффект что и немного двигая мышь. Что бы пофиксить это логика перемещения спрайта должна быть вынесена в главный цикл, а не пул ивентов:
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
while (window.isOpen()) { float time = clock.getElapsedTime().asMicroseconds(); clock.restart(); time = time / 800; if (p.life) gameTime = gameTimeClock.getElapsedTime().asSeconds(); else { view.rotate(0.1); view.zoom(1.0006f); } //else // view.move(0.1, 0); // движение камеры вправо Vector2i pixelPos = Mouse::getPosition(window);//забираем коорд курсора Vector2f pos = window.mapPixelToCoords(pixelPos);//переводим их в игровые (уходим от коорд окна) Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed) window.close(); if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши if (event.key.code == Mouse::Left) {//а именно левая if (p.sprite.getGlobalBounds().contains(pos.x, pos.y))//и при этом координата курсора попадает в спрайт { p.sprite.setColor(Color::Green);//красим спрайт в зеленый,тем самым говоря игроку,что он выбрал персонажа и может сделать ход p.isSelect = true; } } if (p.isSelect)//если выбрали объект if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши if (event.key.code == Mouse::Right) {//а именно правая p.isMove = true;//то начинаем движение p.isSelect = false;//объект уже не выбран p.sprite.setColor(Color::White);//возвращаем обычный цвет спрайту tempX = pos.x;//забираем координату нажатия курсора Х tempY = pos.y;//и Y } ////////////////////////////////////////////// //if (p.isMove) { //distance = sqrt((tempX - p.x)*(tempX - p.x) + (tempY - p.y)*(tempY - p.y));//считаем дистанцию (длину от точки А до точки Б). формула длины вектора //if (distance > 2) {//этим условием убираем дергание во время конечной позиции спрайта // p.x += 0.1*time*(tempX - p.x) / distance;//идем по иксу с помощью вектора нормали // p.y += 0.1*time*(tempY - p.y) / distance;//идем по игреку так же //} //else // p.isMove = false; //} if(event.type == Event::KeyPressed) if (event.key.code == Keyboard::Tab) { switch (showMissionText) { case true: { std::ostringstream playerHealthString; playerHealthString << p.health; std::ostringstream task; task << getTextMission(getCurrentMission(p.getplayercoordinateX())); text2.setString("Здоровье: " + playerHealthString.str() + "\n" + task.str() + "\n"); showMissionText = false; break; } case false: { /*text2.setString(" ");*/ showMissionText = true; break; } } } } if (p.life) { if (Keyboard::isKeyPressed(Keyboard::Left)) { p.dir = 1; p.speed = 0.1; CurrentFrame += 0.005 * time; if (CurrentFrame > 2) CurrentFrame -= 2; p.sprite.setTextureRect(IntRect(46 * int(CurrentFrame), 0, 46, 45)); } if (Keyboard::isKeyPressed(Keyboard::Right)) { p.dir = 0; p.speed = 0.1; CurrentFrame += 0.005 * time; if (CurrentFrame > 2) CurrentFrame -= 2; p.sprite.setTextureRect(IntRect(46 * int(CurrentFrame) + 46, 0, -46, 45)); } if (Keyboard::isKeyPressed(Keyboard::Up)) { p.dir = 3; p.speed = 0.1; CurrentFrame += 0.005 * time; if (CurrentFrame > 2) CurrentFrame -= 2; p.sprite.setTextureRect(IntRect(46 * int(CurrentFrame) + 46, 0, -46, 45)); } if (Keyboard::isKeyPressed(Keyboard::Down)) { p.dir = 2; p.speed = 0.1; CurrentFrame += 0.005 * time; if (CurrentFrame > 2) CurrentFrame -= 2; p.sprite.setTextureRect(IntRect(46 * int(CurrentFrame) + 46, 0, -46, 45)); } getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY()); } // КАМЕРА ДЛЯ СТРАТЕГИИ //Vector2i localPosition = Mouse::getPosition(window); //if (localPosition.x < 3) { view.move(-0.2*time, 0); }//если пришли курсором в левый край экрана,то двигаем камеру влево //if (localPosition.x > window.getSize().x - 3) { view.move(0.2*time, 0); }//правый край-вправо //if (localPosition.y > window.getSize().y - 3) { view.move(0, 0.2*time); }//нижний край - вниз //if (localPosition.y < 3) { view.move(0, -0.2*time); }//верхний край - вверх if (p.isMove) {//Перемещён сюда distance = sqrt((tempX - p.x)*(tempX - p.x) + (tempY - p.y)*(tempY - p.y));//считаем дистанцию (длину от точки А до точки Б). формула длины вектора if (distance > 2) {//этим условием убираем дергание во время конечной позиции спрайта p.x += 0.1*time*(tempX - p.x) / distance;//идем по иксу с помощью вектора нормали p.y += 0.1*time*(tempY - p.y) / distance;//идем по игреку так же } else p.isMove = false; } p.update(time); window.setView(view); window.clear(Color(195,151,78)); //-------------------------------------------------------------------------------------------------------- for (int i = 0; i < HEIGHT_MAP; i++) for (int j = 0; j < WIDTH_MAP; j++) { if (TileMap[i][j] == ' ') s_map.setTextureRect(IntRect(65, 0, 65, 65)); if (TileMap[i][j] == 's') s_map.setTextureRect(IntRect(130, 0, 65, 65)); if ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(0, 0, 65, 65)); if ((TileMap[i][j] == 'f')) s_map.setTextureRect(IntRect(195, 0, 65, 65)); if ((TileMap[i][j] == 'h')) s_map.setTextureRect(IntRect(260, 0, 65, 65)); s_map.setPosition(j * 65, i * 65);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 65*65 и мы увидим один квадрат window.draw(s_map); } //----------------------------------------------------------------------------------------- std::ostringstream playerScoreString, playerHealthString, gameTimeString; playerScoreString << p.playerScore; playerHealthString << p.health; gameTimeString << gameTime; text.setString("Собрано червячков:" + playerScoreString.str() + "\nЗдоровье: " + playerHealthString.str() + "\nВремя в игре: " + gameTimeString.str()); text.setPosition(view.getCenter().x - 370, view.getCenter().y - 200); if (!showMissionText) { text2.setPosition(view.getCenter().x + 125, view.getCenter().y - 130); s_quest.setPosition(view.getCenter().x + 115, view.getCenter().y - 130); window.draw(s_quest); window.draw(text2); //Рисуем текст 2 (миссия) } window.draw(text); window.draw(p.sprite); window.display(); } |