FLASH
(teraz już Animate)
Przydatne kawałki Action Scriptu
Załączone pliki wymagają Adobe Flash w wersji CS 5.0 lub nowszej
/ Adobe Animate CC.
-> Action Script 2
->
Action Script 3
Kanał na YouTube na którym umieszczam wideotutoriale związane
również z poniższą tematyką: https://www.youtube.com/channel/UCs0RbGqVCqTd6lzavN1cYcw/videos
.
UWAGA!
Od września 2018 r. wtyczka AdobeAIR dla urządzeń pracujących
pod kontrolą systemu Android nie jest już dostępna via Sklep
Google/Play.
W celu jej zainstalowania należy:
• W
"Ustawienia" -> "Zabezpieczenia" zezwolić na instalację
aplikacji z nieznanych źródeł.
•
Pobrać instalator wtyczki AIR.
Najnowsza wersja AIR 4 Android jest do pobrania stąd:
https://adobe-air.softonic.pl/android
lub
https://apkpure.com/pl/adobe-air/com.adobe.air
lub
https://www.techspot.com/downloads/5254-adobe-air-for-android.html#download_scroll
lub
https://downloads.digitaltrends.com/adobe-air/android
zawsze też
można poszukać kopii tutaj: www.qba.4x.com.pl/flash/wersja25dlaAndroida.zip
starszą
wersję można znaleźć tutaj:
https://play.google.com/store/apps/details?id=air.Air4Android&hl=pl&gl=US
• Zainstalować wtyczkę AdobeAIR.
Action Script 2
01
Sterownie
przez klawiaturę MC „gracz”
Umieszczamy w obiekcie „gracz”
on (keyPress "q") { _y = _y - 5}
on (keyPress "z") { _y = _y + 5}
on (keyPress "i") { _x = _x - 5}
on (keyPress "p") { _x = _x + 5}
pobierz przykład (CS 5)
02
Sterownie
przez klawiaturę MC „gracz” („gracz” nie przekracza krawędzi
ekranu (550x400))
Umieszczamy w obiekcie „gracz”
on (keyPress "q") { _y = _y - 5 ; if (_y <= 0) { _y = 1} }
on (keyPress "z") { _y = _y + 5 ; if (_y >= 400) { _y = 399}
}
on (keyPress "i") { _x = _x - 5 ; if (_x <= 0) { _x = 1} }
on (keyPress "p") { _x = _x + 5 ; if (_x >= 550) { _x = 549}
}
pobierz przykład (CS 5)
03
Sterownie przez klawiaturę MC gracz (gracz przechodzi na
przeciwległą krawędź (550x400))
Umieszczamy w obiekcie „gracz”
on (keyPress "q") { _y = _y - 5 ; if (_y <= 0) { _y = 399} }
on (keyPress "z") { _y = _y + 5 ; if (_y >= 400) { _y = 1} }
on (keyPress "i") { _x = _x - 5 ; if (_x <= 0) { _x = 549} }
on (keyPress "p") { _x = _x + 5 ; if (_x >= 550) { _x = 1} }
pobierz przykład (CS 5)
04
Generowanie
zmiennej globalnej „liczba” o wartości 5 (i jej wyświetlenie
poprzez trace)
_global.liczba = 5; trace (liczba)
trace
pobierz przykład (CS 5)
05
Generowanie
zmiennej globalnej „liczba” o wartości 5 w MC
onClipEvent (enterFrame) { _global.liczba = 5 ; trace (liczba) }
pobierz przykład (CS 5)
06
Generowanie
zmiennej globalnej „liczba” o wartości losowej z zakresu 0-6 w
MC
onClipEvent (enterFrame) { _global.liczba = random (7) ; trace
(liczba) }
pobierz przykład (CS 5)
07
Stały ruch
MC w dwóch płaszczyznach (obiekt przechodzi na przeciwległą
krawędź (550x400))
onClipEvent (enterFrame) { _y = _y - 2 ; if (_y <= 0) { _y =
400 } }
onClipEvent (enterFrame) { _x = _x - 3 ; if (_x <= 0) { _x =
550 } }
pobierz przykład (CS 5)
08
Obiekt
samonaprowadzający się na obiekt „cel”
onClipEvent (enterFrame) { if (_root.cel._y < _y) { _y = _y
-1}}
onClipEvent (enterFrame) { if (_root.cel._x < _x) { _x = _x
-1}}
onClipEvent (enterFrame) { if (_root.cel._y > _y) { _y = _y
+1}}
onClipEvent (enterFrame) { if (_root.cel._x > _x) { _x = _x
+1}}
pobierz przykład (CS 5)
09
Wykrycie
kolizji (obszarowej)
Umieszczamy w obiekcie „gracz”, wykrywa kolizję z obiektem
„przeszkoda”
onClipEvent (enterFrame) {if (this.hitTest(_root.przeszkoda) ==
true) { trace("kolizja") }}
pobierz przykład (CS 5)
10
Wykrycie
kolizji (obrysu)
Umieszczamy w obiekcie „gracz”, wykrywa kolizję z obiektem
"przeszkoda"
zderzenie pozycji x i y obiektu red z obrysem blue
onClipEvent (enterFrame) {if (_root.przeszkoda.hitTest(_x,
_y, true )) { trace("kolizja")}}
pobierz przykład (CS 5)
11
MC "gracz"
chodzi za kursorem
onClipEvent (enterFrame) {if (_ymouse <= _y ) { _y = _y
- 3 }}
onClipEvent (enterFrame) {if (_ymouse >= _y ) { _y = _y
+ 3 }}
onClipEvent (enterFrame) {if (_xmouse <= _x ) { _x = _x
- 3 }}
onClipEvent (enterFrame) {if (_xmouse >= _x ) { _x = _x
+ 3 }}
pobierz przykład (CS 5)
Action Script 3
Pamiętaj, że pliki publikowane do postaci aplikacji na
urządzenia mobilne pracujące pod kontrolą systemów iOS i Android
wymagają posiadania przez użytkownika darmowej wtyczki AIR.
Wtyczkę taką użytkownik iOS może pobrać ze sklepu Apple, zaś
użytkownik Androida ze sklepu Googla (w Polsce Play-a) lub np.
stąd: link.
01
Sterowanie
klawiszami kursora obiektu "gracz"
Lepsza wersja w przykładzie 18!
var checkmove:Boolean;
var keycode:Number=0;
addEventListener(Event.ENTER_FRAME,enterframe);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keydown);
stage.addEventListener(KeyboardEvent.KEY_UP,keyup);
function keyup(arg:KeyboardEvent):void {checkmove=false;}
function keydown(event:KeyboardEvent):void
{keycode=event.keyCode;movingcheck();}
function movingcheck():void {checkmove=true;}
function enterframe(arg:Event):void {
if (keycode==Keyboard.RIGHT &&
checkmove==true) {gracz.x+=5;}
if (keycode==Keyboard.LEFT &&
checkmove==true) {gracz.x-=5;}
if (keycode==Keyboard.UP &&
checkmove==true) {gracz.y-=5;}
if (keycode==Keyboard.DOWN &&
checkmove==true) {gracz.y+=5;}
}
pobierz przykład (CS 5)
Sterowanie
klawiszami kursora obiektu "gracz" (inny wariant)
Lepsza wersja w przykładzie 18!
stage.addEventListener(KeyboardEvent.KEY_DOWN,
fl_PressKeyToMove);
function fl_PressKeyToMove(event:KeyboardEvent):void
{switch (event.keyCode)
{
case Keyboard.UP:{gracz.y -= 5;break;}
case Keyboard.DOWN:{gracz.y += 5;break;}
case Keyboard.LEFT:{gracz.x -= 5;break;}
case Keyboard.RIGHT:{gracz.x += 5;break;}
}
}
pobierz przykład (CS 5)
02
Sterowanie
klawiszami alfanumerycznymi (w przykładzie: q, a, o, p)
obiektu "gracz"
Lepsza wersja w przykładzie 18!
var checkmove:Boolean;
var keycode:Number=0;
addEventListener(Event.ENTER_FRAME,enterframe);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keydown);
stage.addEventListener(KeyboardEvent.KEY_UP,keyup);
function keyup(arg:KeyboardEvent):void {checkmove=false;}
function keydown(event:KeyboardEvent):void
{keycode=event.keyCode;movingcheck();}
function movingcheck():void {checkmove=true;}
function enterframe(arg:Event):void {
if (keycode==Keyboard.O &&
checkmove==true) {gracz.x+=5;}
if (keycode==Keyboard.P &&
checkmove==true) {gracz.x-=5;}
if (keycode==Keyboard.Q &&
checkmove==true) {gracz.y-=5;}
if (keycode==Keyboard.A &&
checkmove==true) {gracz.y+=5;}
}
pobierz przykład (CS 5)
03
Sterowanie
klawiszami kursora + shift (jako dopalacz)
źródło oryginału: https://coursesweb.net/actionscript/keyboard-events
Lepsza wersja w przykładzie 18!
stage.addEventListener(KeyboardEvent.KEY_DOWN, ruchTWOspeed);
function ruchTWOspeed(key_evt:KeyboardEvent):void
{
// tu klawisz shift zmienia prędkość
var vi:int = key_evt.shiftKey ? 12 : 2;
switch (key_evt.keyCode)
{
case 37:
gracz.x -= vi;
break;
case 39:
gracz.x += vi;
break;
case 38:
gracz.y -= vi;
break;
case 40:
gracz.y += vi;
break;
default:
break;
}
}
04
Deaktywacja
zdarzeń z aplikacji po jej wyłączeniu (np: wyłączenie dźwięku)
- przykład dla procesorów typu ARM
if(Capabilities.cpuArchitecture=="ARM"){NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE,
handleDeactivate, false, 0, true);}
function handleDeactivate(event:Event):void {
NativeApplication.nativeApplication.exit();}
05
Wykrywanie
kolizji (prostokątnych obwiedni MC)
stage.addEventListener(Event.ENTER_FRAME, detectHit);
function detectHit(e:Event)
:void{if(gracz.hitTestObject(przeszkoda)){ gracz.x = gracz.x -
30}}
pobierz przykład (CS
5)
06
Przemieszczanie
obiektu (w tym wypadku w prawo)
gracz.addEventListener(Event.ENTER_FRAME, fl_przesun);
function fl_przesun(event:Event) {gracz.x += 10;}
pobierz przykład (CS 5)
07
Przeciąganie
horyzontalne obiektu dwoma palcami na ekranie dotykowym
(panoramowanie)
pobierz przykład
(CS6)
08
Przesuwanie
ekranów w aplikacji mobilnej z użyciem machnięcia/swipe.
pobierz przykład (CS6)
09
Rozwijane
menu.
pobierz przykład (CS6)
10
Interaktywna
panorama
wersja sterowana pozycją myszy
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);
function fl_EnterFrameHandler(event:Event):void
{
drzewa.x = mouseX
gory.x = mouseX * 0.5
niebo.x = mouseX * 0.2 + 150
};
stop();
pobierz
przykład (CS5)
11
Interaktywna
panorama
wersja sterowana pozycją myszy (użycie zmiennej)
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);
function fl_EnterFrameHandler(event:Event):void
{
var pozycja:int;
pozycja = mouseX;
drzewa.x = pozycja;
gory.x = pozycja * 0.5;
niebo.x = pozycja * 0.2 + 150;
};
stop();
pobierz
przykład (CS5)
12
Wykonywanie
połączeń telefonicznych i wysyłanie SMSów w środowisku Android
//definiujemy numer telefonu
const callURL:String="tel:1234567890";
//tworzymy żądanie zawierające wybrany numer
var targetURL:URLRequest = new URLRequest(callURL);
//wysyłamy numer do aplikacji telefonicznej na naszym urządzeniu
navigateToURL(targetURL);
//definiujemy numer telefonu odbiorcy
wiadomości
const callURL:String="sms:1234567890";
//tworzymy żądanie zawierające wybrany numer
var targetURL:URLRequest = new
URLRequest(callURL);
//wysyłamy numer do aplikacji zarządzającej
SMSami na naszym urządzeniu (zapewne zgłosi więcej niż jedna)
navigateToURL(targetURL);
pobierz przykład (Animate CC
2018/19)
13
Mechanizm
gry w spadające obiekty.
pobierz przykład (Flash
CS5 i nowsze)
14
Aplikacja
Adobe AIR na urządzenia mobilne.
Jak stworzyć nowy dokument do pracy na urządzeniach mobilnych.
Jak opublikować go do postaci instalera aplikacji Adobe AIR dla
platformy Android.
Wideotutorial:
https://www.youtube.com/watch?v=MR-05T4uJ8I&t=274s
15
Jak
wyłączyć ENTER_FRAME?
Aby pozbyć się zapętlonego ENTER_FRAME (np. po przejściu do
innej sceny) można zastosować np:
//wyłącza ENTER_FRAME
this.removeEventListener(Event.ENTER_FRAME,
fl_EnterFrameHandler);
//przenosi do kolejnej sceny
MovieClip(this.root).gotoAndPlay(1, "Scene
3");
W razie kilku ENTER_FRAME należy wyłączyć każdy z osobna
zmieniając "fl_EnterFrameHandler" na nazwy kolejnych
niechcianych funkcji.
16
Jak
wyłączyć przeciągnij i upuść?
stage.removeEventListener(MouseEvent.MOUSE_DOWN,
fl_ClickToDrag);
stage.removeEventListener(MouseEvent.MOUSE_UP,
fl_ReleaseToDrop);
17
Jak
wyłączyć test kolizji?
stage.removeEventListener(Event.ENTER_FRAME, detectHit);
18
Sterowanie
ruchem gracza dowolnymi klawiszami.
function reportKeyDown(event: KeyboardEvent): void {
trace("nacisnieto: " +
String.fromCharCode(event.charCode) + " (kod: " + event.charCode
+ ")");;
}
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
stage.addEventListener(KeyboardEvent.KEY_DOWN, ruchTWOspeed);
function ruchTWOspeed(key_evt: KeyboardEvent): void {
// tu klawisz shift zmienia prędkość
var ruchipredkosc: int = key_evt.shiftKey ?
12 : 2;
// ponizsze kody ustawione sa na klawisze
kursora
// zmieniajac ich numery na te z informacji
typu
// "nacisnieto: Q (kod: 113)"
// uzyskasz aktywacje innymi klawiszami
switch (key_evt.keyCode) {
case 37:
gracz.x
-= ruchipredkosc;
break;
case 39:
gracz.x
+= ruchipredkosc;
break;
case 38:
gracz.y
-= ruchipredkosc;
break;
case 40:
gracz.y
+= ruchipredkosc;
break;
default:
break;
}
}
//aby dzialalo, po uruchomieniu przykladu kliknij w okno z gra
19
Jak
umieścić tekst w okienku tekstowym
Utwórz tekst, zmień go na dynamiczny, nadaj mu nazwę wystąpienia
(w tym przykladzie "tekst1").
Wykorzystaj poniższy kod:
// definicja zmiennej będącej ciągiem znaków alfanumerycznych
var tekstdonapisania:String ;
// nadanie zawartości zmiennej
tekstdonapisania= "coś";
// umieszczenie zawartości zmiennej w dynamicznym oknie
tekstowym
tekst1.text = tekstdonapisania ;
20
Jak
umieścić wartość numeryczną w oknie tekstowym
Utwórz tekst, zmień go na dynamiczny, nadaj mu nazwę wystąpienia
(w tym przykladzie "tekst1").
Wykorzystaj poniższy kod:
// definicja zmiennej będącej wartością numeryczną
var numer: Number ;
// nadanie wartości zmiennej numerycznej
numer = 123 ;
// definicja zmiennej przechowującej ciąg alfanumeryczny
var tekstdonapisania:String ;
// nadanie zawartości zmiennej
tekstdonapisania= numer+"" ;
// umieszczenie zawartości zmiennej w dynamicznym oknie
tekstowym
tekst1.text = tekstdonapisania ;
21
Jak
wykrywać kolizje faktycznego kształtu, a nie obwiedni
Utwórz dwa MovieClipy o nazwach "gracz" i "labirynt".
Wykorzystaj poniższy kod:
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);
function fl_EnterFrameHandler(event:Event):void
{ if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja");} }
Za każdym razem gdy wartości położenia (x i y) obiektu "gracz"
dotkną grafiki w obiekcie "labirynt" - zostanie wykryta kolizja
obwieszczana komunikatem "kolizja" w oknie Wyjście/Output.
22
Blokada
dezaktywowana pinem wprowadzanym w okno tekstu dynamicznego
Utwórz tekst, zmień go na input (wejściowy), nadaj mu nazwę
wystąpienia "tekstpin".
Pinem jest "123"
Utwórz przycisk (zatwierdzający wprowadzony pin), nadaj mu nazwę
wystąpienia "dalej".
W klatce 10 umieść informację o wprowadzeniu błędnego pinu, a w
15 o pinie poprawnym.
var
danepinu:Array = [["PIN","123"]];
var i:Number=0;
function ustawieniepinu():void {
tekstpin.text = danepinu[i][0];
dalej.addEventListener(MouseEvent.CLICK, clickHandler);
};
ustawieniepinu();
function clickHandler(event:MouseEvent):void
{
var poprawnypin:String;
var wprowadzonypin:String;
wprowadzonypin = tekstpin.text;
poprawnypin = danepinu[i][1];
if (wprowadzonypin == poprawnypin) {
trace("dobry"); gotoAndStop(15);} else {trace("bledny");
gotoAndStop(10);}
};
23
Mechanizm
gry labiryntowej
Utwórz MC "gracz" i "labirynt". Pamiętaj by grubość ścian
labiryntu była wyraźnie grubsza niż największy dopuszczalny
wektor ruchu, zaś szerokość korytarzy od grubości ścian.
stop();
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);
function fl_EnterFrameHandler(event:Event):void
{
// sprawdzamy czy kursor jest wyraznie w lewo od gracza, jesli
tak idzie on w lewo
if (gracz.x > mouseX + 50) { gracz.x = gracz.x - 1 ; trace
("ruch w lewo"); };
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w lewo"); gracz.x = gracz.x + 1.1
}
// sprawdzamy czy kursor jest wyraznie w prawo od gracza, jesli
tak idzie on w prawo
if (gracz.x < mouseX - 50) { gracz.x = gracz.x + 1 ; trace
("ruch w prawo");};
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w prawo"); gracz.x = gracz.x
-1.1}
// sprawdzamy czy kursor jest wyraznie w gore od gracza, jesli
tak idzie on w gore
if (gracz.y > mouseY + 50) { gracz.y = gracz.y - 1 ; trace ("ruch w gore"); };
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w gore"); gracz.y = gracz.y +1.1 }
// sprawdzamy czy kursor jest wyraznie w dol od gracza, jesli
tak idzie on w dol
if (gracz.y < mouseY - 50) { gracz.y = gracz.y + 1 ; trace ("ruch w dol"); };
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w dol"); gracz.y = gracz.y -1.1
}
}
24
Mechanizm
gry labiryntowej + animacja postaci w zależności od kierunku
ruchu
Jak w 23 tylko należy dodać cztery MC zawierającze animacje
zapętlonego ruchu gracza.
stop();
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);
function fl_EnterFrameHandler(event:Event):void
{
// MC z animacjami ruchu pozycjonowane są na pozycji obiektu
"gracz"
graczLEWO.x = gracz.x
graczPRAWO.x = gracz.x
graczTYL.x = gracz.x
graczPRZOD.x = gracz.x
graczLEWO.y = gracz.y
graczPRAWO.y = gracz.y
graczTYL.y = gracz.y
graczPRZOD.y = gracz.y
// sprawdzamy czy kursor jest wyraznie w lewo od gracza, jesli
tak idzie on w lewo
if (gracz.x > mouseX + 50) { gracz.x = gracz.x - 1 ; trace
("ruch w lewo"); gracz.alpha = 0 ; graczLEWO.alpha = 1 ;
graczPRAWO.alpha = 0 ; graczTYL.alpha = 0 ; graczPRZOD.alpha = 0
;};
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w lewo"); gracz.x = gracz.x + 1.1
}
// sprawdzamy czy kursor jest wyraznie w prawo od gracza, jesli
tak idzie on w prawo
if (gracz.x < mouseX - 50) { gracz.x = gracz.x + 1 ; trace
("ruch w prawo"); gracz.alpha = 0 ; graczLEWO.alpha = 0 ;
graczPRAWO.alpha = 1 ; graczTYL.alpha = 0 ; graczPRZOD.alpha = 0
;};
// sprawdzamy czy wystapila kolizja, jezeli tak to odwracamy
wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w prawo"); gracz.x = gracz.x
-1.1}
// sprawdzamy czy kursor jest wyraznie w gore od gracza, jesli
tak idzie on w gore
if (gracz.y > mouseY + 50) { gracz.y = gracz.y - 1 ; trace
("ruch w gore");gracz.alpha = 0 ; graczLEWO.alpha = 0 ;
graczPRAWO.alpha = 0 ; graczTYL.alpha = 1 ; graczPRZOD.alpha = 0
;};
// sprawdzamy czy wystapila kolizja, jezeli
tak to odwracamy wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w gore"); gracz.y = gracz.y +1.1 }
// sprawdzamy czy kursor jest wyraznie w dol od gracza, jesli
tak idzie on w dol
if (gracz.y < mouseY - 50) { gracz.y = gracz.y + 1 ; trace
("ruch w dol"); gracz.alpha = 0 ; graczLEWO.alpha = 0 ;
graczPRAWO.alpha = 0 ; graczTYL.alpha = 0 ; graczPRZOD.alpha = 1
;};
// sprawdzamy czy wystapila kolizja, jezeli
tak to odwracamy wektor ruchu gracza
if (labirynt.hitTestPoint (gracz.x , gracz.y , true)) {
trace("kolizja przy ruchu w dol"); gracz.y = gracz.y -1.1
}
}
25)
Wyłącznik/usuwacz EnterFrame.
removeEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler)
c.d.n. :-)