Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.49 MB
Время: 0.038 c
4-1106632831
SkierMax
2005-01-25 09:00
2005.03.13
Bios


14-1108717649
kai
2005-02-18 12:07
2005.03.13
beeline+gprs+icq+вечером=не коннектится


4-1107097368
s_ser
2005-01-30 18:02
2005.03.13
Поиск уже открытых дочерних окон в MDI


1-1109370824
Германн
2005-02-26 01:33
2005.03.13
EInOutError - Прав ли я, что оно "малополезно"?


14-1108994387
boriskb
2005-02-21 16:59
2005.03.13
С модераторами не спорят!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский