PDA

Voir la version complète : [µLibrary][Aide] Récuperer un pixel sur une map et question sur la Vram


morukutsu
07/04/2008, 22h40
Salut @ tous ^^
Dans le cadre de la création d'un jeu, j'aimerai bien savoir comment récupérer la couleur d'un pixel sur une map. En fait, ce serait pour gérer les collisions avec cette map.
J'ai bien essayé d'examiner le code sources de la fonction UlDrawMap() mais je n'ai pas trop compris de quelle façon je dois m'y prendre...

Quelqu'un pourrait m'aiguiller sur le sujet ?

Sinon, j'ai une autre question a propos de la Vram.
Pour étendre à 256ko cette vram j'ai fait :
ulSetTexVramParameters(UL_BANK_A | UL_BANK_B , VRAM_A, 256 << 10);

Mais en traficotant un peu j'ai essayé :
ulSetTexVramParameters(UL_BANK_A | UL_BANK_B | UL_BANK_C | UL_BANK_D , VRAM_A, 512 << 10);
Ce qui théoriquement étend la Vram à 512ko, ce qui serait formidable :wub:.

Est-ce que ce bout de code est valable ?
Est-ce que ça peut poser des problèmes avec la Palib que j'utillise en même temps ?

Merci d'avance !

Arialia
07/04/2008, 23h26
Salut @ tous ^^
Dans le cadre de la création d'un jeu, j'aimerai bien savoir comment récupérer la couleur d'un pixel sur une map. En fait, ce serait pour gérer les collisions avec cette map.
J'ai bien essayé d'examiner le code sources de la fonction UlDrawMap() mais je n'ai pas trop compris de quelle façon je dois m'y prendre...

Quelqu'un pourrait m'aiguiller sur le sujet ?

Sinon, j'ai une autre question a propos de la Vram.
Pour étendre à 256ko cette vram j'ai fait :


Mais en traficotant un peu j'ai essayé :

Ce qui théoriquement étend la Vram à 512ko, ce qui serait formidable :wub:.

Est-ce que ce bout de code est valable ?
Est-ce que ça peut poser des problèmes avec la Palib que j'utillise en même temps ?

Merci d'avance !

Si j'ai bien compris c'est que pour les textures ?
Hum ça fait beaucoup, du coup reste plus grand chose pour le reste : sprites, tilebg ...

tu ferais tout en µlib je dis pas mais avec la PAlib ça risque de coincer :hmm:

morukutsu
07/04/2008, 23h46
Ouais, c'est bien ce que je me disais v_v

Brunni
08/04/2008, 00h02
Clair, si tu réserves les 512k alors plus rien pour PALib... ;)

morukutsu
08/04/2008, 00h29
Okay merci ^^

Et sinon vous avez une fonction/aide pour récupérer la couleur d'un pixel sur une map :) ?

Mollusk
08/04/2008, 09h34
Et aussi, si tu réserves 512ko tu peux pas faire de bi-écran avec uLib puisque ça nécessite d'avoir les bank C et D réservée pour ça...

J'ai pas de code sous la main pour la couleur du pixel, mais tu as ça dans le wiki PAlib il me semble : récupérer ta position dans la map, chopper le numéro de la tile, et ensuite récupérer le pixel. Ca sera pas le même code pour uLib mais le principe reste le même ;)

morukutsu
08/04/2008, 10h37
Et aussi, si tu réserves 512ko tu peux pas faire de bi-écran avec uLib puisque ça nécessite d'avoir les bank C et D réservée pour ça...
Je suis en mono écran ulib et le 2ème est géré par la PAlib.

J'ai pas de code sous la main pour la couleur du pixel, mais tu as ça dans le wiki PAlib il me semble : récupérer ta position dans la map, chopper le numéro de la tile, et ensuite récupérer le pixel. Ca sera pas le même code pour uLib mais le principe reste le même ;)
C'est ce que j'ai essayé de faire en m'inspirant du code source de l'ulib mais j'ai du mal a comprendre le code :( .
Quand je code mes jeux en général dans les maps je stocke des indices qui me renvoient vers une liste de structures de tiles. Mais dans son code a partir d'une seule variable u16 il peut en extraire sa position sur le chipset.

//tileX, tileY, img->sizeX doivent être des puissances de deux!
void ulDrawMap(UL_MAP *m)
{
s16 x, y, v, ttX=0, i, sX, sY, tX=0, tY=0, mX, mY, dX, bY, dsX, dsY, flags;
u16 *map = (u16*)m->map;
int bHasPalette = (m->img->paletteID != -1), nDecal = (4 - (m->img->format == GL_RGB4));
int palSize = ul_paletteSizes[m->img->format];

ulSetTexture(m->img);
GFX_COLOR = m->img->tint1;

//Calcule le drawSize s'il n'est pas fourni
if (m->drawSizeX < 0 || m->drawSizeY < 0) {
m->drawSizeX = UL_SCREEN_WIDTH / m->tileX + 1;
if (UL_SCREEN_WIDTH % m->tileX)
m->drawSizeX++;
m->drawSizeY = UL_SCREEN_HEIGHT / m->tileY + 1;
if (UL_SCREEN_HEIGHT % m->tileY)
m->drawSizeY++;
}

dsX = m->drawSizeX, dsY = m->drawSizeY;

//Trouve les puissances de deux optimisées
for (i=3;i<=9;i++) {
if (ttX == 0 && m->img->sysSizeX <= 1 << i)
ttX = i;
if (tX == 0 && m->tileX <= 1 << i)
tX = i;
if (tY == 0 && m->tileY <= 1 << i)
tY = i;
}

sX = m->scrollX & ((1 << tX) - 1);
sY = m->scrollY & ((1 << tY) - 1);

//Hum... un modulo par map à la limite ça va
dX = (m->scrollX >> tX) % m->mapSizeX;
mY = (m->scrollY >> tY) % m->mapSizeY;

//Pour parer au modulo négatif
if (dX < 0) dX += m->mapSizeX;
if (mY < 0) mY += m->mapSizeY;

GFX_BEGIN = GL_QUADS;

switch (m->format) {
case UL_MF_U16:
/* ulVertexUVXY(0, 0, 0xffff, 0);
ulVertexUVXY(0, 16, 0xffff, 16);
ulVertexUVXY(16, 16, 15, 16);
ulVertexUVXY(16, 0, 15, 0);*/
for (y=0;y<dsY;y++) {
//Multiplication => ok
bY = m->mapSizeX * mY;
mX = dX;
for (x=0;x<dsX;x++) {
v = map[bY + mX];

//La première tile est toujours transparente!
if (v) {
//In fact these numbers are signed, but they have to be wrapped as unsigned when negative
u16 u0, v0, x0, y0, x1, y1, u1, v1;

u0 = ((v << tX) & ((1 << ttX) - 1));
v0 = ((v << tX) >> ttX) << tY;
// x0 = (x << tX) - sX;
// y0 = (y << tY) - sY;
x1 = (x << tX) - (sX - m->tileX);
y1 = (y << tY) - (sY - m->tileY);
x0 = x1 - m->tileX;
y0 = y1 - m->tileY;

u1 = u0 + m->tileX;
v1 = v0 + m->tileY;

ulVertexUVXY(u0, v0, x0, y0);
ulVertexUVXY(u0, v1, x0, y1);
ulVertexUVXY(u1, v1, x1, y1);
ulVertexUVXY(u1, v0, x1, y0);
}
mX++;
if (mX >= m->mapSizeX)
mX -= m->mapSizeX;
}
mY++;
if (mY >= m->mapSizeY)
mY -= m->mapSizeY;
}
break;

case UL_MF_U16_GBA:
for (y=0;y<dsY;y++) {
//Multiplication => ok
bY = m->mapSizeX * mY;
mX = dX;
for (x=0;x<dsX;x++) {
v = map[bY + mX];
flags = v & ~0x3ff;
v &= 0x3ff;

//La première tile est toujours transparente!
if (v) {
s16 u0, v0, x0, y0, u1, v1;

u0 = ((v << tX) & ((1 << ttX) - 1));
v0 = ((v << tX) >> ttX) << tY;
x0 = (x << tX) - sX;
y0 = (y<<tY)-sY;

u1 = u0 + m->tileX;
v1 = v0 + m->tileY;

//Mirroir horizontal
if (flags & 0x400) {
int exchg = u0;
u0 = u1;
u1 = exchg;
}

//Mirroir vertical
if (flags & 0x800) {
int exchg = v0;
v0 = v1;
v1 = exchg;
}

//NON-TESTÉ! Support des palettes multiples
if (bHasPalette)
GFX_PAL_FORMAT = ((u32)m->img->paletteID + ((flags >> 12) << palSize)) >> nDecal;

ulVertexUVXY(u0, v0, x0, y0);
ulVertexUVXY(u0, v1, x0, y0 + m->tileY);
ulVertexUVXY(u1, v1, x0 + m->tileX, y0 + m->tileY);
ulVertexUVXY(u1, v0, x0 + m->tileX, y0);
}
mX++;
if (mX >= m->mapSizeX)
mX -= m->mapSizeX;
}
mY++;
if (mY >= m->mapSizeY)
mY -= m->mapSizeY;
}
break;
}

GFX_END = 0;
ul_currentDepth += ul_autoDepth;
}

morukutsu
09/04/2008, 03h45
Ouf, en galèrant un peu (beaucoup) j'ai réussi ^^
Comme quoi, parfois veiller tard apporte du bon. Sur ce je vais me coucher XD

Merci ;)