PDA

Просмотр полной версии : продвинутые пятнашки


Dreel
22.06.2008, 16:04
Товарищи, подскажите плиз как заставить action script понять что все элементы находятся на своем месте.
Я пробовал в каждой ячейке вставить прзрачный мувик а в каждом элементе мозайки прописать

onClipEvent (enterFrame) {
if (_root.[невидимый объект].hitTest(_x, _y, true)) {
["Какоенить действие..."]
}
}

но это не подходит для моего случая, как рациональней сделать?
Может указать для каждого элемента необходимые координаты, если да, то как это делается?
Если поможите, то flasher станет моим любим форумом )))

Psycho Tiger
22.06.2008, 16:49
if (my_mc._x>100 && my_mc._x<105 && my_mc._y<120 && my_mc._y>115){
// :D
}

любим форумом )))
Любим форумом? Это как? о_0 Кого это вы любите всем форумом? :D

Dreel
23.06.2008, 10:17
В общем есть слой actions в нем мувик, там вставил

onClipEvent (enterFrame) {
if (Tile1._x>30 && Tile1._x<70 && Tile1._y>30 && Tile1._y<70 &&
Tile2._x>90 && Tile1._x<125 && Tile1._y>30 && Tile1._y<70 &&
Tile3._x>145 && Tile1._x<180 && Tile1._y>30 && Tile1._y<70 &&
Tile4._x>200 && Tile1._x<235 && Tile1._y>30 && Tile1._y<70 &&

Tile5._x>30 && Tile1._x<70 && Tile1._y>90 && Tile1._y<125 &&
Tile6._x>90 && Tile1._x<125 && Tile1._y>90 && Tile1._y<70 &&
Tile7._x>145 && Tile1._x<180 && Tile1._y>90 && Tile1._y<125 &&
Tile8._x>200 && Tile1._x<235 && Tile1._y>90 && Tile1._y<125 &&

Tile9._x>30 && Tile1._x<70 && Tile1._y>145 && Tile1._y<180 &&
Tile10._x>90 && Tile1._x<125 && Tile1._y>145 && Tile1._y<180 &&
Tile11._x>145 && Tile1._x<180 && Tile1._y>145 && Tile1._y<180 &&
Tile12._x>200 && Tile1._x<235 && Tile1._y>145 && Tile1._y<180 &&

Tile13._x>30 && Tile1._x<70 && Tile1._y>200 && Tile1._y<235 &&
Tile14._x>90 && Tile1._x<125 && Tile1._y>200 && Tile1._y<235 &&
Tile15._x>145 && Tile1._x<180 && Tile1._y>200 && Tile1._y<235){
gotoAndStop(2);
}
}

Не работает, помогите пожалуйста разобраться, кому не сложно :)
Для оператора if нужноновую функцию написать или как?

Или можно прописать как равно
Tile2._x=90 && Tile2._y=125
Только он ругаться начинает как правильно это прописать?

исходник
http://***************/files/124379957/______________________.fla.html

Dreel
23.06.2008, 11:28
Вот разобрался как на форум заливать, залил исходник, помогите пожалуйста... :wacko:

Psycho Tiger
23.06.2008, 12:41
Ты рехнулся в каждом кадре проверять? Пишешь функцию

function checkSomething(){

}

И в ней проверяешь после хода. И вообще глупо чужие исходники дописывать, свои надо писать с 0 в подобных случаях.

onClipEvent (enterFrame) {
if (Tile1._x>30 && Tile1._x<70 && Tile1._y>30 && Tile1._y<70 &&
Tile2._x>90 && Tile1._x<125 && Tile1._y>30 && Tile1._y<70 &&
Tile3._x>145 && Tile1._x<180 && Tile1._y>30 && Tile1._y<70 &&
Tile4._x>200 && Tile1._x<235 && Tile1._y>30 && Tile1._y<70 &&

Tile5._x>30 && Tile1._x<70 && Tile1._y>90 && Tile1._y<125 &&
Tile6._x>90 && Tile1._x<125 && Tile1._y>90 && Tile1._y<70 &&
Tile7._x>145 && Tile1._x<180 && Tile1._y>90 && Tile1._y<125 &&
Tile8._x>200 && Tile1._x<235 && Tile1._y>90 && Tile1._y<125 &&

Tile9._x>30 && Tile1._x<70 && Tile1._y>145 && Tile1._y<180 &&
Tile10._x>90 && Tile1._x<125 && Tile1._y>145 && Tile1._y<180 &&
Tile11._x>145 && Tile1._x<180 && Tile1._y>145 && Tile1._y<180 &&
Tile12._x>200 && Tile1._x<235 && Tile1._y>145 && Tile1._y<180 &&

Tile13._x>30 && Tile1._x<70 && Tile1._y>200 && Tile1._y<235 &&
Tile14._x>90 && Tile1._x<125 && Tile1._y>200 && Tile1._y<235 &&
Tile15._x>145 && Tile1._x<180 && Tile1._y>200 && Tile1._y<235){
gotoAndStop(2);
}
}
Выделил в 1 строчке, в остальных так же.
Потом нужно включить мозг и подумать, как жп проверять... Ага, придумал! Сделаем 2 вложеных цикла и в них будем проверять координаты. Будет что то вроде этого (за работоспособность не ручаюсь, мы даем пинок - рыть придетсья самому)

for (var i:Number=1; i<=4; i++){
for (var j:Number=1; j<=4; j++){
if (this["Tile"+i+"_"+"j"]._x==i*tileStep && this["Tile"+i+"_"+"j"]._y==j*tileStep){
trace('yahoo!');
}
}

Скажу более того, код не будет работать, ибо именование tile`ов как
tile = x+y*4;
это вершина непонимания для меня. Ну, ты ведь получил пинок, теперь есть куда рыть, так? ;)

Dreel
23.06.2008, 17:01
Psycho Tiger, Спасибо дружище, пойду рыть ))

iNils
23.06.2008, 19:04
Самый простой способ, это в двухмерном массиве менять индексы при движении, а потом сравнивать этот массив с "правильным"
this.lineStyle (0, 0, 0);
this.beginFill (0x666666);
this.moveTo (10, 10);
this.lineTo (140, 10);
this.lineTo (140, 140);
this.lineTo (10, 140);
this.lineTo (10, 10);
this.endFill ();
/*******************************************************************/
f = new TextFormat ("Verdana", 13, 0xFF6600, true);
f.align = "center";
/*******************************************************************/
init = function () {
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 0]];
v = [[0,-1],[0,1],[-1,0],[1,0]]
x = 3;
y = 3;
for (p = 1; p < 200;){
r = random (4);
i = x + v[r][0];
j = y + v[r][1];
if (a[i][j] and a[i][j]!= o) {
o = a[i][j];
a[i][j] = a[x][y];
a[x][y] = o;
x = i;
y = j;
p++;
}
}
v = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 0]];
p = [[],[],[],[]];
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
p[i][j] = a[i][j];
if (a[i][j] != 0) {
createEmptyMovieClip ("m" + p[i][j], p[i][j]);
this["m" + p[i][j]].lineStyle (0, 0, 0);
this["m" + p[i][j]].beginFill (0x333333);
this["m" + p[i][j]].lineTo (30, 0);
this["m" + p[i][j]].lineTo (30, 30);
this["m" + p[i][j]].lineTo (0, 30);
this["m" + p[i][j]].lineTo (0, 0);
this["m" + p[i][j]].endFill ();
this["m" + p[i][j]].createTextField ("t", 0, 0, 3, 30, 30);
this["m" + p[i][j]].t.setNewTextFormat (f);
this["m" + p[i][j]].t.text = p[i][j];
this["m" + p[i][j]].i = i;
this["m" + p[i][j]].j = j;
this["m" + p[i][j]]._y = i * 32 + 12;
this["m" + p[i][j]]._x = j * 32 + 12;
this["m" + p[i][j]].onRelease = function () {
if (p[this.i][this.j - 1] == 0) {
this._x -= 32;
o = p[this.i][this.j - 1];
p[this.i][this.j - 1] = p[this.i][this.j];
p[this.i][this.j] = o;
this.j--;
} else if (p[this.i][this.j + 1] == 0) {
this._x += 32;
o = p[this.i][this.j + 1];
p[this.i][this.j + 1] = p[this.i][this.j];
p[this.i][this.j] = o;
this.j++;
} else if (p[this.i - 1][this.j] == 0) {
this._y -= 32;
o = p[this.i - 1][this.j];
p[this.i - 1][this.j] = p[this.i][this.j];
p[this.i][this.j] = o;
this.i--;
} else if (p[this.i + 1][this.j] == 0) {
this._y += 32;
o = p[this.i + 1][this.j];
p[this.i + 1][this.j] = p[this.i][this.j];
p[this.i][this.j] = o;
this.i++;
}
if (p.toString () == v.toString ()) {
for (i = 0; i < 16; i++) {
_root["m" + i].removeMovieClip ();
}
_root.createTextField ("t", 100, 0, 60, 150, 25);
_root.t.setNewTextFormat (f);
_root.t.selectable = false;
_root.t.text = "WIN";
_root.onMouseUp = function () {
delete _root.onMouseUp;
_root.init ();
};
}
}
}
}
}
};
init ();
Синим отмечена проверка