Flash Professional에서 프레임에 직접 입력하였다.

스테이지에 btn0부터 btn15까지 16개의 버튼이 미리 배치되어 있다.


키보드 방향키로 상하좌우 이동을 하며 엔터 키로 버튼을 누를 수 있다.

코드는 아래에...


 





윈도우 바탕화면에서 아이콘을 키보드로 포커싱하는 것과 비슷하게 동작하도록 했다.
화면에 배치되어 있는 무비클립 객체들의 위치관계를 파악하여 각 방향으로
유출이 가능한지 여부에 대한 유향그래프를 생성한다.
그렇기 때문에 스테이지에서나 스크립트로 버튼의 배치를 바꿔도 
버튼들의 위치관계를 계산하여 문제없이 키보드 초점이동을 할 수 있다. 


코드 :

Hello SyntaxHighlighter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import flash.events.KeyboardEvent;
import flash.display.DisplayObject;
import flash.filters.DisplacementMapFilter;
 
const MAX_BTN:int = 16;
const RIGHT:int = 0;
const LEFT:int = 1;
const UP:int = 2;
const DOWN:int = 3;
 
var pressedKey:Array = new Array();
var lastKey:int;
var moveGraph:Array = new Array(MAX_BTN);
var focus:int = 0;
var time:int=0;
 
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown_h);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp_h);
 
setFocus(0);
updateMoveGraph();
 
 
function keyDown_h(evt:KeyboardEvent):void
{
    if(getTimer()-time<50 && lastKey==evt.keyCode) return;
    time = getTimer();
    lastKey = evt.keyCode;
    //if(pressedKey[evt.keyCode] == true) return;
        switch(evt.keyCode) {
            case Keyboard.RIGHT:
            case Keyboard.LEFT:
            case Keyboard.UP:
            case Keyboard.DOWN:
                moveFocus(evt.keyCode);
                break;
            case Keyboard.ENTER:
                selectBtn();
                 
        }
    pressedKey[evt.keyCode] = true;
}
 
function keyUp_h(evt:KeyboardEvent):void
{
    pressedKey[evt.keyCode] = false;
    if(evt.keyCode == Keyboard.ENTER) this["btn"+focus].gotoAndStop("over");
}
 
 
function moveFocus(key:uint):void
{
    if(key == Keyboard.RIGHT) {
        setFocus(moveGraph[focus][RIGHT]);
    }
    else if(key == Keyboard.LEFT) {
        setFocus(moveGraph[focus][LEFT]);
    }
    else if(key == Keyboard.UP) {
        setFocus(moveGraph[focus][UP]);
    }
    else if(key == Keyboard.DOWN) {
        setFocus(moveGraph[focus][DOWN]);
    }
     
}
 
 
function updateMoveGraph():void
{
    var i:int, j:int;
    var dx:Number, dy:Number;
     
    for(i=0; i<MAX_BTN; i++) {
        moveGraph[i] = new Array(4);
        moveGraph[i][RIGHT] = -1;
        moveGraph[i][LEFT] = -1;
        moveGraph[i][UP] = -1;
        moveGraph[i][DOWN] = -1;
    }
    for(i=0; i<MAX_BTN; i++) {
        for(j=0; j<MAX_BTN; j++) {
            if(i==j) continue;
             
            dx = this["btn"+i].x - this["btn"+j].x
            dy = this["btn"+i].y - this["btn"+j].y
             
            if(dx<0 && dx*dx>dy*dy) {
                if(moveGraph[i][RIGHT] == -1)  moveGraph[i][RIGHT] = j;
                else if(getNear(this["btn"+i],this["btn"+j],this["btn"+moveGraph[i][RIGHT]]) == 1) {
                    moveGraph[i][RIGHT] = j;
                }
            }
             
            else if(dx>0 && dx*dx>dy*dy) {
                if(moveGraph[i][LEFT] == -1)  moveGraph[i][LEFT] = j;
                else if(getNear(this["btn"+i],this["btn"+j],this["btn"+moveGraph[i][LEFT]]) == 1) {
                    moveGraph[i][LEFT] = j;
                }
            }
             
            else if(dy>0 && dx*dx<dy*dy) {
                if(moveGraph[i][UP] == -1)  moveGraph[i][UP] = j;
                else if(getNear(this["btn"+i],this["btn"+j],this["btn"+moveGraph[i][UP]]) == 1) {
                    moveGraph[i][UP] = j;
                }
            }
             
            else if(dy<0 && dx*dx<dy*dy) {
                if(moveGraph[i][DOWN] == -1)  moveGraph[i][DOWN] = j;
                else if(getNear(this["btn"+i],this["btn"+j],this["btn"+moveGraph[i][DOWN]]) == 1) {
                    moveGraph[i][DOWN] = j;
                }
            }
             
        }
    }
}
 
 
function getNear(src:DisplayObject, dest1:DisplayObject, dest2:DisplayObject):int
{
    var distance1:Number;
    var distance2:Number;
    distance1 = (src.x-dest1.x)*(src.x-dest1.x)+(src.y-dest1.y)*(src.y-dest1.y);
    distance2 = (src.x-dest2.x)*(src.x-dest2.x)+(src.y-dest2.y)*(src.y-dest2.y);
    if(distance1<distance2) return 1;
    else if (distance1>distance2) return -1;
    return 0;
}
 
 
function setFocus(num:int):void
{
    if(num==-1) return;
    this["btn"+focus].gotoAndStop("up");
    focus = num;
    this["btn"+focus].gotoAndStop("over");
}
 
function selectBtn():void
{
    if(pressedKey[Keyboard.ENTER] != true) {
        this["btn"+focus].gotoAndStop("down");
    }
     
    if(focus==0) {
        //...
    }
    if(focus==1) {
        //...
    }
    if(focus==2) {
        //...
    }
    if(focus==3) {
        //...
    }
     
    //...
    //...
    //...
}


===================================================







저해상도 RGB모니터효과 플래시.


- 순서

1. 플래시

2. 미리보기

3. 소스코드




1. 플래시






2. 미리보기













3. 소스코드


package  {
	import flash.display.BitmapData;
	import flash.display.Bitmap;
	import flash.display.MovieClip;
	import flash.net.FileReference;
	import flash.net.FileFilter;
	import flash.events.Event;
	import flash.utils.ByteArray;
	import flash.display.Loader;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.display.DisplayObjectContainer;	
	
	public class TVeffect extends MovieClip{
		
		public function TVeffect() {
			
			var file:FileReference = new FileReference();
			file.addEventListener(Event.SELECT,onSelected);
			var loadedBytes:ByteArray;
			var image:Loader = new Loader();
			var container:MovieClip = new MovieClip();
			
			var tf1:TextField = new TextField();
			tf1.autoSize = TextFieldAutoSize.LEFT;
			tf1.x = tf1.y = 200;
			tf1.text = "화면을 눌러서 그림파일을 선택하세요.";
			addChild(tf1);
			var tf2:TextField = new TextField();
			tf2.autoSize = TextFieldAutoSize.LEFT;
			tf2.x = tf2.y = 450;
			tf2.text = "http://tibyte.kr";
			addChild(tf2);
			addChild(container);
			
			stage.addEventListener(MouseEvent.CLICK, onClick);
			function onClick(evt:MouseEvent):void
			{
				file.browse([new FileFilter("image file (JPG, JPEG, GIF, PNG)","*.jpg;*.jpeg;*.gif;*.png")]);
			}
			function onSelected(evt:Event):void
			{
				evt.target.load();
				evt.target.addEventListener(Event.COMPLETE, onCompleted);
			
			}
			
			function onCompleted(evt:Event):void
			{
				loadedBytes = evt.target.data;
				image.contentLoaderInfo.addEventListener(Event.INIT,onInited);
				image.loadBytes(loadedBytes);
			}
			
			
			function onInited(evt:Event):void
			{
				removeChildAll(container);
				var bmp:Bitmap = evt.target.content as Bitmap;
				container.addChild(bmp);
				for(var i_x:int = 0; i_x<bmp.bitmapData.width; i_x++){
					for(var i_y:int = 0; i_y<bmp.bitmapData.height; i_y++) {
						bmp.bitmapData.setPixel(i_x,i_y,bmp.bitmapData.getPixel(i_x,i_y)&0x0000ff<<(i_x%3)*8);
					}
				}
			}
			
			function removeChildAll(container:DisplayObjectContainer):void
			{
				for(var i:int=0; i<container.numChildren; i++) {
					container.removeChildAt(i);
				}
			}
				
		}
	
	}
	
}

 








연습작입니다

화면을 클릭해서 소리를 켜고 끌 수 있습니다



구작을 약간 수정한 것입니다









- 액션스크립트2.0, 플래시8 에서 열 수 있습니다.
- 스테이지 크기와 상관없습니다.
- 낙하속도는 fps28 기준으로 된 속도이며, 무비클립 안의 1프레임액션의 속도공식을 고치면 속도변경을 할 수 있습니다.
- 눈덩이의 생성갯수 역시, 무비클립 안의 1프레임액션의 맨 밑부분에 있습니다.
- 라이브러리에서 '눈덩이1'과 눈덩이1 그래픽' 을 복제(duplicate)해서 새로운 눈덩이 패턴을 추가할 수 있습니다. (복사(copy)가 아님에 유의!)
- 눈덩이 그래픽에 크기조절 밑 회전 애니메이션을 적용하면 속도가 지연될 수 있습니다.







플래시에서 무비 테스트(Test Movie , Ctrl+Enter)를 실행할 때.
키보드 입력을 처리하도록 되어 있는 무비의 경우, 키보드를 누르면
플래시의 각종 단축키가 동작하는 경우가 있습니다. (h키, m키 , t키, F1~F9키 등등)
이것이 동작하지 않게 하고 싶으면 아래 그림과 같이 Disable Keyboard Shotcuts에 체크해 주면 됩니다.



const MIN:int = 0;
const MAX:int = 400;

Math.min(Math.max(변수,MIN),MAX))
상수 MIN과 MAX를 지정하고
위와 같은 식을 통해 변수의 범위를 제한할 수 있습니다.

MIN값이 0이고 MAX값이 400일 때
변수가 200이면 그대로 200이고,
변수가 -100 이면 MIN값인 0,
변수가 500이면 MAX값인400이 됩니다.

어디에 활용할 수 있는지는 나중에..

 

 이 게시글의 일부 혹은 전체 내용에 대하여
저작자의 허락 없는 사용을 금지합니다.


 

액션스크립트를 Flash에서 직접작성할 때
Stage.를 입력하면 코드힌트가 나옵니다.
하지만 Stage 클래스는 DisplayObject인스턴스의 stage 속성을 통해 접근해야하기 때문에
소문자인 stage로 입력해야하는데 이렇게하면 코드힌트가 나오지 않습니다.





(윈도) 컴퓨터의 C:\Documents and Settings 경로에서 현재 유저가 쓰고 있는 이름의 폴더를 들어가서
Local Settings\Application Data\Adobe\Flash CS3 의 경로로 다시 들어갑니다.
언어에 맞는 폴더를 선택하고 \Configuration\ActionsPanel\ActionScript_3 의 경로로 추가로 들어가면

ActionsPanel_3.xml 이라는 xml파일이 있습니다.

xml 파일의 밑부분에 있는 codehints노드를 살펴보면,

  <typeinfo pattern="*_array" object="Array" />
  <typeinfo pattern="*_str" object="String" />
  <typeinfo pattern="*_btn" object="flash.display.SimpleButton" />
  <typeinfo pattern="*_txt" object="flash.text.TextField" />
  <typeinfo pattern="*_fmt" object="flash.text.TextFormat" />
.
.
.

위와 같이 접미어로 코드힌드를 나오게 하는 부분이 있는데 그 밑부분에
 <typeinfo pattern="stage" object="flash.display.Stage" />
이라고 추가하면,



아래 그림과 같이 코드힌트가 뜨게됩니다.









다른 툴로 스크립팅 하시는분이면 필요없겠네요.





false

+ Recent posts