Wpis z mikrobloga

#programowanie #gamedev #csharp

Mirki, mam problem. Chyba dosyć błahy ale jakoś nie ogarniam.

Dajmy na to mam sobie skrypt w którym mam jakieś tam 3 boole:

bool controls = true;
bool zoom = false;
bool active = true;

i mam trzy obiekty z takim samym skryptem X którym chcę korzystać z tych booli, ale w którym mam IFa który na podstawie swojej jakiejś tam zmiennej oznaczającej korzysta z danego boola. np.

if(name == controlsObject)
controls = !controls;
else if (name == zoomObject)
zoom = !zoom;
else
active = !active;

No i ok. Takie coś zadziała. Ale dajmy na to że chcę często korzystać z tych opcji i takie IFowanie częste jest nieładne. Więc robię w każdym obiekcie boola STATE i coś takiego:

if(name == controlsObject)
STATE = controls;
else if (name == zoomObject)
STATE = zoom;
else
STATE = active;

i wtedy już nie wołam za każdym razem IFa żeby rozstrzygnąć jaki to przycisk tylko cokolwiek robię to operuję na STATE a ten już działa na tej wartości którą mu przypisałem.

JAK TO ZROBIĆ?!

Pierwsze co mi przyszło do głowy to REF, ale REF działa inaczej. Jak zrobić taki odnośnik? Taką referencję jakby? Jak dany przycisk nazywa się jakoś to zmienna STATE odpowiada za coś tam i wtedy operując już na tej zmiennej STATE każdy przycisk sobie indywidualnie zmienia co innego.

Wydaje się głupio błaha sprawa a nie mogę ogarnąć. o.O
  • 22
@Noct: A nie ma czegoś takiego w C# żeby po prostu w zrobić odnośnik do jakiejś zmiennej? Coś jak znaczniki w C. Robię taki znacznik. W zależności od tego co chcę kontrolować przypisuję mu co innego i dalej operuję na tym znaczniku?
Wywoływanie za każdym razem IFa czy Switcha wydaje mi się jakieś takie... mało wydajne.
@Nicarim: nie nie. To nie to. Chodziło mi dokładnie o taką analogię wskaźnika.

Czyli mam sobie ten wskaźnik STATE i dwa przyciski z tym samym skryptem który po naciśnięciu robi to:

STATE = !STATE;

Czyli przełącza stan. Tylko że w jednym przycisku do tego wskaźnika przypisuję jakąś tam skądś wartość X, i ten przycisk zmienia JĄ, a w innym przycisku przypisuję wartość Y i ten zmienia JĄ. I mogę zrobić milion
@Curry_: Może napisz do tego metodę?
np.

bool Invert(bool &dupa) { return !dupa; }
Jeśli nie chcesz wykonywać tego w sposób Invert(controls), możesz stworzyć sobie tablice typu boolean, w niej trzymać te wszystkie bule, iterowane enumem.

Wtedy do metody invert przekazywałbyś tylko enuma lajk dis:

bool Invert(enum dupa) {return !tablicabuli[dupa]; }
Jeśli masz to ładnie w klasach, to możesz przekazywać tylko wskaźnik na miejsce w tablicy buli, do tego metoda
@Noct: oj ja to z tymi enumami to niedobrze żyję :D Nie no po prostu zrobię tak jak miałem, czyli akcję będę rozdzielał IF/Switchem . Myślałem że da się to zrobić prościej, robiąc raz IF/Switchem jakiś wskaźnik i później działać na nim ale jak się nie da prosto tego zrobić to IF/Switch też będzie dobrze latał.
@Noct: hmm... to chyba czegoś nie rozumiem. Dokładnie u mnie to jest tak:

mam sobie skrypt Settings i w nim:

public static bool inputMethod;
public static bool mouseInvert;
public static bool doubleClick;

i potem mam sobie przyciski na których siedzi skrypt Button i w nim mniej więcej:

public byte buttonType;

void OnClick(){

Switch(buttonType){

case 0:
settings.inputMethod = !settings.InputMethod;
break;

case 1:
settings.mouseInvert= !settings.mouseInvert;
break;

case 2:
settings.doubleClick= !settings.doubleClick;
break;
}

}
@regis3: nie nie. To nie to. U mnie chodzi o zwykłe toggle switch boolów. To o czym pisze to po prostu zmienianie różnych zmiennych wykonując operacje na jakimś tam wskaźniku który odnosi się do różnych zmiennych.
@Noct: Ah, o to chodzi z tą tablicą. A to u mnie nie przejdzie. Ja robię to co wyżej napisałem. To jest skrypt przycisku który ma togglować boola, zmieniać dane ustawienie czegoś. Już mam te boole w skrypcie Settings i ponazywane są tak żeby je łatwo ogarniać np. settings.mouseInverted. Więc robienie drugiej tablicy dublującej te boole w każdym przycisku mija się z celem. Jak nie ma sensownej alternatywy dla wskaźników to
@Curry_: To, co Ci przedstawiłem właśnie to robi. Nie dubluj, tylko zastąp. Zamiast jednego boola, używasz jednego boola, który jest elementem tablicy. Sprytnie, nie? ( )
A do nazw łatwych do ogarnięcia jest właśnie enum, będący jednocześnie iteratorem. Jak nie potrzebujesz tego teraz, to będziesz później. Potwierdzone info, niestety. Powodzenia!
@Noct: no enumy się przydają to fakt. Ja to w sumie ich nie używam bo zawsze mi się wydaje że bardziej utrudnią niż ulepszą, ale muszę wyrobić sobie nawyk używania ich.

A co do zastępowania tych moich boolów tablicą to jakoś nie jestem przekonany. Wtedy zamiast się odwołać:

if(settings.mouseInverted) something;
musiałbym wołać:

if(settings.tablicaBuli[mouseInverted]) something;
Czyli więcej/trudniej a korzyści jako takiej nie ma z tego że zamiast oddzielnie te ustawienia w swoich
@Noct: ej, ale to co mu napisałeś jest fest nieczytelne na pierwszy rzut oka. ale fajne. zapamiętam, bo akurat czuję, że mi się przyda pisząc obecnie jednego klienta do sterownika ^^
@Noct: nie nie, po prostu po 9h w VS w pracy mój mózg średnio przetworzył coś wyrwane z kontekstu. ale to fajny pomysł z trzymaniem wszystkich zmiennych logicznych opisujących stany klienta w jednej tablicy i tylko inicjalizacji jej na początku z zapisanego stanu albo konfigu. opakować w properties i zapomnieć.