Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Скроллинг экрана   Найти похожие ветки 

 
.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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1107330190
eger'
2005-02-02 10:43
2005.03.13
Как выташить значени поля из другой таблицы соеденив его...


14-1108885021
boriskb
2005-02-20 10:37
2005.03.13
Ужастик


1-1109267295
Fenik
2005-02-24 20:48
2005.03.13
Память, занимаемая массивом, содержащим дин. массивы.


1-1109277013
XMAN
2005-02-24 23:30
2005.03.13
On(ScreenSaver)


4-1106906105
grigory
2005-01-28 12:55
2005.03.13
Послать сообщение CheckBox у!