Koniec tablicy, wykonywanie funkcji N razy

0

Witam piszę prosty translator morsa na androida. Dziś rano napisałem kod i działał lecz teraz kiedy do niego wróciłem funkcja wykonuje się losową ilość razy oraz mam błędy typu za mała tablica za dużo znaków. Problem jest prosty dla osoby patrzącej na kod jako "obcy" więc proszę o korektę ew sugestie.

KOD uproszczony

 
var znak:String;
var i:int;
var kropkad : AudioClip;
var kreskad : AudioClip;

function kropka(){


audio.PlayOneShot(kropkad);

}
function kreska(){


audio.PlayOneShot(kreskad);




}

function ponownie(){
 koduj_znak(znak);

}

function koduj_znak(znak:String)
{

if ((znak[i]=='a') || (znak[i]=='A')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='b') || (znak[i]=='B')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='c') || (znak[i]=='C')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='d') || (znak[i]=='D')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kropka(); yield WaitForSeconds (0.8); }
if ((znak[i]=='e') || (znak[i]=='E')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='f') || (znak[i]=='F')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='g') || (znak[i]=='G')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='h') || (znak[i]=='H')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='i') || (znak[i]=='I')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='j') || (znak[i]=='J')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='k') || (znak[i]=='K')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='l') || (znak[i]=='L')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='m') || (znak[i]=='M')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='n') || (znak[i]=='N')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='o') || (znak[i]=='O')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='p') || (znak[i]=='P')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kropka(); yield WaitForSeconds (0.8);}
if ((znak[i]=='q') || (znak[i]=='Q')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='r') || (znak[i]=='R')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='s') || (znak[i]=='S')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.8); }
if ((znak[i]=='t') || (znak[i]=='T')) {Debug.Log(znak[i]);i++;  kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='u') || (znak[i]=='U')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='v') || (znak[i]=='V')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='w') || (znak[i]=='W')) {Debug.Log(znak[i]);i++;  kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.8); }
if ((znak[i]=='x') || (znak[i]=='X')) { Debug.Log(znak[i]);i++; kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kropka();yield WaitForSeconds (0.2);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='y') || (znak[i]=='Y')) { Debug.Log(znak[i]);i++; kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kreska();yield WaitForSeconds (0.4);kreska(); yield WaitForSeconds (0.8);}
if ((znak[i]=='z') || (znak[i]=='Z')) {Debug.Log(znak[i]); i++; kreska();yield WaitForSeconds (0.4);kreska();yield WaitForSeconds (0.4);kropka();yield WaitForSeconds (0.2);kropka(); yield WaitForSeconds (0.8);}
if(i!=znak.Length){ponownie();}
}

function OnGUI(){

znak = GUI.TextField (Rect (0, 0, Screen.width, Screen.height/6), znak, 1024);


var buttonx:int = Screen.height/6;
var buttony: int=Screen.width/6;
 if (GUI.RepeatButton(Rect((Screen.width-buttony)/2,(Screen.height-buttonx)/2,buttony,buttonx),"")){
   
    
         i=0;   
   
         koduj_znak(znak);
            }
         
 }

i teraz mały opis działania w wpisuje sobie np sms :
słyszę dokładnie to co w debug log
6 x s (nałożone na siebie)
1 x m (poprawne)
1 x s (poprawne)

5x info o tablicy typu "IndexOutOfRangeException: Array index is out of range" do lini 49
1x "IndexOutOfRangeException: Array index is out of range" do 43

Niby mam error o za małej tablicy ale zmiana rozmiaru nie pomaga.

0

Po pierwsze uprość kod bo jest okropnie nieczytelny .

  • Nie da się użyć pętli for dla i ?
  • znak[i]==a || znak[i] == A nie lepiej użyć UpperCase lub LowerCase i porównywać do jednego znaku ?
  • Pogrupuj jakoś znaki tak żeby nie pisać kilka razy WaitForSeconds (0.8)

Wtedy może komuś ze chce się w tym szukać problemu

1 użytkowników online, w tym zalogowanych: 0, gości: 1