SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Пролагивают спрайты
Помечено: Спрайт
В этой теме 14 ответов, 3 участника, последнее обновление Павел Букреев 7 года/лет, 9 мес. назад.
-
АвторСообщения
-
При движении пролагивают спрайты, как показано на картинке. Как исправить? Нужную инфу скину.
Вложения:
You must be logged in to view attached files.мне кажется размеры всех спрайтов на один пиксель не соответствуют размеру окна. может быть поэтому..
Причем это происходит не с одним конкретным местом, а во время движения камеры с разными спрайтами… Попробовал поизменять размер окна – ничего не дало. Размер спрайтов 50×50, окна на скрине 640×480
Возможно вы обновляете камеру вида не синхронно. Покажите код отрисовки вместе с обновлением камеры.
кусок отрисовки в цикле игры
h.update(time);
window.clear();
window.setView(view1);
// рисуем карту
for (int i = 0; i < HEIGHT_MAP; i++)
for (int j = 0; j < WIDTH_MAP; j++)
{
if (TileMap[i][j] == ‘ ‘) s_map.setTextureRect(IntRect(0, 0, 50, 50));
if (TileMap[i][j] == ‘s’ || TileMap[i][j] == ‘0’) s_map.setTextureRect(IntRect(50, 0, 50, 50));
if (TileMap[i][j] == ‘t’) s_map.setTextureRect(IntRect(50*2, 0, 50, 50));
if (TileMap[i][j] == ‘k’) s_map.setTextureRect(IntRect(50*3, 0, 50, 50));
s_map.setPosition(j * 50, i * 50);
window.draw(s_map);
}
//игровые элементы
for (int i = 0; i < box_k; i++)
window.draw(box[i].sprite);
for (int i = 0; i < h.bullet_k; i++)
window.draw(h.bullet[i].sprite);
for (int i = 0; i < enemy_k; i++)
window.draw(enemy[i].sprite1);
//
window.draw(h.sprite1); // спрайт героя
// игровой интерфейс (сверху слева)
cursor_sprite.setPosition(window.mapPixelToCoords(Mouse::getPosition(window)).x, window.mapPixelToCoords(Mouse::getPosition(window)).y);
text.setString(inttostr(h.ammo_k) + ‘/’);
text.setPosition(view1.getCenter().x-375, view1.getCenter().y-250);
icon_pistolet.setPosition(view1.getCenter().x-300, view1.getCenter().y-227);
icon_pistolet.rotate(0.18);
hp_bar_sprite.setPosition(view1.getCenter().x-400, view1.getCenter().y-290);
window.draw(hp_bar_sprite);
window.draw(icon_pistolet);
window.draw(text);
window.draw(cursor_sprite);
//
window.display();ниже h.update();
void setPosition(db x1, db y1)
{
view1.setCenter(x1, y1);
x = x1;
y = y1;
sprite1.setPosition(x1, y1);
}
void update(db time)
{
if (dx == 0 || dy == 0)
setPosition(x + dx * time, y + dy * time);
else
setPosition(x + time * dx / sqrt(2), y + time * dy / sqrt(2));
dx = 0; dy = 0;
}срочно тащите бинты! У моих глаз утечка!
Тем не менее, есть идеи?
Тем не менее, есть правило.
Пожалуйста пишите название темы согласно Вашей проблеме и закидывайте тему в нужный раздел! Не используйте слова типа “помогите!” и т.д. в названии темы. Для вставки кода найдите кнопку для кода – она чуть выше окна, в котором Вы пишете.
Соблюдая это правило вы имеете больше шансов на помощь.А вообще если первый кадр идёт от 0 до 50, то начало следующего кадра будет с 51, т.к. 50 пиксель занят первым кадром.
Сразу не нашел кнопку для оформления кода… Первый кадр у меня идет от 0 до 49, да и как я понял дело не в самих спрайтах, а именно в коде или самой библиотеке.
Ага…
Первый кадр у меня идет от 0 до 49, да и как я понял дело не в самих спрайтах, а именно в коде или самой библиотеке.
Ну-ну!
C++1234if (TileMap[i][j] == ‘ ‘) s_map.setTextureRect(IntRect(0, 0, 50, 50));if (TileMap[i][j] == ‘s’ || TileMap[i][j] == ‘0’) s_map.setTextureRect(IntRect(50, 0, 50, 50));if (TileMap[i][j] == ‘t’) s_map.setTextureRect(IntRect(50*2, 0, 50, 50));if (TileMap[i][j] == ‘k’) s_map.setTextureRect(IntRect(50*3, 0, 50, 50));Я что-то недопонимаю… Скиньте исправленный код. Если я ставлю с 51, то перед каждым спрайтом белая полоса
ставь до 49
Потыкался… Если ставить 49 или 51, то появляются черные полосы.
Проблема решена, с помощью загрузки спрайтов всех элементов карты из отдельных png
Heisenberg, ты какойт жёсткий типок))
Denisson, спасибо, что рассказал, как решил проблему:)
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.