summaryrefslogtreecommitdiffstats
path: root/core/src/ch/asynk/gdx/boardgame/FramedSprite.java
blob: 8fc2e80b118f4c4d032004a54c2a52ebdb963b9c (plain)
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
package ch.asynk.gdx.boardgame;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;

public class FramedSprite implements Drawable, Positionable
{
    public static int trim = 2;
    public static int offset = 0;

    private TextureRegion[][] frames;
    private TextureRegion frame;
    public final int rows;
    public final int cols;
    public float x;
    public float y;
    public float r;

    public FramedSprite(Texture texture, int rows, int cols)
    {
        this.frames = TextureRegion.split(texture, (texture.getWidth() / cols), (texture.getHeight() / rows));
        this.frame = frames[0][0];
        this.rows = rows;
        this.cols = cols;
        this.x = 0;
        this.y = 0;
        this.r = 0;

        if (trim > 0 || offset > 0) {
            for (int r = 0; r < rows; r++) {
                for (int c = 0; c < cols; c++) {
                    TextureRegion f = frames[r][c];
                    if (offset > 0 ){
                        f.setRegionX(f.getRegionX() + offset);
                        f.setRegionY(f.getRegionY() + offset);
                    }
                    if (trim > 0) {
                        f.setRegionWidth(f.getRegionWidth() - trim);
                        f.setRegionHeight(f.getRegionHeight() - trim);
                    }
                }
            }
        }
    }

    public FramedSprite(FramedSprite other)
    {
        Texture t = other.frame.getTexture();
        this.rows = other.rows;
        this.cols = other.cols;
        this.frames = TextureRegion.split(t, (t.getWidth() / cols), (t.getHeight() / rows));
        this.frame = frames[0][0];
        this.x = other.x;
        this.y = other.y;
        this.r = other.r;
    }

    public void setFrame(int row, int col)
    {
        this.frame = frames[row][col];
    }

    public TextureRegion getFrame()
    {
        return frame;
    }

    @Override public float getX()
    {
        return x;
    }

    @Override public float getY()
    {
        return y;
    }

    @Override public float getWidth()
    {
        return frame.getRegionWidth();
    }

    @Override public float getHeight()
    {
        return frame.getRegionHeight();
    }

    @Override public void translate(float dx, float dy)
    {
        setPosition(getX() + dx, getY() + dy);
    }

    @Override public void setPosition(float x, float y)
    {
        this.x = x;
        this.y = y;
    }

    @Override public void draw(Batch batch)
    {
        batch.draw(frame, x, y, 0, 0, frame.getRegionWidth(), frame.getRegionHeight(), 1f, 1f, r);
    }

    @Override public void drawDebug(ShapeRenderer shapeRenderer)
    {
        shapeRenderer.end();
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        shapeRenderer.identity();
        shapeRenderer.translate(x, y, 0);
        shapeRenderer.rotate(0, 0, 1, r);
        shapeRenderer.translate(-x, -y, 0);
        shapeRenderer.rect(x, y, frame.getRegionWidth(), frame.getRegionHeight());
        shapeRenderer.end();
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        shapeRenderer.identity();
    }
}