|
Здравствуйте Гость ( Вход | Регистрация ) Доступ из РоссииДля сохранения достпа из России к сайту и форуму GBX
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() |
Спрайты, Где и что почитать?
| ElVovan |
Воскресенье, 17 июня 2007, 23:34
Отправлено
#1
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Что-то в сети негусто информации по спрайтам, ни в одном из туториалов ничего не нашёл, ни в дабл.ко.нз, ни в туториале ЛирыНуны, ни в девсцене.
Может кто может рассказать про программирование спрайтов на ДС или дать ссылку на полезный документ.... -------------------- |
| PokePerevod |
Понедельник, 18 июня 2007, 11:05
Отправлено
#2
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
http://www.palib.info/wiki/doku.php?id=day4
...это не совсем прямой ход, но учитывая, что palib есть в исходниках всегда можно копнуть глубже... (графику можно конвертить с помощью gfx2gba (есть в комплекте devkit'a)) |
| ElVovan |
Понедельник, 18 июня 2007, 11:15
Отправлено
#3
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Блин, я не использую палиб и не такой крутой программист, чтоб понимать чужие исходники. Но всё ж гляну, может что прояснится...
-------------------- |
| PokePerevod |
Понедельник, 18 июня 2007, 11:36
Отправлено
#4
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
QUOTE (ElVovan @ Понедельник, 18 июня 2007, 11:15) Блин, я не использую палиб... Вот и здря... ...palib как раз для не крутых программистов в принципе, можно скачать вот такую книженцию: http://www.patatersoft.info/Manual.pdf там есть есть то, что тебе нужно (и вроде без palib'a) |
| ElVovan |
Вторник, 26 июня 2007, 23:41
Отправлено
#5
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Аааахх.... Не работает почему-то....
CODE #include<nds.h> #include<string.h> u8 redTile[64] = //Это тайл, которым заполняется экран { 1,1,1,1,1,1,1,1, 1,2,2,2,2,2,2,1, 1,2,2,2,2,2,2,1, 1,2,2,2,2,2,2,1, 1,2,2,2,2,2,2,1, 1,2,2,2,2,2,2,1, 1,2,2,2,2,2,2,1, 1,1,1,1,1,1,1,1 }; u8 greenTile[64] = //А это теперь спрайт { 3,3,3,3,3,3,3,3, 3,4,4,4,4,4,4,3, 3,4,5,5,5,5,4,3, 3,4,5,5,5,5,4,3, 3,4,5,5,5,5,4,3, 3,4,5,5,5,5,4,3, 3,4,4,4,4,4,4,3, 3,3,3,3,3,3,3,3 }; int main(){ int id; SpriteEntry *spriteEntry = new SpriteEntry[128]; SpriteRotation *spriteRotation = (SpriteRotation*)spriteEntry; // Дальше часть кода не трогаем т.к. заполнение тайлами работает нормально REG_POWERCNT = POWER_ALL_2D; DISPLAY_CR = MODE_0_2D | DISPLAY_BG0_ACTIVE; BG0_CR = BG_32x32 | BG_COLOR_256 | BG_MAP_BASE(0) | BG_TILE_BASE(1); VRAM_A_CR = VRAM_ENABLE | VRAM_A_MAIN_BG; BG_PALETTE[1] = RGB15(31,0,0); BG_PALETTE[2] = RGB15(0,31,0); SPRITE_PALETTE[3]=RGB15(0,0,31);//Заполняем SPRITE_PALETTE[4]=RGB15(0,31,31);//палитру SPRITE_PALETTE[5]=RGB15(31,31,31);//для спрайта memcpy((void*)BG_TILE_RAM(1), redTile, 64); memcpy((void*)(BG_TILE_RAM(1)+64), greenTile, 64); for(int i=0;i<32*32;i++){ (*(unsigned short*)(void*)(BG_MAP_RAM(0)+i*2))=0; } // Вот оно и заполнилось тайлами id=8; //Идентификатор, насколько я понял он произволен //Далее идёт начальная инициализация, скопировано с мануала for (int i = 0; i < 128; i++) { spriteEntry[i].attribute[0] = ATTR0_DISABLED; spriteEntry[i].attribute[1] = 0; spriteEntry[i].attribute[2] = 0; } for (int i = 0; i < 32; i++) { spriteRotation[i].hdx = 256; spriteRotation[i].hdy = 0; spriteRotation[i].vdx = 0; spriteRotation[i].vdy = 256; } //Конец инициализации //Устанавливаем атрибуты спрайта spriteEntry[0].attribute[0] = ATTR0_COLOR_256 | ATTR0_ROTSCALE | 128; spriteEntry[0].attribute[1] = ATTR1_ROTDATA(0) | ATTR1_SIZE_64 | 96; spriteEntry[0].attribute[2] = id; //Установили dmaCopy(greenTile, &SPRITE_GFX[id * 16], 64); //Копируем спрайтик DC_FlushAll();//Обновляем (updateOAM) dmaCopy(spriteEntry,OAM, 128*sizeof(SpriteEntry));//Обновляем (updateOAM) while(1); return(0); } -------------------- |
| PokePerevod |
Среда, 27 июня 2007, 11:39
Отправлено
#6
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
мне почему-то кажется, что ты забыл "разрешить" спрайты при инициализации граф. режима...
думается тут не хватает еще or'a ...должно быть что-то типа: DISPLAY_CR = MODE_0_2D | DISPLAY_BG0_ACTIVE | DISPLAY_SPR_ACTIVE; кстати, примеры самой libnds не пробовал смотреть? типа ..\devkitPro\examples\nds\Graphics\2D\Sprite_Bitmap\ P.S. все равно PAlib проще |
| ElVovan |
Четверг, 28 июня 2007, 19:57
Отправлено
#7
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Что-то оно не заработало с этой дополнительной опцией.
А палиб я не использую, поскольку моей целью является не просто написать какую-нибудь игрушку под ДСку, но ещё и в достаточной степени изучить архитектуру платформы. Я даже при инициализации графического режима не вызываю соответствующие функции библиотеки либндс, а записываю значения в соответствующие регистры памяти. В идеале хотелось бы даже отказаться от либндс и использовать только хедеры с константами и структурами. Сперва, правда, необходимо, чтоб у меня хоть как-то что-то работало, вопрос про приведнный выше код остаётся открытым. И ещё: как установить прозрачный цвет? Сообщение отредактировал ElVovan - Четверг, 28 июня 2007, 19:58 -------------------- |
| Puyo Puyo |
Пятница, 29 июня 2007, 13:23
Отправлено
#8
|
|
Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 103 Регистрация: 01 июля 2006 Пользователь №: 16 904 ![]() ![]() |
Хочешь от всех си`шных библиотек отказаться? Хардкор. Ну удачи.
BIT(15) отвечает за альфа канал цвета. -------------------- ![]() |
| PokePerevod |
Пятница, 29 июня 2007, 16:52
Отправлено
#9
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
QUOTE (ElVovan @ Четверг, 28 июня 2007, 19:57) И ещё: как установить прозрачный цвет? в 4bit'ном режиме (0-15 цветов) цвет под номером 0 - прозрачный в 8bit'ном режиме (0-255 цветов) цвет под номером 0 - прозрачный в 16bit'ном режиме (0-32K цветов) цвет под номером 0 - прозрачный (не уверен) [EDIT] и еще раз напомню, сказанное Puyo Puyo - видеопамять (ВСЯ) 16-и битная попробуй использовать dmaCopyHalfWords(...) Сообщение отредактировал PokePerevod - Пятница, 29 июня 2007, 19:27 |
| ElVovan |
Суббота, 30 июня 2007, 13:27
Отправлено
#10
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Нет, от библиотек, в которых реализованы ANSI/ISO функции я отказываться не собираюсь, также не собираюсь отказываться от функций либндс писаных на асме.
По поводу dmaCopyHalfWords(...), там на один аргумент больше, что-то я не нашёл в каком h'е эта функция описана, непонятно что необходимо передавать в качестве первого восьмибитного аргумента... -------------------- |
| PokePerevod |
Суббота, 30 июня 2007, 15:03
Отправлено
#11
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
QUOTE (ElVovan @ Суббота, 30 июня 2007, 13:27) По поводу dmaCopyHalfWords(...), там на один аргумент больше, что-то я не нашёл в каком h'е эта функция описана, непонятно что необходимо передавать в качестве первого восьмибитного аргумента... ..\devkitPro\libnds\include\nds\dma.h CODE static inline void dmaCopyHalfWords(uint8 channel, const void* src, void* dest, uint32 size) { DMA_SRC(channel) = (uint32)src; DMA_DEST(channel) = (uint32)dest; DMA_CR(channel) = DMA_COPY_HALFWORDS | (size>>1); while(DMA_CR(channel) & DMA_BUSY); } Сообщение отредактировал PokePerevod - Суббота, 30 июня 2007, 15:03 |
| ElVovan |
Суббота, 30 июня 2007, 15:32
Отправлено
#12
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Название переменной channel мне ни о чём не говорит, не могу представить что туда передавать надо...
-------------------- |
| PokePerevod |
Суббота, 30 июня 2007, 16:13
Отправлено
#13
|
|
Маньяк ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 256 Регистрация: 05 мая. 2003 Пользователь №: 2 021 ![]() ![]() |
QUOTE (ElVovan @ Суббота, 30 июня 2007, 15:32) Название переменной channel мне ни о чём не говорит, не могу представить что туда передавать надо... число от 0 до 3 читай главу "DMA Transfers" http://neimod.com/dstek/ |
| ElVovan |
Воскресенье, 01 июля 2007, 23:30
Отправлено
#14
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Чёрт.... Спрайт заработал, бэкграунд исчез... И с цветами какая-то ... происходит...
Сейчас... Подумаю... Поаккуратнее в выражениях. Предупреждение. Сообщение отредактировал Kir - Понедельник, 02 июля 2007, 11:38 -------------------- |
| ElVovan |
Понедельник, 02 июля 2007, 22:02
Отправлено
#15
|
![]() Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 118 Регистрация: 02 мая. 2007 Из: Санкт-Петербург Пользователь №: 22 080 ![]() ![]() |
Вот чуток разобрался, с цветом всё ок. А с одновременным отображением спрайтов и бэкграундов пока проблемы.
В коде при распределении ,,банков'' (или ,,банок''?) видеопамяти определённые банки вешаются на определённые графические категории: на спрайты или бэкграунды, так на ДСке отображается тот элемент, который повешен на первый банк. То есть, если я пишу CODE VRAM_A_CR=VRAM_ENABLE|VRAM_A_MAIN_BG; VRAM_B_CR=VRAM_ENABLE|VRAM_B_MAIN_SPRITE; то отображается бэкграунд, а если CODE VRAM_A_CR=VRAM_ENABLE|VRAM_A_MAIN_SPRITE; VRAM_B_CR=VRAM_ENABLE|VRAM_B_MAIN_BG; то отображается спрайт. Собственно сейчас вся проблема состоит в том, чтоб заставить спрайты отображаться поверх бэкграундов. Как это можно сделать? -------------------- |
![]() ![]() |
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
| Упрощённая версия | Сейчас: Ср., 28 окт. 2026, 10:15 |




Воскресенье, 17 июня 2007, 23:34

















