Subversion Repositories wimsdev

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 reyssat 1
/*
2
        DynAPI Distribution
3
        Glide Animation Extension
4
 
5
        The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
6
 
7
        requires: dynapi.fx.Thread
8
*/
9
 
10
function GlideAnimation(x1,y1,x2,y2,angleinc,startSpeed,endSpeed) {
11
        if (x2==null) x2 = x1;
12
        if (y2==null) y2 = y1;
13
 
14
        var normAngle = dynapi.functions.getNormalizedAngle(x1,y1,x2,y2);
15
        var distx = x2-x1;
16
        var disty = y2-y1;
17
        var distance = Math.sqrt(Math.pow(distx,2) + Math.pow(disty,2));
18
        angleinc = (angleinc==null)? 7 : Math.abs(angleinc);
19
 
20
        // a terrible mess but it works
21
        var r = 1;
22
        if (startSpeed == "fast") {
23
                var centerX = x1;
24
                var centerY = y1;
25
                var centerX2 = x2;
26
                var centerY2 = y2;
27
                startAngle = 0;
28
                endAngle = 90;
29
                if (endSpeed=="fast") distance = distance/2;
30
        }
31
        else {
32
                startAngle = -90;
33
                endAngle = 0;
34
                if (endSpeed == "fast") {
35
                        var centerX = x1+distx;
36
                        var centerY = y1+disty;
37
                }
38
                else {  // default slow,slow
39
                        var centerX2 = x2-distx/2;
40
                        var centerY2 = y2-disty/2;
41
                        distance = distance/2;
42
                        var centerX = x1+distx/2;
43
                        var centerY = y1+disty/2;
44
                        r = -1;
45
                }
46
        }
47
 
48
        var i,d,x,y,dx,dy,path=[];
49
        for (var a=startAngle; a<endAngle; a+=angleinc) {
50
                i = path.length;
51
                d = distance*Math.sin(a*Math.PI/180);
52
                path[i] = Math.round(centerX + d*Math.cos(normAngle));
53
                path[i+1] = Math.round(centerY - d*Math.sin(normAngle));
54
        }
55
        if (startSpeed==endSpeed) {
56
                for (var a=endAngle; a<endAngle+90; a+=angleinc) {
57
                        i = path.length;
58
                        d = distance*Math.sin(a*Math.PI/180);
59
                        path[i] = Math.round(centerX2 - r*d*Math.cos(normAngle));
60
                        path[i+1] = Math.round(centerY2 + r*d*Math.sin(normAngle));
61
                }
62
        }
63
 
64
        var l = path.length;
65
        if (path[l-2] != x2 && path[l-1]!=y2) {
66
                path[l] = x2;
67
                path[l+1] = y2;
68
        }
69
        return path;
70
};
71
 
72
DynLayer.prototype.glideStop = function () {
73
        if (this._thread) this._thread.stop();
74
};
75
DynLayer.prototype.glideTo = function(x2,y2,angleinc,ms,startSpeed,endSpeed) {
76
        if (this.x!=x2 || this.y!=y2) {
77
                if (!this._thread) this._thread = new Thread(this);
78
                if (ms) this._thread.interval = ms;
79
                this._thread.play(GlideAnimation(this.x,this.y,x2,y2,angleinc,startSpeed,endSpeed) );
80
        }
81
};