PDA

Просмотр полной версии : Как уменьшить такой код?..


combo
07.05.2007, 17:21
function goToWay(way:String) {
var step:Number = 5;

switch (way) {
case "right":
mc1._x -= step;
break;
case "left":
mc1._x += step;
break;
case "up":
mc1._y += step;
break;
case "down":
mc1._y -= step;
break;
}
};

arrowRight_btn.onRelease = function() {
goToWay("right");
};
arrowLeft_btn.onRelease = function() {
goToWay("left");
};
arrowUp_btn.onRelease = function() {
goToWay("up");
};
arrowDown_btn.onRelease = function() {
goToWay("down");
};


Собст-но сабж. Думаю, можно написать как-то короче, но не знаю как. Кнопок в принципе может быть больше и не охота из-за этого сильно "раздувать" флешку.
Как оптимизировать?

Aziz Zaynutdinoff
07.05.2007, 17:50
function goToWay(way:String) {
var step:Number = 5;
var s:Number = (way == "left" && way != "up" && way != "down") ? -1 : 1;
var d:Number = (way == "up" && way != "left" && way != "right") ? -1 : 1;
var __x:Number = (way == "right" || way == "left") ? step*s : 0;
var __y:Number = (way == "up" || way == "down") ? step*d : 0;
mc1._x += __x;
mc1._y += __y;
}

combo
07.05.2007, 20:54
Aziz Zaynutdinoff, спасибо, но по-моему так еще запутанее чем у меня.

И еще вопрос по оптимизации: как быть с баттонами? То есть можно ли, скажем, сделать какую-нибудь универсальную для этих кнопок функцию, чтобы при этом аргументы в goToWay они передавали разные ?

iNils
07.05.2007, 20:56
function goToWay (x:Number, y:Number) {
var step:Number = 5;
mc1._x += step * x;
mc1._y += step * y;
}
arrowRight_btn.onRelease = function () {
goToWay (1, 0);
};
arrowLeft_btn.onRelease = function () {
goToWay (-1, 0);
};
arrowUp_btn.onRelease = function () {
goToWay (0, -1);
};
arrowDown_btn.onRelease = function () {
goToWay (0, 1);
};

Aziz Zaynutdinoff
07.05.2007, 20:59
знаешь на самом деле я бы просто передавал два параметра :)

function goToWay(__x:Number, __y:Number):Void
{
__x = (__x == undefined) ? 0 : __x;
__y = (__y == undefined) ? 0 : __y;
_mc._x += __x;
_mc._y += __y;
};
btn.onRelease = function()
{
goToWay(-5); //влево
}
btn1.onRelease = function()
{
goToWay(-5, 5); //вниз-влево
}


UPD:
iNils опередил :) хотя есть немного разница

Kikasso
07.05.2007, 21:02
var step = 5;
var wayObj = {
left:{dx: step, dy:0},
right:{dx:-step, dy:0},
down:{dy: step, dx:0},
up:{dy: -step, dx:0}
}
function goToWay(way:String) {
var ob = wayObj[way];
mc1._x += ob.dx;
mc1._y += ob.dy;
};

arrowRight_btn.onRelease = function() {
goToWay("right");
};
arrowLeft_btn.onRelease = function() {
goToWay("left");
};
arrowUp_btn.onRelease = function() {
goToWay("up");
};
arrowDown_btn.onRelease = function() {
goToWay("down");
};Длиннее, но гибче.

aksios
07.05.2007, 23:35
var step:Number = 5;
var n:Object = {r:{x:1,y:0},l:{x:-1,y:0},t:{x:0,y:-1},d:{x:0,y:1}};
function goToWay(way) {
mc1._x+= step*n[way].x;
mc1._y+= step*n[way].y;
}
arrowRight_btn.onRelease = function()
{
goToWay("r");
};
arrowLeft_btn.onRelease = function() {
goToWay("l");
};
arrowUp_btn.onRelease = function() {
goToWay("t");
};
arrowDown_btn.onRelease = function() {
goToWay("d");
};:rolleyes:

Kikasso
08.05.2007, 00:06
var step = 5;
var wayObj = {
left:{dx: step},
right:{dx:-step},
down:{dy: step},
up:{dy: -step},
down20px:{dy: 20},
downRight20px:{dy: step, dx:-20}
}
function goToWay(way:String) {
var ob = wayObj[way];
if( ob.dx ) mc1._x += ob.dx;
if( ob.dy ) mc1._y += ob.dy;
};
function btnOnRelease() {
if( this.dir == undefined ) this.dir = (this._name.split("_"))[0];
gotoWay(this.dir);
};

right_btn.onRelease = left_btn.onRelease = up_btn.onRelease = btnOnRelease;
down_btn.onRelease = down20px_btn.onRelease = downRight20px_btn.onRelease = btnOnRelease;:bb:

this.create
08.05.2007, 00:13
function goToWay(way:String) {
var step:Number = 5;

switch (way) {
case "right":
mc1._x -= step;
break;
case "left":
mc1._x += step;
break;
case "up":
mc1._y += step;
break;
case "down":
mc1._y -= step;
break;
}
};

arrowRight_btn.onRelease = function() {
goToWay("right");
};
arrowLeft_btn.onRelease = function() {
goToWay("left");
};
arrowUp_btn.onRelease = function() {
goToWay("up");
};
arrowDown_btn.onRelease = function() {
goToWay("down");
};

Собст-но сабж. Думаю, можно написать как-то короче, но не знаю как. Кнопок в принципе может быть больше и не охота из-за этого сильно "раздувать" флешку.
Как оптимизировать? Вот короче:
var step:Number = 5;
arrowRight_btn.onRelease = function() {
mc1._x -= step;
};
arrowLeft_btn.onRelease = function() {
mc1._x += step;
};
arrowUp_btn.onRelease = function() {
mc1._y += step;
};
arrowDown_btn.onRelease = function() {
mc1._y -= step;
};
Про много кнопок: как вы их планируете вставлять в сцену. От этого будет зависить и оптимизация.
ps. А может вам просто класс Key нужен?

Kikasso
08.05.2007, 00:27
вы выиграли..

progman
08.05.2007, 08:53
эээ, насчет оптимизации ламерский вопрос:
компилятор и линковщик или их замена в флеше есть?
или код написанный программистом никак не видоизменяется?

etc
08.05.2007, 11:27
Код превращается в байт-код и все.

combo
08.05.2007, 11:57
Вот короче:
var step:Number = 5;
arrowRight_btn.onRelease = function() {
mc1._x -= step;
};
arrowLeft_btn.onRelease = function() {
mc1._x += step;
};
arrowUp_btn.onRelease = function() {
mc1._y += step;
};
arrowDown_btn.onRelease = function() {
mc1._y -= step;
};


Нет, такой вариант как раз не очень гибкий - а если еще нужно ходить по диагонали, то придётся опять дублировать код?


Про много кнопок: как вы их планируете вставлять в сцену. От этого будет зависить и оптимизация.
ps. А может вам просто класс Key нужен?
я не аттачу их из библиотеки, а вставляю сразу в редакторе. Ну, вот сейчас, например, у меня девять кнопок(на все возможные ходы) и для всех почти одинаковый код, отличающийся только передаваемым значением (way). Поэтому интересует, как можно упростить код, и не писать для каждой кнопки свой onRelease.

etc
08.05.2007, 12:09
move = function(addX,addY) {
mc._x += addX;
mc._y += addY;
}
arr = [{obj:arrowUp_btn,addX:0,addY:-1},{obj:arrowDown_btn,addX:0,addY:1},{obj:arrowLeft_btn,addX:-1,addY:0},{obj:arrowRight_btn,addX:1,addY:0}];
for (i = 0;i<arr.length;i++) {
o = arr[i];
o.obj.i = i;
o.obj.onRelease = function() {
move(arr[this.i].addX,arr[this.i].addY);
}
}
delete i;
delete o;
:D

combo
08.05.2007, 12:17
__etc, спасибо, выручил!)

пс. применять обьекты для создания движения как-то и в голову не приходило..