Uživatelské nástroje

Nástroje pro tento web


vyuka:snek_a_slunce

Šnek a slunce

Příklad na ovládání vnořených movie clipů

Modifikujme si příklad šneka a sluníčka z prvního ročníku http://www.hollarka.cz/pedagog/kripner/oi2/oi2_03.htm. Tam šlo o to, že sluníčko když vylezlo, spustiol movieClip šneka a šnek vylezl z ulity, když sluníčko zalezlo, šnek zalez do ulity (a přestal lézt).

Úlohu si trochu zkomplikujmwe tím, že budeme chtít, aby šnek, když se na něj poklepe myší vylezl (je-li zalezlý), nebo zalezl do ulity (a přestal léz, je-li vylezlý). Na rozdíl od úlohy v prvním ročníku si vše ale realizujeme jako jeden komplexní složený movieClip.

Nyní si vytvoříme třídu SnekASlunce která bude obsahovat šneka a sluníčko (a také oblohu) jako vložené movieClipy a ukážeme si jednoduchý vzor jak se vzájemně ovládají jednotlivé movieClipy.

Chceme, aby výsledek vypadal takto:

Pro přehrání obsahu potřebujete Adobe Flash Plugin.

Nejprve vytvoříme movieClip Obloha. K němu vytvoříme třídu Obloha, která bude vypadat takto:

class Obloha extends MovieClip {
	function Obloha() {
	}
	function rozedniSe() {
		trace("rozední se");
		gotoAndPlay("noc");
	}
	function setmiSe() {
		trace("setmí se")	
		gotoAndPlay("den");
	}
}

Uděláme si testovací klip testObloha obsahující instanci třídy Obloha a dva testovací tlačítka, která volají metody rozedniSe a setmiSe:

Pro přehrání obsahu potřebujete Adobe Flash Plugin.

zdrojový text testObloha


Nyní si vytvoříme složený movieClip SnekASlunce (zatím ale bez šneka, který kombinuje oblohu a sluníčko (třída Obloha) a třída (Slunce). Slunce bude vycházet a zapadat a přito bude se obloha rozsvěcovat (ve dne) a zhášet (v noci). Výsledek by měl vypadat takto:

Pro přehrání obsahu potřebujete Adobe Flash Plugin.

V movieClipu SnekASlunce jsou vloženy dva movie clipy - instance třídy Slunce a instance třídy Obloha.

TřídaSlunce má atribut jeDen, který je nastavován vždy na true, když slunce vyjde a na false, když slunce zapadne. Zároveň se při východu volá funkce onVychod() a při západu funkce onZapad():

Na snímku, kdy slunce vychází je tedy napsáno:

onVychod();
den=true;

a na snímku, kdy slunce zapadá je napsáno:

onZapad();
den=false;

Třída Slunce:

class Slunce extends MovieClip{
	var jeDen:Boolean=false;
	var onVychod:Function;
	var onZapad:Function;
}

Třída SnekASlunce (zatím bez šneka:

class SnekASlunce extends MovieClip {
     //šnek zde ještě není
	var slunce_mc:MovieClip;
	var obloha_mc:MovieClip;
	function SnekASlunce() {
		slunce_mc.onVychod = function() {
			_parent.obloha_mc.rozedniSe();
		};
		slunce_mc.onZapad = function() {
			_parent.obloha_mc.setmiSe();
		};
	}
}

Třída obsahuje dvě instance - instanci třídy Obloha - obloha_mc a instanci třídy Slunce - slunce_mc.

Vložený movieCLip slunce_mc při východu vyvolá funkci onVychod, a při západu onZapad. Tyto funkce volají v sousedním vložené movieClipu obloha_mc metody setmi_se a rozedni_se. Protože je to sousední movieClip musí se volat přes rodičovský movieClip:

Pro přehrání obsahu potřebujete Adobe Flash Plugin.

zdrojový text testOblohaASlunce


Nyní si naprogramujeme šneka. Nejdříve si ho uděláme samostatně. Uděláme si testovací program testSnek. 3nek by na poklepání měl zalézat a vylézat. Když ale klepnu myší na zalézajícího nebo vylézajícího šneka, nemělo by se nic stát. šnek by měl odpovídat na poklepání myší jedině když je ve stavu zalezlém nebo vylezlém.

Výsledek by měl vypadat takto:

Pro přehrání obsahu potřebujete Adobe Flash Plugin.

Třída šnek proto vypadá takto:

class Snek extends MovieClip {
	public var jsemVylezlej:Boolean = true;
	public var jsemZalezlej:Boolean = false;
	public var onVylezlJsem:Function;
	public var onZalezlJsem:Function;
	public var onZalezam:Function;
	public var onVylezam:Function;
	function Snek() {
		gotoAndPlay("lez");
	}
	public function zalez() {
		//šnek zaleze
		jsemVylezlej = false;
		gotoAndPlay("zalez");
		onZalezam();
	}
	public function vylez() {
		//šnek vyleze
		jsemZalezlej = false;
		gotoAndPlay("vylez");
		onVylezam();
	}
	public function vylezlJsem() {
		jsemVylezlej = true;
		trace("vylezl jsem");
		onVylezlJsem();
	}
	public function zalezlJsem() {
		jsemZalezlej = true;
		trace("zalezl jsem");
		onZalezlJsem();
	}
	function onPress() {
		if (jsemVylezlej) {
			zalez();
		} else if (jsemZalezlej) {
			vylez();
		}
	}
}

zdrojový text programu testsnek


No a nakonec to celé vložíme do sebe. Do movieClipu snekASlunce vložíme šneka jako instaqnci snek_mc třídy Snek. šnek se má pomalu pohybovat, proto instanci snek_mc uděláme jako Motion Tween. V konstruktory třídy Snek zapneme lezení šneka tím, že naplníme prázdnou funkci onVylezlJsem() obsahem - z instance snek_mc zavolám rodičovskou funkce - tou je třída SnekASlunce - a spustím play(). Šnek se začne hýbat podle MotionTw

Třída SnekASlunce nakonec vypadá takto:

class SnekASlunce extends MovieClip {
	var snek_mc:MovieClip;
	var slunce_mc:MovieClip;
	var obloha_mc:MovieClip;
	function SnekASlunce() {
		snek_mc.onVylezlJsem = function() {
			//zacne lézt
			trace("vylezl jsem");
			_parent.play();
		};
		snek_mc.onZalezam = function() {
			trace("zalezam");
			//zastavi se
			_parent.stop();
		};
		slunce_mc.onVychod = function() {
			if (_parent.snek_mc.jsemZalezlej == true) {
				_parent.snek_mc.vylez();
			}
			_parent.obloha_mc.rozedniSe();
		};
		slunce_mc.onZapad = function() {
			if (_parent.snek_mc.jsemVylezlej == true) {
				_parent.snek_mc.zalez();
			}
			_parent.obloha_mc.setmiSe();
		};
	}
} 

zdrojový text celého programu

vyuka/snek_a_slunce.txt · Poslední úprava: 2007/04/29 19:03 autor: kofranek