Forums Logo

Здравствуйте Гость ( Вход | Регистрация )

 
Reply to this topicStart new topicStart Poll

Каскадный · [ Стандартный ] · Линейный

> Спрайты, Где и что почитать?

ElVovan
post Воскресенье, 17 июня 2007, 23:34
Отправлено #1


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





Что-то в сети негусто информации по спрайтам, ни в одном из туториалов ничего не нашёл, ни в дабл.ко.нз, ни в туториале ЛирыНуны, ни в девсцене.

Может кто может рассказать про программирование спрайтов на ДС или дать ссылку на полезный документ....


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Понедельник, 18 июня 2007, 11:05
Отправлено #2


Маньяк
****

Группа: Пользователи
Сообщений: 256
Регистрация: 05 мая. 2003
Пользователь №: 2 021





http://www.palib.info/wiki/doku.php?id=day4
...это не совсем прямой ход, но учитывая,
что palib есть в исходниках всегда можно копнуть глубже...

(графику можно конвертить с помощью gfx2gba (есть в комплекте devkit'a))
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Понедельник, 18 июня 2007, 11:15
Отправлено #3


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





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


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Понедельник, 18 июня 2007, 11:36
Отправлено #4


Маньяк
****

Группа: Пользователи
Сообщений: 256
Регистрация: 05 мая. 2003
Пользователь №: 2 021





QUOTE (ElVovan @ Понедельник, 18 июня 2007, 11:15)
Блин, я не использую палиб...

Вот и здря... smile.gif
...palib как раз для не крутых программистов smile.gif

в принципе, можно скачать вот такую книженцию:
http://www.patatersoft.info/Manual.pdf
там есть есть то, что тебе нужно (и вроде без palib'a)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Вторник, 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);
}


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Среда, 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 проще smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Четверг, 28 июня 2007, 19:57
Отправлено #7


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





Что-то оно не заработало с этой дополнительной опцией.
А палиб я не использую, поскольку моей целью является не просто написать какую-нибудь игрушку под ДСку, но ещё и в достаточной степени изучить архитектуру платформы. Я даже при инициализации графического режима не вызываю соответствующие функции библиотеки либндс, а записываю значения в соответствующие регистры памяти. В идеале хотелось бы даже отказаться от либндс и использовать только хедеры с константами и структурами.
Сперва, правда, необходимо, чтоб у меня хоть как-то что-то работало, вопрос про приведнный выше код остаётся открытым.
И ещё: как установить прозрачный цвет?

Сообщение отредактировал ElVovan - Четверг, 28 июня 2007, 19:58


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Puyo Puyo
post Пятница, 29 июня 2007, 13:23
Отправлено #8


Фанат
***

Группа: Пользователи
Сообщений: 103
Регистрация: 01 июля 2006
Пользователь №: 16 904





Хочешь от всех си`шных библиотек отказаться? Хардкор. Ну удачи.
BIT(15) отвечает за альфа канал цвета.


--------------------
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Пятница, 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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Суббота, 30 июня 2007, 13:27
Отправлено #10


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





Нет, от библиотек, в которых реализованы ANSI/ISO функции я отказываться не собираюсь, также не собираюсь отказываться от функций либндс писаных на асме.

По поводу dmaCopyHalfWords(...), там на один аргумент больше, что-то я не нашёл в каком h'е эта функция описана, непонятно что необходимо передавать в качестве первого восьмибитного аргумента...


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Суббота, 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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Суббота, 30 июня 2007, 15:32
Отправлено #12


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





Название переменной channel мне ни о чём не говорит, не могу представить что туда передавать надо...


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PokePerevod
post Суббота, 30 июня 2007, 16:13
Отправлено #13


Маньяк
****

Группа: Пользователи
Сообщений: 256
Регистрация: 05 мая. 2003
Пользователь №: 2 021





QUOTE (ElVovan @ Суббота, 30 июня 2007, 15:32)
Название переменной channel мне ни о чём не говорит, не могу представить что туда передавать надо...

число от 0 до 3 wink.gif
читай главу "DMA Transfers"
http://neimod.com/dstek/
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Воскресенье, 01 июля 2007, 23:30
Отправлено #14


Фанат
***

Группа: Пользователи
Сообщений: 118
Регистрация: 02 мая. 2007
Из: Санкт-Петербург
Пользователь №: 22 080





Чёрт.... Спрайт заработал, бэкграунд исчез... И с цветами какая-то ... происходит...
Сейчас... Подумаю...

Поаккуратнее в выражениях. Предупреждение.

Сообщение отредактировал Kir - Понедельник, 02 июля 2007, 11:38


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ElVovan
post Понедельник, 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;

то отображается спрайт.
Собственно сейчас вся проблема состоит в том, чтоб заставить спрайты отображаться поверх бэкграундов. Как это можно сделать?


--------------------
user posted image
user posted image
user posted image
user posted image
user posted image
user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
 

Упрощённая версия Сейчас: Пт., 11 июля 2025, 09:15
Skin Designed (c) by Rooq.net, All Rights Reserved.