Page 1 of 1

Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 15:06
by CodeWolf
Sveiki. Atkal ir pienācis tas brīdis kad patstāvīgi ar kaut ko netieku galā un nākas griezties pie jums pie jums pēc palīdzības.
Man ir radušās 3 tehniskas problēmas (1 pat būs kā jautājums) bet tos domāju izklāstīt pa vienai atrisinot vienu pēc otras.
1. Ir saistībā ar Terraina(vides) nolasīšanu -ielādēšanu...
Karti smuki izdodas ierakstīt faila un izdodas to arī smuki nolasīt
bet tā nolasot nepārveidot Terrainu soli pa solim bet gan pielāgo to pēc pēdējā nolasītā skaitļa..
Esmu izmeiģinājis 2 nolasīšanas veidus ..Abi no tiem konsole smuki izprintējās.. Liekas ka ar pašu nolasīšanu būtu tā kā viss kārtībā..
Nolasīšanu veicu tā pat kā uzstādīšanu

Code: Select all

void WriteMapToFile()
{
	WMTF.open("WORLD.txt");
	if(WMTF.is_open())
	{
	for(int z = 0; z < _Terrain->length() - 1; z++) 
	{
		for(int x = 0; x < _Terrain->width(); x++) 
		{
			WMTF<<(float)_Terrain->getH(x,z)<<endl;
		}
	}
	WMTF.close();
	}
}

Code: Select all

void SetUpWorld()
{
	ifstream LTFF("WORLD.txt");
	ifstream::pos_type size;
	while(!LTFF.eof())
	{
		LTFF>>(float)SetHFFR;//Nolasam Augstumu
		cout<<SetHFFR<<endl;//Izprintejam konsole
		for(int z = 0; z < _Terrain->length() - 1; z++) 
		{
			for(int x = 0; x < _Terrain->width(); x++) 
			{
				_Terrain->setH(x,z,SetHFFR);
			}
		}
	}
	LTFF.close();
	system("pause");
}
Domāju ka tu varētu būt kāda loop veida funkcija kas to parraksta .. jo pirmstam mēģināju pa daļām rakstīt.. terrains tika izveidots ~ pēc saglabātā tikai tas bija šķelts pa dioganāli.
:?

Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 15:33
by bubu
Te ir arī kāds jautājums, vai arī tu vienkārši mums pastāsti kā tu raksti failā un lasi no faila?
Pie tam rakstīšanu tu korekti veic ciklā, taču lasīšanu nezkapēc dari ārpus cikla, un tad to vērtību piešķir visiem terraina punktiem. Kāpēc tā?

Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 18:02
by CodeWolf
Nu var pieņemt ka tas bija jautājums :D
mhm Izdevas (: nedaudz paediteju kodu eof vieta uzliku vienk if(..is_open) tad visu ieliku ciklā un ieladejas (:
okej 2 jautājums
Sen sen stradajot pie tile map editora jautāju Snake5 par off seta neatspoguļošanu (jeb vienk. to ka nerāda to ko es neredzu attiecīgajā laukumā kuru es izvelos)
jo tagad ~ pie 150x150 -> 7500Δ->22500 punktiem(vertiem) fps nokrītas līdz 32fps..
Zinu ka sneika dotā formula nebija gara .. vai sareržģīta bet diemžēl to nespēju atcerēties.. :?
Vai kāds nevarētu lūdzu iedot to formulu/ algoritmu..? Ofseta nerādīšanai+ vai maz tas stradatu priekš punktiem un parejam daļām?
jo toreiz tie bija kvadrāti.. bet tagad vertu virkne kur katrs verts ir no svara..

Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 20:55
by sunder
Nu ja pareizi sapratu, tad Tu gribi zīmēt tikai tos tile, kas atrodas ekranā?

Mans variants kā es to biju darījis. Gan jau ka ir kāds labaks variants, bet nu var arī šitas noderēt

Tā visticamāk ir 2d karte vai ne? Tad tev ir vajadzīga kautkāda cameras klase, vai kas tāds, kurai kurai ir koordinātes, vai kvadrats, pe kā tu vari noteikt kur tava 2d pasaulē atrodas katrs kameras stūris. Lai vienkāršāk izskaidrot:
Pieņemot, ka kameras malas tiek apzīmētas ar floatiem: posLeft, posRight, posTop, posBot, kur posLeft ir kameras kreisās malas koordinatas utt...
Pieņemot, ka visi tile glabajas 2d array
Pieņemot, ka katram tile ir viņa koordinatas positionX un positionY

Mīnus ir tāds, ka tā pat loop'o cauri visam arraj, bet katrā zinā zīmē tikai to kas ir ekrānā.
tākā pseido kods, vai kas tamlīdzīgs....

Code: Select all

for(int z = 0; z < tileSkaitsZ ; z++) 
{
    for(int x = 0; x < tileSkaitsX; x++) 
    {
        if(tile[x,z].positionX > cam.posLeft && tile[x,z].positionX < cam.posRight) //ja tile positionX ir starp ekrana kreiso un labo malu
            if(tile[x,z].positionZ > cam.posTop && tile[x,z].positionZ < cam.posBot) //ja tile positionZ ir starp ekrāna augšu un apakšu
                zīmē(tile[x,z]); //tad viņu zīmē
    }
}
kkur if'os iespējams ir japieskaita tile garums/platums atkarībā no tā kurā vietā iekš tile ir viņa position(vidū, vai kreisajā augšējajā stūrī, vai kur citur)

ja ir zināmi citi parametri, ka piemeram no kura punkta sākas visi tile(parasti 0;0) un cik viņi ir lieli, tad var arī uztaisīt tā, ka neloop'o cauri visam, bet pirms ieiešanas for ciklos nosaka no kura līdz kuram tile ir jazīmē x un y, un ta nav javeic arī atsevišķas parbaudes katram tile iekš cikliem, bet zīme visus kuriem loop'o cauri. Varbūt Tev noderēs.

Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 21:10
by bubu
Vienkāršāk būtu noteikt kreisā augšējā taila koordināti, un apakšējā labējā, un tad vienkārši taisīt ciklu pa x/y starp šīm koordinātēm. Tad būtu nevis if'i iekš for cikliem (kas nav labi), bet gan divi pliki for cikli.

Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 21:24
by sunder
Nu es to pašu arī biju pieminejis beigās, tik es nemāceju skaidri pateikt savu domu.

Izgriezu gabalu no viena veca savēja. Tas gan ir C#, bet nu saprast domāju vienalga varēsi galveno domu.

Code: Select all

            int lowX = (int)(cam.Pos.X - (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / tileSize - 1;   //lowest(left side) X tile in screen
            int highX = (int)(cam.Pos.X + (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / tileSize + 1;  //highest(right side) X tile in screen
            int lowY = (int)(cam.Pos.Y - (GlobalVar.graph.GraphicsDevice.Viewport.Height / 2)) / tileSize - 1;  //lowest(top side) Y tile in screen
            int highY = (int)(cam.Pos.Y + (GlobalVar.graph.GraphicsDevice.Viewport.Height / 2)) / tileSize + 1; //highest(bottom side) Y tile in screen

            for (int y = lowY; y < highY; y++)
            {
                for (int x = lowX; x < highX; x++)
                {
                    Vector2 tilePos = new Vector2(x * tileSize, y * tileSize);
                    GlobalVar.spriteBatch.Draw(tiles[x, y].Texture, new Rectangle((int)tilePos.X, (int)tilePos.Y, tileSize, tileSize), Color.White); //būtība šeit zīmē
                }
            }


Re: Tehniksie jautājumi saistībā ar Terrain

Posted: 03 Mar 2012, 21:41
by kristapuciitis
sunder wrote:

Code: Select all

            int lowX = (int)(cam.Pos.X - (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / tileSize - 1;   //lowest(left side) X value in screen
            int highX = (int)(cam.Pos.X + (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / tileSize + 1;  //highest(right side) X value in screen
            int lowY = (int)(cam.Pos.Y - (GlobalVar.graph.GraphicsDevice.Viewport.Height / 2)) / tileSize - 1;  //lowest(top side) Y value in screen
            int highY = (int)(cam.Pos.Y + (GlobalVar.graph.GraphicsDevice.Viewport.Height / 2)) / tileSize + 1; //highest(bottom side) Y value in screen
Es darīju tā, kā piedāvāja pats Maikrosofts savā Platformer:

Code: Select all

int lowX = (int)floor((cam.Pos.X - (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / TileWidth);
int rightTile = (int)ceil((cam.Pos.X + (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / TileWidth) - 1;
int topTile = (int)floor((cam.Pos.Y -  (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / TileHeight);
int bottomTile = (int)ceil((cam.Pos.Y + (GlobalVar.graph.GraphicsDevice.Viewport.Width / 2)) / Tile.Height) - 1;