-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathShikao.as
141 lines (109 loc) · 3.89 KB
/
Shikao.as
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
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.EventDispatcher;
public class Shikao extends MovieClip {
private var offsetX; //フィールドの開始点_X
private var offsetY; //フィールドの開始点_Y
private var fieldW; //フィールドひとますの幅
private var fieldH; //フィールドひとますの高さ
private var targetX,targetY; //移動先の座標
private var moveX = 4; //X移動量基準
private var moveY = 4; //Y移動量基準
private var moveX_Amount; //1フレーム毎のX移動量
private var moveY_Amount; //1フレーム毎のY移動量
public var pos = new Array() //しかおのポジション
public var newPos = new Array() //しかおのポジション
public var oldPos = new Array() //しかおのポジション
public var move_stack = new Array(); //移動のスタック
public var shika_direction; //しかおの向き( 0:下 , 1:左 , 2:上 , 3:右 )
public var moveFinish = new Event("moveFinish"); //移動終了イベント
public var stackFinish = new Event("stackFinish"); //移動のスタック全終了イベント
public var moveHalf = new Event("moveHalf"); //半分移動したというイベント
public function Shikao(_offsetX,_offsetY,_fieldW,_fieldH) {
//初期設定
offsetX = _offsetX-10;
offsetY = _offsetY+10;
fieldW = _fieldW;
fieldH = _fieldH;
//初期位置の設定
pos = [0,0];
oldPos = [0,0];
this.x=offsetX;
this.y=offsetY;
//移動用のイベントをバインド
addEventListener("moveFinish",function(){
move();
});
}
//スタック追加
public function addMoveStack(_x,_y){
move_stack.push([_x,_y]);
}
//移動ストップ用関数
public function moveStop(){
move_stack = new Array();
}
//移動の設定関数
public function move(){
if(move_stack[0]){
//移動先の座標軸を変更
targetX = move_stack[0][0]*fieldW+offsetX;
targetY = move_stack[0][1]*fieldH+offsetY;
//1フレームの移動量を計算
moveX_Amount = (Number(this.x - targetX < 0)-Number(this.x - targetX >0)) * moveX;
moveY_Amount = (Number(this.y - targetY < 0)-Number(this.y - targetY >0)) * moveY;
//向きの変更
if(moveX_Amount<0){
this.gotoAndPlay(22);
shika_direction=1;
}else if(moveX_Amount>0){
this.gotoAndPlay(66);
shika_direction=3;
}else if(moveY_Amount<0){
this.gotoAndPlay(44);
shika_direction=2;
}else{
this.gotoAndPlay(1);
shika_direction=0;
}
//1フレーム分だけ止まるので先に動かす
this.x += moveX_Amount;
this.y += moveY_Amount;
//移動イベントをエンターフレームに
addEventListener(Event.ENTER_FRAME,mover);
//新しいポジションを記憶
newPos=move_stack[0];
//今の移動ポイントを削除
move_stack.shift();
}else{
this.dispatchEvent(stackFinish);
this.stop();
}
}
//移動用関数
public function mover(e){
//その場所についたかどうかを判断 *斜め移動すると詰む
if(Math.abs(moveX_Amount) > Math.abs(this.x-targetX) || Math.abs(moveY_Amount) > Math.abs(this.y-targetY)){
//
this.x=targetX;
this.y=targetY;
//移動をストップ
removeEventListener(Event.ENTER_FRAME,mover);
//しかおを正面に向かせる
this.gotoAndPlay(1);
//ポジション情報を更新
oldPos=pos;
pos=newPos;
//移動完了をディスパッチ
this.dispatchEvent(moveFinish);
}else{
this.x += moveX_Amount;
this.y += moveY_Amount;
}
if(Math.abs(this.x-targetX) != 0 && Math.abs(this.x-targetX) < 50 || Math.abs(this.y-targetY) != 0 && Math.abs(this.y-targetY) < 50){
this.dispatchEvent(moveHalf);
}
}
}
}