Własne okno dialogowe

0

Witam
W JS pisze od kilku dni, idzie mi dość dobrze, ale zatrzymałem się w miejscu gdzie chce wyświetlić własny "alert", który blokował by wykonywanie skryptu do momentu wybrania opcji dialogu.
Niby nic prostszego wyświetlić ramkę i sprawdzać w nieskończonej pętli czy dialog już zakończył swoją funkcje, ale jak wiadomo w przeglądarce takie działanie kończy się "zawieszeniem" przeglądarki.
Znam funkcje setTimeout, clearTimeout, setInterval, clearInterval, ale niestety nie widze ich zastosowania do tego typu problemu.
Jak obejść to ograniczenie?
Gdyby JS posiadał goto to myśle, że po "evencie" zakończenia dialogu można by powrócić do miejsca gdzie był wywołany. Niestety w JS nie ma takiej konstrukcji językowej.
Dialogi wyświetlane są dość często w mojej aplikacji w dodatku w zagnieżdżonych switch'ach - jak to ugryźć bez "chamskiego" sleep'a

0

Użyj funkcji callback. Oczywiście callback to pewna idea rozwiązania.
Czyli otwierasz dialog i podajesz jaką funkcję ma dialog poinformować o stanie zamknięcia. I ta funkcja wykona coś dalej otrzymując stan zamknięcia dialogu.

ShowDialog(param1, param2, ..., callbackFunction)
{
...
// after close dialog
callbackFunction(closeState);
}

Tak w dużym uproszczeniu.

0

tak... tylko właśnie problem jest tego typu, że ta funkcja callbackFunction z twojego przykładu jest bardzo długa poniżej wycinek i nie wiem jak wrócić po tym dialogu do dalszej części skryptu wskoczenie w środek switcha chyba nie jest takie proste. Tutaj alert pełni funkcje tego dialogu którym chce go zastąpić.

/*****************************
 * Tower of the Sorcerer     *
 * Author: szopenfx          *
 *   File: triggers.js       *
 *****************************/
 
var animationStep = 0;
var animationHandle;
			
var triggerList = new Array();
triggerList[0] = {	map : 3, x : 4, y : 8, status : 1};
triggerList[1] = {	map : 2, x : 2, y : 6, status : 1};
triggerList[2] = {	map : 2, x : 0, y : 7, status : 1};
triggerList[3] = {	map : 2, x : 0, y : 9, status : 1};
triggerList[4] = {	map :10, x : 5, y : 4, status : 1};
triggerList[5] = {	map : 8, x :99, y :99, status :99};
triggerList[6] = {	map :10, x :99, y :99, status :99};
triggerList[7] = {	map :10, x :5, y :0, status :99};
triggerList[8] = {	map :10, x :5, y :8, status :1};

triggerCheck = function(map,x,y){
	var i=0;
	var quest=-1;
	for (i=0;i<triggerList.length;i++)
	{
		if (triggerList[i].status==99)
		continue;
		if ((triggerList[i].map==map) && (((triggerList[i].x==x) && (triggerList[i].y==y) && (triggerList[i].status>0))))
		{
			quest=i;
			break;
		}
	}

	switch(quest)
	{
		case 0:{  //supermiszczu wsadza mnie do wiezienia
			arena[knight.y][knight.x]=5;//fix smuzenia np. F8
			actualLevel=2;
			arena=listaLeveli[actualLevel];
			listaLeveli[2][6][1]=5;
			knight.health=4000;
			knight.offensive=100;
			knight.defensive=10;
			knight.weapon="";
			knight.shield="";
			knight.x=2;
			knight.y=7;
			triggerList[i].status=0;
			return;
		}break;
		case 1:{  //thief na f2 step1
			listaLeveli[2][6][2]=5;
			listaLeveli[2][7][0]=20;
			drawMap(false);
			triggerList[i].status=0;
		}break;
		case 2:{  //thief na f2 step2
			if (triggerList[1].status==0)
			{
				listaLeveli[2][7][0]=5;
				listaLeveli[2][9][0]=20;
				drawMap(false);
				triggerList[i].status=0;
			}
		}break;
		case 3:{  //thief na f2 step3
			if (triggerList[2].status==0)
			{
				listaLeveli[2][7][0]=5;
				alert("cya");
				drawMap(false);
				triggerList[i].status=0;
			}
		}break;
		case 4:{  //F10 - zamkniecie w komnacie szkieletow
			keyboardLock=true;
			animationStep=0;
			animate = function(){ //animacja 
				switch (animationStep)
				{					
					case 0: arena[5][4]=5;break;
					case 1: arena[5][6]=5;break;
					case 2: arena[2][5]=80; arena[3][5]=5;break;
					case 3: arena[1][5]=80; arena[2][5]=5;break;
					case 4: arena[0][5]=80; arena[1][5]=5;break;
					case 5: arena[2][5]=3;break;
					case 6: arena[6][5]=3;break;
					case 7: arena[3][3]=5;break;
					case 8: arena[3][7]=5;break;					
					//lewy z tarcza
					case 9: arena[3][2]=78; arena[3][1]=5;break;
					case 10: arena[3][3]=78; arena[3][2]=5;break;
					case 11: arena[3][4]=78; arena[3][3]=5;break;
					case 12: arena[4][4]=78; arena[3][4]=5;break;
					case 13: arena[5][4]=78; arena[4][4]=5;break;
					case 14: arena[5][5]=78; arena[5][4]=5;break;					
					//prawy z tarcza
					case 15: arena[3][8]=78; arena[3][9]=5;break;
					case 16: arena[3][7]=78; arena[3][8]=5;break;
					case 17: arena[3][6]=78; arena[3][7]=5;break;
					case 18: arena[3][5]=78; arena[3][6]=5;break;					
					//lewy, 3 skelet
					case 19: arena[3][2]=76; arena[2][2]=5;break;
					case 20: arena[3][3]=76; arena[3][2]=5;break;
					case 21: arena[3][4]=76; arena[3][3]=5;break;
					case 22: arena[4][4]=76; arena[3][4]=5;break;
					case 23: arena[5][4]=76; arena[4][4]=5;break;					
					//prawy, 1 
					case 24: arena[3][8]=76; arena[2][8]=5;break;
					case 25: arena[3][7]=76; arena[3][8]=5;break;
					case 26: arena[3][6]=76; arena[3][7]=5;break;
					case 27: arena[4][6]=76; arena[3][6]=5;break;
					case 28: arena[5][6]=76; arena[4][6]=5;break;					
					//lewy, 2
					case 29: arena[3][1]=76; arena[2][1]=5;break;
					case 30: arena[3][2]=76; arena[3][1]=5;break;
					case 31: arena[3][3]=76; arena[3][2]=5;break;
					case 32: arena[3][4]=76; arena[3][3]=5;break;
					case 33: arena[4][4]=76; arena[3][4]=5;break;
					//prawy, 2
					case 34: arena[3][9]=76; arena[2][9]=5;break;
					case 35: arena[3][8]=76; arena[3][9]=5;break;
					case 36: arena[3][7]=76; arena[3][8]=5;break;
					case 37: arena[3][6]=76; arena[3][7]=5;break;
					case 38: arena[4][6]=76; arena[3][6]=5;break;					
					//lewy, 1
					case 39: arena[3][0]=76; arena[2][0]=5;break;
					case 40: arena[3][1]=76; arena[3][0]=5;break;
					case 41: arena[3][2]=76; arena[3][1]=5;break;
					case 42: arena[3][3]=76; arena[3][2]=5;break;
					case 43: arena[3][4]=76; arena[3][3]=5;break;
					//prawy 3 
					case 44: arena[3][10]=76; arena[2][10]=5;break;
					case 45: arena[3][9]=76; arena[3][10]=5;break;
					case 46: arena[3][8]=76; arena[3][9]=5;break;
					case 47: arena[3][7]=76; arena[3][8]=5;break;
					case 48: arena[3][6]=76; arena[3][7]=5;break;
					//obie bramy zamykamy
					case 49: arena[3][3]=3;break;
					case 50: arena[3][7]=3;break;					
					default:{
						clearTimeout(animationHandle);
						keyboardLock=false;
						triggerList[i].status=0;
					};return;
				};				
				animationStep++;
				drawMap(true);
			};
			animationHandle = setInterval(animate,400);
		}break;
		
		case 8:{  //F10 - przy wyjsciu thief
			if (triggerList[7].status==0)
			{
			keyboardLock=true;
			animationStep=0;
			animate = function(){ //animacja 
				switch (animationStep)
				{					
					case 0: arena[9][0]=20;break;
					case 1: arena[8][0]=20; arena[9][0]=5;break;
					case 2: arena[7][0]=20; arena[8][0]=5;break;
					case 3: arena[7][1]=20; arena[7][0]=5;break;
					case 4: arena[7][2]=20; arena[7][1]=5;break;
					case 5: arena[8][2]=20; arena[7][2]=5;break;
					case 6: arena[9][2]=20; arena[8][2]=5;break;
					case 7: arena[10][2]=20; arena[9][2]=5;break;
					case 8: arena[10][3]=20; arena[10][2]=5;break;
					case 9: arena[10][4]=20; arena[10][3]=5;break;
					case 10: arena[9][4]=20; arena[10][4]=5;break;
					case 11: arena[9][5]=20; arena[9][4]=5;break;
					default:{
						clearTimeout(animationHandle);
						keyboardLock=false;
						triggerList[i].status=0;
					};return;
				};				
				animationStep++;
				drawMap(true);
			};
			animationHandle = setInterval(animate,400);
			}
		}break;
		
		default:{
		 //[T5]F8 sprawdz czy zabici straznicy i otworz zielone drzwi jak tak		
			if (triggerList[5].status>0 && map == 8 && arena[4][10]==5 && arena[4][8]==5)
			{			
				arena[3][9]=5;
				triggerList[5].status=0;
				drawMap(false);
			}			

			//[T6] F10 otwarcie drzwi do bossa y,x
			else if (triggerList[6].status>0 && map == 10 && triggerList[4].status==0)
			{
				if (arena[3][4]==5 && arena[3][5]==5 && arena[3][6]==5 
				 && arena[4][4]==5 					 && arena[4][6]==5
				 && arena[5][4]==5 && arena[5][5]==5 && arena[5][6]==5)
				{			
					arena[2][5]=5;
					triggerList[6].status=0;
					drawMap(false);
				}
			}			
			//[T7]F10 po zabiciu bossa
			else if (triggerList[7].status>0 && map == 10 && triggerList[6].status==0 && arena[triggerList[7].y][triggerList[7].x]==5)
			{
				keyboardLock=true;
				animationStep=0;
				animate2 = function(){ //animacja 
					switch (animationStep)
					{
						//bramy otwieramy
						case 0: arena[3][3]=5;break;
						case 1: arena[3][7]=5;break;
						case 2: arena[6][5]=5;break;
					
						case 3: arena[2][5]=22;break; //wrozka
					
						//lewy room 1 wiersz
						case 4: arena[2][0]=33;break; 
						case 5: arena[2][1]=33;break; 
						case 6: arena[2][2]=33;break; 
						//prawu room 1 wiersz
						case 7: arena[2][8]=34;break; 
						case 8: arena[2][9]=34;break; 
						case 9: arena[2][10]=34;break; 
						//lewy room 2 wiersz
						case 10: arena[3][0]=32;break; 
						case 11: arena[3][1]=32;break; 
						case 12: arena[3][2]=32;break; 
						//prawu room 2 wiersz
						case 13: arena[3][8]=28;break; 
						case 14: arena[3][9]=28;break; 
						case 15: arena[3][10]=28;break;
					
						case 16: arena[10][5]=10;break;
						default:{
							clearTimeout(animationHandle);
							keyboardLock=false;
							triggerList[7].status=0;
						};return;
					};				
					animationStep++;
					drawMap(true);
				}
				animationHandle = setInterval(animate2,400);
			}
		}
		//TO DO - orb of fly
		
	}
}

	
var statusNPC = new Array();
var statusWrozka = new Array();

statusNPC[2,0]=2;//dziadek
statusNPC[2,1]=2;//dziadek
statusNPC[3,0]=2;//dziadek
statusNPC[4,0]=2;//dziadek
statusNPC[6,0]=2;//dziadek
statusNPC[16,0]=2;//dziadek
statusNPC[16,1]=2;//dziadek
statusNPC[18,0]=2;//dziadek	

statusWrozka[0]=1;//wrozka

talkNPC = function(what)
{
	switch (what)
	{
		case 18: {//merchant
			alert("QQQ");
		};break;
		case 20: {//thief
			alert("QQQa");
		};break;
		case 22: {//wrozka
			switch (actualLevel)
			{
				case 10:{
					if (statusWrozka[0] == 1)
					{
						alert("Congratulations! You win the 999 place with the points which you got. I'm going to register your score."+
						"Judging by your vital power, offensive power, defensive power, and number of keys, you have 999 points."+
						"Do you wish to go on? I give you the special rank of FIGHTER;BRAVE MAN;HERO");
						statusWrozka[0]=0;
						arena[knight.dy][knight.dx]=5;
					}
				};break;
			};
		};break;
		case 24: {//oracle
			switch (actualLevel)
			{
				case 2:{
					if (statusNPC[2,0] == 2)
					{
						alert("wreczam OrbOfFly");
						statusNPC[2,0]=1;				
					}
					else if (statusNPC[2,0] == 1)
					alert("masz juz orba spiepszaj dziadu");			
				};break;
				case 3:{
					if (statusNPC[3,0] == 2)
					{
						alert("I will grant you orb of the hero. When you use it, you will be able to forecast the ability of the living monsters on that floor, and how much damage they can do to you. Make good use of it.");
						statusNPC[3,0]=1;				
					}
					else if (statusNPC[3,0] == 1)
					alert("I have done what I can. Good luck!");
				};break;
				case 4:{
					if (statusNPC[4,0] == 2)
					{
						alert("There are doors which cannot be openned with a key; these doors can only open by beating the monsters which guard them.");
						statusNPC[4,0]=1;				
					}
					else if (statusNPC[4,0] == 1)
					alert("I have done what I can. Good luck!");
				};break;
				case 6:{
					if (statusNPC[6,0] == 2)
					{
						alert("If you buy goods from merchants, you will be able to hear important information later.");
						statusNPC[6,0]=1;				
					}
					else if (statusNPC[6,0] == 1)
					alert("I have done what I can. Good luck!");
				};break;
				case 16:{
					if (statusNPC[16,0] == 2 && hero.x==9)
					{
						alert("I heard that you can find a red key at two places in this area.");
						statusNPC[16,0]=1;				
					}
					else if (statusNPC[16,0] == 1 && hero.x==9)
					alert("I have done what I can. Good luck!");
					
					if (statusNPC[16,1] == 2 && hero.x==1)//2gi NPC
					{
						alert("Thank goodness, you found me. I will give you an elixir as a symbol of my gratitude. Using this medicine will cause you to gain life according to your offensive and defensive power. So naturally, the later you use, the more it will have an effect on you.");
						statusNPC[16,1]=1;
						//QUESTITEM - FLASZKA
					}
					else if (statusNPC[16,1] == 1 && hero.x==1)
					alert("I have done what I can. Good luck!");
				};break;
				case 18:{
					if (statusNPC[18,0] == 2)
					{
						alert("In this area, if you don't raise your offensive power at an altar a few times, you may not be able to destroy 'Rock' monsters. Be careful!");
						statusNPC[18,0]=1;
					}
					else if (statusNPC[18,0] == 1)
					alert("I have done what I can. Good luck!");
				};break;
				case 21:{
					if (statusNPC[21,0] == 2)
					{
						alert("The Great Magic Master is in this area. He is a proprietor of this magic tower. At your strenght, to attack him means death. It stands to reason that you should not face him, but rather, get items on higher levels first.");
						statusNPC[21,0]=1;
					}
					else if (statusNPC[21,0] == 1)
					alert("I have done what I can. Good luck!");
				};break;
			}
		};break;
		case 26: {//lalka
		alert("QQQn");
		};break;			
	}	
	drawMap(true);
}

Przy triggerCheck byłby też wielokrotnie używany dialog, jednym słowem potrzebuje czegoś uniwersalnego.
Uznałem, że akurat tutaj nie musi być skrypt zatrzymywany po dialogu bo i tak zablokuje klawiature userowi, ale co jeśli dialog będzie miał kilka opcji do wyboru? musze kontynuować od miejsca wywołania go

0

No jak dla mnie to nie jest zbyt długi
statusWrozka[0]=0;
arena[knight.dy][knight.dx]=5;

później z funkcji callback musisz wrócić do twojej głównej funkcji
nie wiem nic o jej budowie, czy jest tam pętla, czy jest cyklicznie przez timer odpalana etc. więc ciężko coś wiecej zaproponowac

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