Tehniksie jautājumi saistībā ar Terrain

Vēlies radīt spēli, bet nezini ar ko sākt? Sperot pirmos soļus, vari meklēt padomu šeit
Post Reply
Message
Author
CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Tehniksie jautājumi saistībā ar Terrain

#1 Post by CodeWolf » 03 Mar 2012, 15:06

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.
:?
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

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

#2 Post by bubu » 03 Mar 2012, 15:33

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ā?

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

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

#3 Post by CodeWolf » 03 Mar 2012, 18:02

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..
//OpenGL

User avatar
sunder
Posts: 18
Joined: 16 Feb 2012, 11:06

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

#4 Post by sunder » 03 Mar 2012, 20:55

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.

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

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

#5 Post by bubu » 03 Mar 2012, 21:10

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.

User avatar
sunder
Posts: 18
Joined: 16 Feb 2012, 11:06

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

#6 Post by sunder » 03 Mar 2012, 21:24

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ē
                }
            }


User avatar
kristapuciitis
Posts: 163
Joined: 03 Jun 2011, 14:22

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

#7 Post by kristapuciitis » 03 Mar 2012, 21:41

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;
Gooby pls

Post Reply

Return to “Iesācējiem / For beginners”