Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизСкроллинг экрана Найти похожие ветки
← →
.cpp (2004-12-07 13:13) [0]Здравствуйте уважаемые модераторы форума
У меня такой вопрос - как сделать плавный скроллинг экрана (2D), или подскажите ссылку на статью
← →
Sphinx (2004-12-07 13:32) [1]Строить всю карту а выводить лишь некоторую часть...
На чем делаешь хоть укажи.
← →
Sphinx (2004-12-07 13:45) [2]Если используешь DDraw, то просто используй Surface.Blt(...) с указанием прямоугольника на поверхности карты и прямомоугольника с размерами экрана...
К сожалению под рукой примера нету...но надеюсь и так понятно :)
З.Ы. FastBlt не используй...в этом случае поверхность не выводится...
← →
dRake (2004-12-07 14:03) [3]Пусть у нас поле (мир) A х B пикселей.
Пусть область вывода графики (камера) - CamW x CamH пикселей.
Вот эта камера будет перемещаться по миру и выводить только те объкты которые в нее попадают.
Для этого надо:
1) Задать точку которая будет определять положение камеры (у меня она задает центр, так удобнее, можно например задавать координату левого-верхнего угла камеры (ведь она - прямоугольник с известными размерами)
Для вывода графики надо:
1) Проверить, попадает ли объект в камеру.
Сx, Cy - координаты центра камеры
Ox, Oy - координаты центра объекта
Ow, Oh - ширина и высота обекта (объект - прямоугольник)
FUNCTION CamPass( Cx, Cy, Ox, Oy, Ow, Oh : integer ) : boolean;
BEGIN;
if (Ox + (Ow div 2) >= Cx - (CamW div 2)) and
(Ox - (Ow div 2) <= Cx + (CamW div 2)) and
(Oy + (Oh div 2) >= Cy - (CamH div 2)) and
(Oy - (Oh div 2) <= Cy + (CamH div 2)) then Result := true
else Result := false;
END;
2) Если объект попадает в камеру - отрисовать его, переведя МИРОВЫЕ координаты в КАМЕРНЫЕ.
XCam := Ox - Cx + (CamW div 2);
YCam := Oy + Cy + (CamH div 2);
Камерные координаты - это координаты относительно левого-верхнего угла экрана - тоесть обычные экранные координаты.
Вот сы получили XCam и YCam - экранные координаты центра нашего объекта далее рисуем его ;)
Вот и все, а если нужно чтобы камера двигалась плавно (читай - с ускорением) нужно будет просто задать к координате камеры еще и скорость и ускорение.
Вот и все ;)
← →
dRake (2004-12-07 14:03) [4]Пусть у нас поле (мир) A х B пикселей.
Пусть область вывода графики (камера) - CamW x CamH пикселей.
Вот эта камера будет перемещаться по миру и выводить только те объкты которые в нее попадают.
Для этого надо:
1) Задать точку которая будет определять положение камеры (у меня она задает центр, так удобнее, можно например задавать координату левого-верхнего угла камеры (ведь она - прямоугольник с известными размерами)
Для вывода графики надо:
1) Проверить, попадает ли объект в камеру.
Сx, Cy - координаты центра камеры
Ox, Oy - координаты центра объекта
Ow, Oh - ширина и высота обекта (объект - прямоугольник)
FUNCTION CamPass( Cx, Cy, Ox, Oy, Ow, Oh : integer ) : boolean;
BEGIN;
if (Ox + (Ow div 2) >= Cx - (CamW div 2)) and
(Ox - (Ow div 2) <= Cx + (CamW div 2)) and
(Oy + (Oh div 2) >= Cy - (CamH div 2)) and
(Oy - (Oh div 2) <= Cy + (CamH div 2)) then Result := true
else Result := false;
END;
2) Если объект попадает в камеру - отрисовать его, переведя МИРОВЫЕ координаты в КАМЕРНЫЕ.
XCam := Ox - Cx + (CamW div 2);
YCam := Oy + Cy + (CamH div 2);
Камерные координаты - это координаты относительно левого-верхнего угла экрана - тоесть обычные экранные координаты.
Вот сы получили XCam и YCam - экранные координаты центра нашего объекта далее рисуем его ;)
Вот и все, а если нужно чтобы камера двигалась плавно (читай - с ускорением) нужно будет просто задать к координате камеры еще и скорость и ускорение.
Вот и все ;)
← →
dRake (2004-12-07 14:04) [5]Пусть у нас поле (мир) A х B пикселей.
Пусть область вывода графики (камера) - CamW x CamH пикселей.
Вот эта камера будет перемещаться по миру и выводить только те объкты которые в нее попадают.
Для этого надо:
1) Задать точку которая будет определять положение камеры в мировых координатах (у меня она задает центр, так удобнее, можно например задавать координату левого-верхнего угла камеры (ведь она - прямоугольник с известными размерами)
Для вывода графики надо:
1) Проверить, попадает ли объект в камеру.
Сx, Cy - координаты центра камеры
Ox, Oy - координаты центра объекта
Ow, Oh - ширина и высота обекта (объект - прямоугольник)
FUNCTION CamPass( Cx, Cy, Ox, Oy, Ow, Oh : integer ) : boolean;
BEGIN;
if (Ox + (Ow div 2) >= Cx - (CamW div 2)) and
(Ox - (Ow div 2) <= Cx + (CamW div 2)) and
(Oy + (Oh div 2) >= Cy - (CamH div 2)) and
(Oy - (Oh div 2) <= Cy + (CamH div 2)) then Result := true
else Result := false;
END;
2) Если объект попадает в камеру - отрисовать его, переведя МИРОВЫЕ координаты в КАМЕРНЫЕ.
XCam := Ox - Cx + (CamW div 2);
YCam := Oy + Cy + (CamH div 2);
Камерные координаты - это координаты относительно левого-верхнего угла экрана - тоесть обычные экранные координаты.
Вот сы получили XCam и YCam - экранные координаты центра нашего объекта далее рисуем его ;)
Вот и все, а если нужно чтобы камера двигалась плавно (читай - с ускорением) нужно будет просто задать к координате камеры еще и скорость и ускорение.
Вот и все ;)
← →
dRake (2004-12-07 14:07) [6]Во я нахреначил ;)
Лаги сервака :(
← →
.cpp (2004-12-09 10:08) [7]Пишу я с DelphiX.
Сейчас попробую этот пример.
← →
dRake (2004-12-09 12:25) [8]Это общие принципы
Еще забыл добавить...
Если ландшафт у тебя тайлами - то заливка ландшафта...
CamX, CamY - координаты центра камеры.
PROCEDURE FillLandscape(CamX, CamY : integer);
CONST
TileW = 256; // Ширина тайла
TileH = 256; // Высота тайла
CameraW = 1024; // Ширина области вывода камеры
CameraH = 768; // Высота области вывода камеры
VAR
tX, tY : integer;
BEGIN;
tX := -(CamX - (CamX div TileW)*TileW) - TileW;
repeat
inc(tX, TileW);
tY := -(CamY - (CamY div TileH)*TileH) - TileH;
repeat
inc(tY, TileH);
{ А здесь отрисовываешь тайл, с координатами левого верхнего угла - tX, tY}
until (tY + TileH >= CameraH);
until (tX + TileW >= CameraW);
END;
← →
.cpp (2004-12-11 20:50) [9]Реализовал - работает вообще отлично (и вверх и вниз).
Но работает ПРАВИЛЬНО только, если я использую сразу одну ЦЕЛЬНУЮ большую карту, т.е. большая карта сразу нарисована, и не собирается из отдельных маленьких карт. Следовательно и координата центра тоже одна.
------------------------------------------------------------
Если же я собираю карту из маленьких подкарт (тайлов), каждая из которых имеет координаты центра (их я занёс в массивы). То возникает проблемка (трудно объяснить):
(движение осуществляю пока по горизонтали)
есть два тайла карта_1 и карта_2.
Двигаюсь (например вправо). Карта_1 первой попадает в камеру и плавно сдвигается (правильно), но как только в камеру попадает карта_2, то карта_1 замирает (неправильно), а сдвигаться начинает карта_2 (правильно).
Не могу понять почему, если обе карты попадают в камеру, то сдвигается только та которая попала в камеру последней. Хотя должны две.
Продозриваю, что ошибка в прорисовке.
Посмотрите пожалуйста этот фрагмент кода:
-------------------------------------
{для метода отвечающего за прорисовку}
for i := 0 to 1 do begin // проверяет две карты на возможность попадания в камеру
Ox1 := map_x[i]; // запоминает координаты центра
Oy1 := map_y[i];
if (CamPass( Cx1, Cy1, Ox1, Oy1, Cw, Ch)) then begin
XCam := Ox1 - Cx1 + (CamH div 2);
YCam := Oy1 + Cy1 + (CamH div 2);
DXImageList2.Items[i].Draw(DXDraw1.Surface, XCam, 0, 0);// СКОРЕЕ ВСЕГО ЗДЕСЬ ОШИБКА
end;
end;
← →
dRake © (2004-12-12 00:10) [10]2 *.cpp
Я ж постом выше написал про заливку тайлами :)
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c