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

Вниз

Реализация карты (2D )   Найти похожие ветки 

 
Просто_Я   (2006-02-23 18:59) [0]

Вот хочу написать бродилку (двухмерную, вид сверху (Вроде GTA1)). Использую DelphiX.
Вот как лучше сделать карту и как лучше ее "двигать". Т.е я нажимаю вперед и как показать новую часть карты (которую я начал видеть), ведь не перерисовывать же ее всю.
Объяснил как мог. Заранее спасибо.


 
KreeS ©   (2006-02-23 19:18) [1]

вот что-то типа такого...

type
 Camera = record
   X, Y, //верхний-левый угол камеры на карте
   W, H, // ширина, высота камеры (все в ячейках)
   Speed: Integer;
 end;

там где отрисовываешь карту...
for i := Camera.Y to Camera.Y+Camera.H do
 for j := Camera.X to Camera.X+Camera.W do
   нарисовать_ячейку(i, j);

а когда жмешь на стрелки делай...
Camera.X := Camera.X + Camera.Speed;

екарный бабай, да примеров везде навалом! :)


 
grisme ©   (2006-02-23 20:02) [2]

Предлагаю свой пример: делишь всю карту(картинка, допустим) на куски. И эти куски подгружаешь по степени надобности...

000
0X0
000

X-кусок, который сейчас виден. 0-зона которая хранится в памяти(для устранения дерганности при подгрузе). Так и делается...


 
Просто_Я   (2006-02-23 20:53) [3]

Подгружая карту, как в [1], мы не пользуемся тем, что у нас уже отрисована большая часть карты и вместо полоски в несколько пикселей рисуем большой участок. Нельзя ли использовать это преимущество?
Или я опять торможе не по-детски? :)


 
KreeS ©   (2006-02-23 21:09) [4]

Не пойму про что ты?

PS. В моем примере карта не подгружается, а рисуется прямоугольная область ячеек размером с камеру из уже загруженной карты, находящейся в двумерном массиве в памяти. Надеюсь это понятно? :)


 
n0p ©   (2006-02-23 21:12) [5]

Можно конечно всё, но при этом мы будем перемещать изображение, что тоже не самый быстрый вариант (хотя конечно быстрее), а ты ведь хочешь сделать подобие гта и поэтому изображение может менятся (проехала машина или изометрические здания стали выглядеть по другому) и такие изменения сложно уловить и "дорисовать".


 
KreeS ©   (2006-02-23 22:33) [6]

Естественно, надо перерисовывать весь экран поновой в каждом кадре, подругому сделать не получится, ведь кроме едущих машин есть еще и анимация. К тому же ИМХО нет разницы по скорости в рисовании картинки размером 800х600 одним куском сразу или сотней кусков, но поочереди.


 
grisme ©   (2006-02-24 05:07) [7]


> куском сразу или сотней кусков, но поочереди.


Ну это если ВСЕ куски рисовать. А нах нам рисовать их ВСЕ?=) Можно не рисовать невидимые. =)


 
SDV ©   (2006-02-24 10:10) [8]

Обычно карта хранится в двумерном массиве записей и выводится кускаим(тайлами) размером 32x32, 64x64 и т.д. При скролле экрана проще перерисовать всю карту. Естественно нужно предусмотреть алгоритм отсечений тех тайлов, которые не входят в границы экрана. А вообще все объекты на экране лучше перерисовывать постоянно в бесконечном цикле, иначе очень трудно предусмотреть все возможные изменения(например движние курсора). Хотя по своему опыту скажу, что DelphiX для этих целей не всегда подходит, на некоторых видеокартах начинаются необъяснимые тормоза именно  
при выводе большого количества тайлов.


 
Unsigned ©   (2006-02-24 10:35) [9]


>  К тому же ИМХО нет разницы по скорости в рисовании картинки
> размером 800х600 одним куском сразу

ИМХО  разница как раз есть, 1 вариант быстрее ( ну в ДД так точно есть).
Я когда-то делал примерно так как предложил KreeS в посте [1]. По моему вполне нормальное решение.

> Естественно, надо перерисовывать весь экран поновой в каждом
> кадре, по-другому сделать не получится

Ну конечно можно еще попробовать реализовать технологию DirtyRects, но там действительно надо будет помучаться, и делать это стоит только для довольно слабых машин.


 
Просто_Я   (2006-02-24 12:57) [10]

Ну с ГТА я сравнил, конечно, зря -- еще не настолько силен (совсем не настолько). Буду действовать, как было сказано в [1]. Но вот вопрос: У меня есть спрайт персонажа + спрайты других людей и спрайт фона.
Вот отрисовывая карту мне нужно, по-моему, изменять этот спрайт (или можно проще?) и обращаться к нему для рисования, так вот как это сделать, ведь у него, вроде, нет свойства canvas и как мне рисовавать на нем? Да и других людей двигать с фоном тоже надо.  Хотя, вот сейчас понял -- следует создать какие-нибудь глобальные координаты для каждого объекта? Но основной вопрос, все-таки, как перерисовывать фон (именно технически, идею вроде уловил)?
PS И еще, если можно, дайте ссылку где посмотреть исходники несложных игр такого типа.
Огромное спасибо


 
KreeS ©   (2006-02-24 16:23) [11]

Если ты пишешь на ДелфиХ, то особой запарки у тебя быть не должно. Почитай инфу или справку по ней, там есть встроенные средства и для карты и для спрайтов и вообще для всего, что может потребоваться игре подобного уровня, изобретать тебе ничего не придется. Исходники были на этом сайте или на http://delphigfx.mastak.ru/



Страницы: 1 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
2-1165557263
Roman_ln
2006-12-08 08:54
2006.12.24
Есть ли функция посчета одинаковых элементов в списке ListBox


11-1130485465
nester
2005-10-28 11:44
2006.12.24
Как в EditBox заменить символ для ввода пароля?


9-1140710341
Просто_Я
2006-02-23 18:59
2006.12.24
Реализация карты (2D )


15-1165172526
Kolan
2006-12-03 22:02
2006.12.24
Стандартные паттерны в BDS - есть ли они?


11-1142205500
rainstuff
2006-03-13 02:18
2006.12.24
Вопрос по классам KOL...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский