:: PlayerAdvance.org ::  

Pr嶰嶮ent   :: PlayerAdvance.org :: > :: Forums H嶵erg廥 :: > 無ibrary

無ibrary Official 無ibrary forum (English / Fran蓷is)

Publicit

R廧onse
 
Outils de la discussion Modes d'affichage
Vieux 07/04/2008, 21h40   #1
morukutsu
Membre
 
Date d'inscription: 20/03/2007
Localisation: Dijon
Messages: 36
Par d嶨aut R嶰uperer un pixel sur une map et question sur la Vram

Salut @ tous
Dans le cadre de la cr嶧tion d'un jeu, j'aimerai bien savoir comment r嶰up廨er la couleur d'un pixel sur une map. En fait, ce serait pour g廨er 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蔞n 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 彋endre 256ko cette vram j'ai fait :
Citation:
ulSetTexVramParameters(UL_BANK_A | UL_BANK_B , VRAM_A, 256 << 10);
Mais en traficotant un peu j'ai essay :
Citation:
ulSetTexVramParameters(UL_BANK_A | UL_BANK_B | UL_BANK_C | UL_BANK_D , VRAM_A, 512 << 10);
Ce qui th廩riquement 彋end la Vram 512ko, ce qui serait formidable .

Est-ce que ce bout de code est valable ?
Est-ce que 蓷 peut poser des probl鋗es avec la Palib que j'utillise en m瘱e temps ?

Merci d'avance !
__________________
Mon DevBlog
morukutsu est d嶰onnect   R廧onse avec citation

Publicit

Vieux 07/04/2008, 22h26   #2
Arialia
Elite
 
Date d'inscription: 10/04/2006
Localisation: Pays de la moutarde
Messages: 901
Par d嶨aut

Citation:
Envoy par morukutsu Voir le message
Salut @ tous
Dans le cadre de la cr嶧tion d'un jeu, j'aimerai bien savoir comment r嶰up廨er la couleur d'un pixel sur une map. En fait, ce serait pour g廨er 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蔞n 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 彋endre 256ko cette vram j'ai fait :


Mais en traficotant un peu j'ai essay :

Ce qui th廩riquement 彋end la Vram 512ko, ce qui serait formidable .

Est-ce que ce bout de code est valable ?
Est-ce que 蓷 peut poser des probl鋗es avec la Palib que j'utillise en m瘱e temps ?

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

tu ferais tout en 痞ib je dis pas mais avec la PAlib 蓷 risque de coincer
__________________
Mon blog de dev - - Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fain嶧nt : il d彋este refaire la m瘱e chose, il fait donc des fonctions
Il est impossible de tout savoir
28.59848% au Geek Test
Arialia est d嶰onnect   R廧onse avec citation
Vieux 07/04/2008, 22h46   #3
morukutsu
Membre
 
Date d'inscription: 20/03/2007
Localisation: Dijon
Messages: 36
Par d嶨aut

Ouais, c'est bien ce que je me disais
__________________
Mon DevBlog
morukutsu est d嶰onnect   R廧onse avec citation
Vieux 07/04/2008, 23h02   #4
Brunni
Super Mod廨ateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
Par d嶨aut

Clair, si tu r廥erves les 512k alors plus rien pour PALib...
Brunni est d嶰onnect   R廧onse avec citation
Vieux 07/04/2008, 23h29   #5
morukutsu
Membre
 
Date d'inscription: 20/03/2007
Localisation: Dijon
Messages: 36
Par d嶨aut

Okay merci

Et sinon vous avez une fonction/aide pour r嶰up廨er la couleur d'un pixel sur une map ?
__________________
Mon DevBlog
morukutsu est d嶰onnect   R廧onse avec citation
Vieux 08/04/2008, 08h34   #6
Mollusk
Membre confirm
 
Date d'inscription: 10/11/2005
Messages: 1 037
Par d嶨aut

Et aussi, si tu r廥erves 512ko tu peux pas faire de bi-嶰ran avec uLib puisque 蓷 n嶰essite d'avoir les bank C et D r廥erv嶪 pour 蓷...

J'ai pas de code sous la main pour la couleur du pixel, mais tu as 蓷 dans le wiki PAlib il me semble : r嶰up廨er ta position dans la map, chopper le num廨o de la tile, et ensuite r嶰up廨er le pixel. Ca sera pas le m瘱e code pour uLib mais le principe reste le m瘱e
Mollusk est d嶰onnect   R廧onse avec citation
Vieux 08/04/2008, 09h37   #7
morukutsu
Membre
 
Date d'inscription: 20/03/2007
Localisation: Dijon
Messages: 36
Par d嶨aut

Citation:
Envoy par Mollusk Voir le message
Et aussi, si tu r廥erves 512ko tu peux pas faire de bi-嶰ran avec uLib puisque 蓷 n嶰essite d'avoir les bank C et D r廥erv嶪 pour 蓷...
Je suis en mono 嶰ran ulib et le 2鋗e est g廨 par la PAlib.

Citation:
Envoy par Mollusk Voir le message
J'ai pas de code sous la main pour la couleur du pixel, mais tu as 蓷 dans le wiki PAlib il me semble : r嶰up廨er ta position dans la map, chopper le num廨o de la tile, et ensuite r嶰up廨er le pixel. Ca sera pas le m瘱e code pour uLib mais le principe reste le m瘱e
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幯廨al 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.

Code:
//tileX, tileY, img->sizeX doivent 皻re 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嶪s
	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 蓷 va
	dX = (m->scrollX >> tX) % m->mapSizeX;
	mY = (m->scrollY >> tY) % m->mapSizeY;

	//Pour parer au modulo n嶲atif
	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鋨e 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鋨e 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;
}
__________________
Mon DevBlog
morukutsu est d嶰onnect   R廧onse avec citation
Vieux 09/04/2008, 02h45   #8
morukutsu
Membre
 
Date d'inscription: 20/03/2007
Localisation: Dijon
Messages: 36
Par d嶨aut

Ouf, en gal鋨ant un peu (beaucoup) j'ai r徼ssi
Comme quoi, parfois veiller tard apporte du bon. Sur ce je vais me coucher XD

Merci
__________________
Mon DevBlog
morukutsu est d嶰onnect   R廧onse avec citation
R廧onse

Liens sociaux

Publicit



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invit(s))
 
Outils de la discussion
Modes d'affichage

R銶les de messages
Vous ne pouvez pas cr嶪r de nouvelles discussions
Vous ne pouvez pas envoyer des r廧onses
Vous ne pouvez pas envoyer des pi鋃es jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activ嶪s : oui
Les smileys sont activ廥 : oui
La balise [IMG] est activ嶪 : oui
Le code HTML peut 皻re employ : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h37.


丼it par : vBulletin® version 3.7.2
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Tous droits r廥erv廥.
Version fran蓷ise #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince