Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Vain toisen komponentin asettaminen

Sivun loppuun

Triton [12.02.2013 15:28:11]

#

Sellainen kysymys heräsi C#:n syntaksiin liittyen, että onko mahdollista tehdä sellaisia settereitä, käyttämällä C#:n omaa notaatiota eli set-lohkoa, että pystyisin asettamaan esim. vain toisen Vector2-olion komponenteista?

Metabolix [12.02.2013 16:02:26]

#

Voithan sijoittaa setterissä arvon oikeastaan mihin tahansa. Voisitko tarkentaa kysymystä? Kirjoita malliksi vaikka metodit, jotka haluaisit korvata jollain setterillä.

samip [12.02.2013 16:12:55]

#

En tiedä mitä kysyt, vastaan silti: Named and Optional Arguments (C# Programming Guide)

groovyb [12.02.2013 17:47:10]

#

ilmeisesti kyse on XNA Frameworkista?

http://msdn.microsoft.com/en-us/library/bb199660(v=xnagamestudio.35).aspx

käytät vain tuota yhden floatin constructoria (se asettaa molempiin komponentteihin saman arvon)

tietenkin voit itse tehdä oman luokan, jolla voit asettaa vain toisen arvon.

//Notepad viritys, en pääse nyt testaamaan. Mutta jotain tän suuntaista:
public class MyVector2
{
   private float _x;
   private float _y;

   public float x
   {
     set { _x = value; }
     get { return _x;  }
   }

   public float y
   {
     set { _y = value; }
     get { return _y;  }
   }


   public static implicit operator Vector2(MyVector2 MV)
   {
      Vector2 v = new Vector2(MV.x, MV.y);
      return v;
   }

   public MyVector2(float X, float Y)
   {
      x = X;
      y = Y;
   }

}

class Program
{
   static void Main(string[] args)
   {
       MyVector2 MV = new MyVector2(12,12);

       //v.UnitX = 12, v.UnitY = 12
       Vector2 v = MV;

       MV.x = 14;
       //v.UnitX = 14, v.UnitY = 12
       v = MV;

       MV.y = 16;
       //v.UnitX = 14, v.UnitY = 16
       v = MV;

       MV.y = 200;
       MoveToSomething(MV);

       MV.x = 212;
       MoveToSomething(MV);

   }

   private void MoveToSomething(Vector2 v)
   {
     //....
   }
}

Toki voit myös tehdä extension methodin, jossa voit määrätä vain toisen arvoista (palautat uuden Vector2:sen joka sisältää esim. vanhan x:n ja uuden y:n) (http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx)

Triton [12.02.2013 19:04:19]

#

Tarkoitan siis tätä:

// Eli jos mulla on vaikka seuraavanlainen luokka:

namespace MyGame
{
	class Player
	{
		Vector2 position;

		public Vector2 Position
		{
			set { this.position = value; }
			get { return this.position; }
		}

	}

}

// ja haluaisin muuttaa mun Player-olion jompaakumpaa komponenttia. Näin:

Player player = new Player();
player.Position.X = 10;

// nythän tuo onnistuu vain niin, että
// asetetan näin:

player.Position = new Vector2( 0f, 0f );

groovyb [12.02.2013 19:11:03]

#

no jos sovellat vastaavaa kuin tuossa yllä näytin, niin Position objektisi voisi olla vaikak tuo MyVector2, jolloin käyttäisit sitä player.Position.x = 10;
Vector2 objektiin et voi vaihtaa suoraan vain toista komponenttia.

class Player
{

   public MyVector2 Position;
   public Player(float defaultX,float defaultY)
   {
      //alkukoordinaatit
      Position = new MyVector2(defaultX,defaultY);
   }


}

//Position.x = 10, Position.y=10
Player player = new Player(10,10);
//Position.x = 200, Position.y = 10
player.Position.x = 200;
Vector2 CurrentPosition = player.Position;
//ja voihan sulla olla suoraan tämmöinenkin:

public class Player
{
  public float x;
  public float y;
  public Player(float DefaultX, DefaultY)
  {
    x = DefaultX;
    y = DefaultY;
  }
  public Vector2 Position
  {
     get { return new Vector2(x,y); }
     set
     {
       Vector2 v = value;
       x = v.UnitX;
       y = v.UnitY;
     }
  }

//jolloin käyttö on;

Player player = new Player(5,5);
player.x = 10;
player.y = 20;
Vector2 Position = player.Position;
}

runeberg [20.03.2013 15:07:21]

#

Vähän vanha aihe, mutta jos joku vielä tarvii. Yksi vaihtoehto on toteuttaa myös näin:

public class Player
{
  private Vector2 position;

  public Player Player()
  {
    this.Position = new Vector2(null, null); // En kerennyt testaan kelpaako
                                             // null arvo, mutta sitten 0,0
  }

  public Vector2 Position
  {
    get { return this.position; }
    set { this.position = value; }
  }
}

// Ja sitten käytetään jossain:
Player player = new Player();
player.Position.X = 10;

Tosin jos alustus hyväksyy null arvon, niin sitä ei voi käyttää missään, mutta näin ainakin pystyy asettaan molemmat arvot erikseen

groovyb [20.03.2013 16:05:40]

#

Ei pysty, Vector2.X ja Vector2.Y sisältävät vain Getin.

runeberg [20.03.2013 16:56:00]

#


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta