Главная страница
    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.48 MB
Время: 0.039 c
4-1107272219
Tria
2005-02-01 18:36
2005.03.13
Иконка приложения. Как сделать прозрачной?


1-1109409678
Saint-Virus
2005-02-26 12:21
2005.03.13
Если из буфера вставить текст в Tedit, появляются знаки вопроса


1-1109702829
quickblack
2005-03-01 21:47
2005.03.13
Пауза в программе


1-1109694502
mic_2000
2005-03-01 19:28
2005.03.13
Как в событии FormCreate главной формы можно завершить приложение


6-1105307468
Новичек
2005-01-10 00:51
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский