예제 #1
0
        };                                                                                                                                             //new MatrixType { matrix = new float[9] };

        public SpriterSet(string ssb, Atlas atlas_)
        {
            atlas = atlas_;
            BinReader br = new BinReader(Path.Combine(Application.streamingAssetsPath, ssb));

            #pragma warning disable
            string format = br.readString();
            version = br.readInt();

            int animation_count = br.readInt();
            animations = new Dictionary <string, SpriterAnimation>();

            for (int i = 0; i < animation_count; ++i)
            {
                SpriterAnimation a = new SpriterAnimation(br, version);
                animations[a.name] = a;
            }
        }
예제 #2
0
        public void draw(string animation, int frame, Vector2 position, Vector2 scale, float angle, Vector4 color)
        {
            object_camera = Matrix.Identity(object_camera);
            object_camera = Matrix.Scale(object_camera, scale);
            object_camera = Matrix.Rotate(object_camera, angle);
            object_camera = Matrix.Translation(object_camera, position);

            if (!animations.ContainsKey(animation))
            {
                return;
            }

            SpriterAnimation anim = animations[animation];

            // determine which frames to interpolate between
            var frame_a = anim.keyframes[0];
            var frame_b = frame_a;

            if (anim.keyframes.Length > 1)
            {
                frame_b = anim.keyframes[1];
            }

            frame %= anim.length;
            for (int i = 1; i < anim.keyframes.Length; i++)
            {
                if (frame > anim.keyframes[i].time)
                {
                    frame_a = anim.keyframes[i];
                    if (i + 1 < anim.keyframes.Length)
                    {
                        frame_b = anim.keyframes[i + 1];
                    }
                    else
                    {
                        frame_b = anim.keyframes[0];
                    }
                }
            }

            // determine proportion of each frame
            float a_amt = 1, b_amt = 0;

            if (frame_a != frame_b)
            {
                int frame_b_time = frame_b.time;
                if (frame_b_time == 0)
                {
                    frame_b_time = anim.length;
                }

                b_amt = (float)(frame - frame_a.time) / (frame_b_time - frame_a.time);
                a_amt = 1.0f - b_amt;
            }

            // for each stamp in frame A
            for (int i = 0; i < frame_a.stamps.Length; ++i)
            {
                // figure out what stamp in frame B we're interpolating to
                SpriterStamp stamp_a = frame_a.stamps[i];
                SpriterStamp stamp_b = stamp_a;

                if (stamp_a.z_next_frame != -1 && frame_b.stamps.GetLength(0) > stamp_a.z_next_frame)
                {
                    stamp_b = frame_b.stamps[stamp_a.z_next_frame];
                }

                if (stamp_b.atlas_id != stamp_a.atlas_id)
                {
                    stamp_b = stamp_a;
                }

                // find stamp display transform properties
                int     spin        = stamp_a.spin;
                Vector2 pos         = stamp_a.position * a_amt + stamp_b.position * b_amt;
                Vector2 origin      = stamp_a.origin * a_amt + stamp_b.origin * b_amt;
                Vector2 stamp_scale = stamp_a.scale * a_amt + stamp_b.scale * b_amt;

                Vector2 stamp_size = atlas.sprites[stamp_a.atlas_id].tlmargin +
                                     atlas.sprites[stamp_a.atlas_id].size +
                                     atlas.sprites[stamp_a.atlas_id].brmargin;

                // find stamp rotation, correcting for spin direction
                float angle_a = stamp_a.rotation * (float)System.Math.PI / 180;
                float angle_b = stamp_b.rotation * (float)System.Math.PI / 180;

                if (spin == 1 && angle_b - angle_a < 0)
                {
                    angle_b += (float)System.Math.PI * 2;
                }

                if (spin == -1 && angle_b - angle_a > 0)
                {
                    angle_b -= (float)System.Math.PI * 2;
                }

                float rotation = angle_a * a_amt + angle_b * b_amt;

                // build stamp transform matrix
                stamp_matrix = Matrix.Identity(stamp_matrix);
                stamp_matrix = Matrix.Translation(stamp_matrix, new Vector2(-origin.x * stamp_size.x, -stamp_size.y + origin.y * stamp_size.y));
                stamp_matrix = Matrix.Scale(stamp_matrix, stamp_scale);
                stamp_matrix = Matrix.Rotate(stamp_matrix, -rotation);
                stamp_matrix = Matrix.Translation(stamp_matrix, new Vector2(pos.x, -pos.y));
                stamp_matrix = Matrix.Multiply(stamp_matrix, object_camera);

                // display!
                AppMain.renderer.addSprite(atlas.textures[atlas.active_texture],
                                           Matrix.Apply(stamp_matrix, Vector2.zero),
                                           Matrix.Apply(stamp_matrix, new Vector2(stamp_size.x, 0)),
                                           Matrix.Apply(stamp_matrix, stamp_size),
                                           Matrix.Apply(stamp_matrix, new Vector2(0, stamp_size.y)),
                                           atlas.sprites[stamp_a.atlas_id].bounds, color, 0, 0, false);
            }
        }