Moi!!
Teen XNA:lla pelimoottoria, mutta XNA ei liity tähän viestiin varsinaisesti. Teen siihen pelimoottoriin grafiikan testauksena kaaos-mapin. Eli siis generoidaan randomilla kaaos. Mutta kun asetan chunk-listaan vertexejä for eachilla, ne eivät jää sinne listaan.
'_map on instanssi Map-oliosta 'Map.chunks on lista MapChunk-structuurista 'käydään kaikki chunkit läpi For Each c As MapChunk In _map.chunks 'vertex list Dim vl As New List(Of VertexPositionColor) 'luodaan vertexit randomilla For i = 1 To 12 vl.Add(New VertexPositionColor(New Vector3(rand.Next(0, 40), rand.Next(0, 40), rand.Next(0, 40)), Color.Red)) Next 'neljä seuraavaa ovat nextin jälkeen taas oletusarvoissaan 'eli primType = TriangleList, startVertex = 0, _buf = Nothing c.vBuffer.primType = rand.Next(0, 3) c.vBuffer.startVertex = 0 c.vBuffer._buf = New VertexBuffer(gd, VertexPositionColor.VertexDeclaration, vl.Count, BufferUsage.None) c.vBuffer._buf.SetData(Of VertexPositionColor)(vl.ToArray()) Next
Nollaat listan jokaisella forin suorituskerralla luomalla sen uudestaan.
Siirrä
Dim vl As New List(Of VertexPositionColor)
ennen foreachia niin toimii.
Se lista pitää nollata. Siis Map.chunks-listaan ei jää ne arvot.
Voisitko nyt selittää kunnolla vielä, millä tavalla olet todennut ongelman? Oletko varma, että tuo lisäyskoodi ajetaan? Missä kohti näet, että verteksejä ei olekaan? Oletko varma, että verteksejä ei ole, vai voiko vika olla jossain muussa (esim. et jostain syystä piirrä niitä, vaikka ne ovat olemassa)? Mitä verteksien lisäyksen ja puuttumisen välissä tapahtuu?
Juuri tällainen ongelma sinun pitäisi itse pystyä ratkaisemaan, kunhan vain seuraat koodia lisäyksestä eteenpäin häviämiseen asti. Kukaan muu ei voi tehdä sitä puolestasi tuon koodinpätkän perusteella. Muuttujat eivät yleensä myöskään muutu itsestään, vaan kaikille muutoksille pitää löytyä jokin selitys omasta koodistasi.
No nyt debuggasin uudestaan koodin ja ne arvot eivät asetu ollenkaan. Eli jos laitan sinne c.vBuffer.startVertex = 4
, niin se pysyy nollana. Olen debugannut ja tutkinut tuon koodin läpi monta kertaa enkä ole löytänyt virhettä.
Katsoin vielä kerran, ettei muualla koodissa ole bugia. Silloin nämä arvot asetuivat mutta heti kun tuli next, ne katosivat.
Katso nyt vielä kerran, suoritetaanko tuota asetusriviä ollenkaan. Siis jos et osaa käyttää debuggeria, laita sinne vaikka jokin MessageBox, jotta varmasti näet tuloksen. Sitten opettele käyttämään debuggeria ja aja vaikka step-tilassa koodia rivi kerrallaan, kunnes löydät kohdan, jossa arvo muuttuu.
Siis nimenomaan menin rivi kerrallaan koko ohjelman. Eli kaikki koodi ajetaan niin kuin pitää, mutta arvot muuttuvat takaisin oletuksiksi Next -rivillä.
Ahaa, listassasi onkin tietueita (Structure) eikä olioita. Siinä tapauksessa arvot todellakin menevät hukkaan tuossa silmukassa, koska silmukka käsittelee aina kopioita listan arvoista. Tämä on erityisen helppo nähdä lukujen kohdalla:
For Each i As Integer In luvut i = 1 ' Tässä i muuttuu mutta luvut-lista ei muutu. Next
Kun lista ”sisältää olioita”, listassa on oikeasti vain viittauksia (osoittimia). VB.NETissä olioita käsitellään aina viittauksina. Vaikka viittauksesta luodaan kopio, se viittaa yhä samaan olioon, ja siksi oliota voi muokata silmukassa. Sen sijaan tietuetta käsitellään kokonaisena kuten lukujakin, jolloin silmukassa näkyy vain kopio tietueesta ja sen muokkaaminen ei auta. (Toisaalta jos tietueen jäsenenä on edelleen viittaus olioon, kyseisen olion muutokset taas onnistuvat, koska viittaus on sama myös tietueen kopiossa.)
Vaihda tietue luokaksi, tai joudut tekemään kummia purkkaviritelmiä: itse en ainakaan löytänyt netistä neuvoa, jolla listan alkioita pystyisi muokkaamaan, eli ainoa neuvo olisi käyttää tavallista For-silmukkaa ja joka kierroksella hakea arvo, muokata sitä ja tallentaa se takaisin samaan kohtaan. Toki VB.NET-tietoni ovat vähäiset, joten joku spesialisti saa tulla paikkaamaan.
Kiitos paljon!
Aihe on jo aika vanha, joten et voi enää vastata siihen.