Uživatelské nástroje

Nástroje pro tento web


vyuka:mys_a_syr

Myš a sýr

Práci s vnořenými movieClipy i použití funkce setInterval si demonstrujme na příkladu myši a sýra. Místo myši můžeme programovat i jiné zvíře - třeba rybu, místo sýra i jinou potravu.

Výsledná aplikace by měla vypadat nějak takto:

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

Jakmile uchopíme-li sýr, myš se za sýrem bude otáčet, jakmile sýr pustíme, myš se za ním rozběhne, bude ho užírat a až ho sežere, tak se sýr opět objeví.

Máme dvě třídy: Mys a Syr.

Nejprve naprogramujeme MovieClip sýra. Bude vypadat tak, že na (řekněme dvaceti) snímcích si naprogramujeme postuponé ubývání sýra. Na prvním framu nastavíme stop().

V třídě Syr nastavujeme vlastnost okousanost (pomocí get a set funkcí). hodnota okousanost=1 znamená že sýr je celý sežrán, okosanost=0 je nenakousnutý sýr


class Syr extends MovieClip {
	var POSLEDNI_SNIMEK = 21;
	var mys_mc:MovieClip;
	private var _okousanost:Number = 0;
	function get okousanost():Number {
		return _okousanost;
	}
	function set okousanost(kolik:Number) {
		if (kolik>1) {
			kolik = 1;
		} else if (kolik<0) {
			kolik = 0;
		}
		_okousanost = kolik;
		this.gotoAndStop(Math.round(kolik*(POSLEDNI_SNIMEK-1)+1));
	}
}

To dá možnost nastavit stav okousanosti sýra např. okousanost=0.5 je sýr zpola sežraný. Pokud budeme chtít nastavit postupné užírání sýra, budeme postupně snižovat hodnoty okousanosti, např:

syr_mc.okousanost=syr_mc.okousanost - 0.1;

Potřebujeme dále naprogramovat chování tak, aby po uchopení sýra (počítačocou) myší, myš nechala být i zpola ožraný sýr, který ji mmůžeme (utrhnout od huby)- voláme metodu třídy myš - nechTenSyr(), a sýrem můžeme po obrazovce pohybovsat (voláme funkci startDrag).

Když pustíme sýr (stopDrag), chceme aby myš se otočila za sýrem a běžela za ním - voláme metodu třídy myš bezZaSyrem():

Když z instance třídy Syr voláme metody třídy Mys, musíme jít přes _parent (myš je na obrazovce vedle instance třídy Syr).

Konečná podoba třídy Sysr vypadá takto:


class Syr extends MovieClip {
	var POSLEDNI_SNIMEK = 21;
	var mys_mc:MovieClip;
	private var _okousanost:Number = 0;
	function get okousanost():Number {
		return _okousanost;
	}
	function set okousanost(kolik:Number) {
		if (kolik>1) {
			kolik = 1;
		} else if (kolik<0) {
			kolik = 0;
		}
		_okousanost = kolik;
		this.gotoAndStop(Math.round(kolik*(POSLEDNI_SNIMEK-1)+1));
	}
	function onPress() {
		this.startDrag();
		_parent.mys_mc.nechTenSyr();
	}
	function onRelease() {
		this.stopDrag();
		_parent.mys_mc.bezZaSyrem();
	}
}

Nyní je vaším úkolem naprogramovat třídu Myš. Využíváme zde volání třídy Kutil pro natočení myši za sýrem pro nastavení kroku ve funkci onEnterFrame a pro testování vzdálenosti myši od sýra.


první začátky:


class Mys extends MovieClip {
	function nechTenSyr() {
		trace("nectTenSyr - nechá si sýr odtrhnout od huby a přestane žrát");
	}
	function bezZaSyrem() {
		trace("bezZaSyrem - otoci se za syrem a bezi za nim.");
		trace("Když dohoní sýr, tak ho začne žrát.");
		trace("Když sýr dožere, tak přestane žrát");
	}
}

další pokračování“


class Mys extends MovieClip {
	function nechTenSyr() {
		trace("nechTenSyr - nechá si sýr odtrhnout od huby a přestane žrát");
	}
	function bezZaSyrem() {
		trace("bezZaSyrem - otoci se za syrem a bezi za nim.");
		trace("Když dohoní sýr, tak ho začne žrát.");
		trace("Když sýr dožere, tak přestane žrát");
	}
	function zer(){
		trace("myška žere");
	}
	function nezer(){
		trace("myška nežere");
	}
	function bez(){
		trace("myška hýbe nožičkama");
	}
	function stuj(){
		trace("myška nehybe nožičkama");
	}
}

Další etapa:


class Mys extends MovieClip {
	var vzdálenostOdSyra:Number=0;
	var idNumber:Number;
	function nechTenSyr() {
		trace("nechTenSyr - nechá si sýr odtrhnout od huby a přestane žrát");
	}
	function bezZaSyrem() {
		trace("volán bezZaSyrem");
		trace("bezZaSyrem - otoci se za syrem a bezi za nim.");
		var n:Number;
		//bude se volat funkce definovanopu v onEnterFrame při každém snímku dokud nedohoní sýr
		onEnterFrame = function () {
			//posune se k sýru a vrátí vzdálenost od sýra
			n = bezi();
			trace("vzdálenost od sýra="+n);
			if (n<1) {
				trace("vzdálenost od sýra je menší než jeden pixel");
				trace("Když dohoní sýr, tak ho začne žrát.");
				zer();
				stuj();
				idNumber = setInterval(this, "ozirej", 100);
				onEnterFrame = null;
			}
		};
		nezer();
		bez();
	}
	function ozirej() {
		trace("postupně ožírá sýr");
	}
	function bezi():Number {
		trace("otočí se za sýrem a běží za ním, vrací vzdálenost od sýra v pixelech");
		trace("vzdálenost je "+vzdálenostOdSyra+" pixely");
		return vzdálenostOdSyra;
	}
	function zer() {
		trace("myška žere");
	}
	function nezer() {
		trace("myška nežere");
	}
	function bez() {
		trace("myška hýbe nožičkama");
	}
	function stuj() {
		trace("myška nehybe nožičkama");
	}
}

Další s clearInterval


class Mys extends MovieClip {
	var vzdálenostOdSyra:Number = 0;
	var idNumber:Number;
	function nechTenSyr() {
		trace("volám nechTenSyr");
		trace("nechTenSyr - nechá si sýr odtrhnout od huby a přestane žrát");
		this.onEnterFrame = null;
		clearInterval(idNumber);
		nezer();
		stuj();
	}
	function bezZaSyrem() {
		trace("volán bezZaSyrem");
		trace("bezZaSyrem - otoci se za syrem a bezi za nim.");
		var n:Number;
		//bude se volat funkce definovanopu v onEnterFrame při každém snímku dokud nedohoní sýr
		onEnterFrame = function () {
			//posune se k sýru a vrátí vzdálenost od sýra
			n = bezi();
			trace("vzdálenost od sýra="+n);
			if (n<1) {
				trace("vzdálenost od sýra je menší než jeden pixel");
				trace("Když dohoní sýr, tak ho začne žrát.");
				zer();
				stuj();
				idNumber = setInterval(this, "ozirej", 100);
				onEnterFrame = null;
			}
		};
		nezer();
		bez();
	}
	function ozirej() {
		trace("postupně ožírá sýr");
	}
	function bezi():Number {
		trace("otočí se za sýrem a běží za ním, vrací vzdálenost od sýra v pixelech");
		trace("vzdálenost je "+vzdálenostOdSyra+" pixely");
		return vzdálenostOdSyra;
	}
	function zer() {
		trace("myška žere");
	}
	function nezer() {
		trace("myška nežere");
	}
	function bez() {
		trace("myška hýbe nožičkama");
	}
	function stuj() {
		trace("myška nehybe nožičkama");
	}
}

Další předposlední


class Mys extends MovieClip {
	var vzdálenostOdSyra:Number = 0;
	var idNumber:Number;
	var ob1:Object = new Object();
	var syr_mc:MovieClip;
	function nechTenSyr() {
		trace("volám nechTenSyr");
		trace("nechTenSyr - nechá si sýr odtrhnout od huby a přestane žrát");
		this.onEnterFrame = null;
		clearInterval(idNumber);
		nezer();
		stuj();
	}
	function bezZaSyrem() {
		trace("volán bezZaSyrem");
		trace("bezZaSyrem - otoci se za syrem a bezi za nim.");
		var n:Number;
		//bude se volat funkce definovanopu v onEnterFrame při každém snímku dokud nedohoní sýr
		onEnterFrame = function () {
			//posune se k sýru a vrátí vzdálenost od sýra
			n = bezi();
			trace("vzdálenost od sýra="+n);
			if (n<1) {
				trace("vzdálenost od sýra je menší než jeden pixel");
				trace("Když dohoní sýr, tak ho začne žrát.");
				zer();
				stuj();
				idNumber = setInterval(this, "ozirej", 100);
				onEnterFrame = null;
			}
		};
		nezer();
		bez();
	}
	function ozirej() {
		trace("volám ožírej");
		trace("postupně ožírá sýr");
		if (_parent.syr_mc.okousanost<1) {
			//když není sýr úplně sežrán - žeru
			_parent.syr_mc.okousanost = _parent.syr_mc.okousanost+0.1;
		} else {
			//když je úplně sežrán, přestanu žrát
			nezer();
			//vymažu periodické volání funkce "ožírej"
			clearInterval(idNumber);
			//a sýr se objeví jinde
			_parent.syr_mc.okousanost = 0;
			_parent.syr_mc._rotation = 0;
			_parent.syr_mc._x = 50;
			_parent.syr_mc._y = 50;
		}
	}
	function bezi():Number {
		trace("volám běží");
		trace("otočí se za sýrem a běží za ním, vrací vzdálenost od sýra v pixelech");
		ob1.x = this._x;
		ob1.y = this._y;
		ob1.xCil = _parent.syr_mc._x;
		ob1.yCil = _parent.syr_mc._y;
		ob1.krok = 4;
		Kutil.nastavCilObj(ob1);
		this._rotation = ob1.rotace;
		this._x = ob1.x;
		this._y = ob1.y;
		vzdálenostOdSyra = ob1.vzdalenost;
		return vzdálenostOdSyra;
	}
	function zer() {
		trace("myška žere");
		trace("sýr otočí do stejné pozice jako myš"); 
		_parent.syr_mc._rotation = this._rotation;
	}
	function nezer() {
		trace("myška nežere");
	}
	function bez() {
		trace("myška hýbe nožičkama");
	}
	function stuj() {
		trace("myška nehybe nožičkama");
	}
}

Její konečná možná podoba je např. tato:


class Mys extends MovieClip {
	//var Kutil
	var syr_mc:MovieClip;
	var cumak_mc:MovieClip;
	var predniLevaPacka_mc:MovieClip;
	var zadniLevaPacka_mc:MovieClip;
	var predniPravaPacka_mc:MovieClip;
	var zadniPravaPacka_mc:MovieClip;
	var ob1:Object = new Object();
	var idNumber:Number;
	function Mys() {
	}
	function bez() {
		trace("volám bez");
		predniLevaPacka_mc.bez();
		zadniLevaPacka_mc.bez();
		predniPravaPacka_mc.bez();
		zadniPravaPacka_mc.bez();
	}
	function stuj() {
		trace("volám stuj");
		predniLevaPacka_mc.stuj();
		zadniLevaPacka_mc.stuj();
		predniPravaPacka_mc.stuj();
		zadniPravaPacka_mc.stuj();
	}
	function bezZaSyrem() {
		trace("volán bezZaSyrem");
		var n:Number;
		onEnterFrame = function () {
			n = bezi();
			trace("vzdálenost od sýra="+n);
			if (n<1) {
				zer();
				stuj();
				idNumber = setInterval(this, "ozirej", 100);
				onEnterFrame = null;
			}
		};
		nezer();
		bez();
	}
	function nechTenSyr() {
		trace("volám nechTenSyr");
		this.onEnterFrame = null;
		clearInterval(idNumber);
		nezer();
		stuj();
	}
	function zer() {
		trace("volám žer");
		cumak_mc.zer();
		_parent.syr_mc._rotation = this._rotation;
	}
	function ozirej() {
		trace("volám ožírej");
		if (_parent.syr_mc.okousanost<1) {
			//když není sýr úplně sežrán - žeru
			_parent.syr_mc.okousanost = _parent.syr_mc.okousanost+0.1;
		} else {
			//když je úplně sežrán, přestanu žrát
			nezer();
			//vymažu periodické volání funkce "ožírej"
			clearInterval(idNumber);
			//a sýr se objeví jinde
			_parent.syr_mc.okousanost = 0;
			_parent.syr_mc._rotation=0;
			_parent.syr_mc._x = 50;
			_parent.syr_mc._y = 50;
		}
	}
	function nezer() {
		trace("volám nežer");
		cumak_mc.nezer();
	}
	function bezi():Number {
		trace("volám běží");
		ob1.x = this._x;
		ob1.y = this._y;
		ob1.xCil = _parent.syr_mc._x;
		ob1.yCil = _parent.syr_mc._y;
		ob1.krok = 4;
		Kutil.nastavCilObj(ob1);
		this._rotation = ob1.rotace;
		this._x = ob1.x;
		this._y = ob1.y;
		return ob1.vzdalenost;
	}
}

zdrojový text příkladu

vyuka/mys_a_syr.txt · Poslední úprava: 2007/06/06 00:45 autor: kofranek