22
33import java .util .ArrayList ;
44
5+ import android .graphics .Bitmap ;
56import android .graphics .Canvas ;
7+ import android .graphics .Matrix ;
68import android .graphics .Paint ;
9+ import android .graphics .Rect ;
710import ea .internal .collision .BoxCollider ;
811import ea .internal .collision .Collider ;
912import ea .internal .collision .ColliderGroup ;
@@ -17,6 +20,21 @@ public class Sprite extends Raum
1720
1821 private boolean animiert = true ;
1922
23+ private boolean spiegelX ;
24+ private boolean spiegelY ;
25+
26+ private boolean istSpriteSheet ;
27+ private Bild spriteSheet ;
28+
29+ private int spriteBreite ;
30+ private int spriteHoehe ;
31+ private int zeilen , spalten ;
32+ private int aktuellesFrame ;
33+ private long frameTicker ;
34+ private int framePeriode ;
35+ private Rect sourceRect ;
36+ private int anzahlBilder ;
37+
2038 static
2139 {
2240 sprites = new ArrayList <Sprite >();
@@ -48,6 +66,7 @@ public Sprite(float x, float y, String ...bilder)
4866 this .bilder = new Bild [bilder .length ];
4967
5068 animiert = bilder .length > 1 ;
69+ istSpriteSheet = false ;
5170
5271 for (int i = 0 ; i < bilder .length ; i ++)
5372 {
@@ -62,20 +81,56 @@ public Sprite(String ...bilder)
6281 this (0 , 0 , bilder );
6382 }
6483
84+ public Sprite (String spriteSheet , float x , float y , int fps , int anzahlBilder )
85+ {
86+ super .position = new Punkt (x , y );
87+
88+ istSpriteSheet = true ;
89+ this .spriteSheet = new Bild (x , y , spriteSheet );
90+
91+ this .anzahlBilder = anzahlBilder ;
92+ spriteBreite = this .spriteSheet .bild ().getWidth () / anzahlBilder ;
93+ spriteHoehe = this .spriteSheet .bild ().getHeight ();
94+ sourceRect = new Rect (0 , 0 , spriteBreite , spriteHoehe );
95+ framePeriode = 1000 / fps ;
96+ frameTicker = 0l ;
97+
98+ animiert = true ;
99+
100+ sprites .add (this );
101+ }
102+
65103 public boolean animiert ()
66104 {
67105 return animiert ;
68106 }
69107
70108 public void animationsSchritt (int runde )
71109 {
72- if (runde % intervall != 0 ) {
110+ if (!istSpriteSheet )
111+ {
112+ if (runde % intervall != 0 ) {
73113 return ;
114+ }
115+ if (aktuelle == bilder .length - 1 ) {
116+ aktuelle = 0 ;
117+ } else {
118+ aktuelle ++;
119+ }
74120 }
75- if (aktuelle == bilder .length - 1 ) {
76- aktuelle = 0 ;
77- } else {
78- aktuelle ++;
121+ else
122+ {
123+ if (System .currentTimeMillis () > frameTicker + framePeriode )
124+ {
125+ frameTicker = System .currentTimeMillis ();
126+ aktuellesFrame ++;
127+ if (aktuellesFrame >= anzahlBilder ) {
128+ aktuellesFrame = 0 ;
129+ }
130+ }
131+
132+ this .sourceRect .left = aktuellesFrame * spriteBreite ;
133+ this .sourceRect .right = this .sourceRect .left + spriteBreite ;
79134 }
80135 }
81136
@@ -87,11 +142,49 @@ public void intervallSetzen(int intervall)
87142 @ Override
88143 public void zeichnen (Canvas g , BoundingRechteck r )
89144 {
90- Paint p = new Paint ();
145+
146+ if (!istSpriteSheet )
147+ {
148+ Matrix m = new Matrix ();
149+ Paint p = new Paint ();
150+ Bitmap bild = bilder [aktuelle ].bild ();
151+
152+ if (spiegelX && spiegelY ) {
153+ m .preScale (-1 , -1 );
154+ } else if (spiegelX ) {
155+ m .preScale (-1 , 1 );
156+ } else if (spiegelY ) {
157+ m .preScale (1 , -1 );
158+ } else {
159+ m .preScale (1 , 1 );
160+ }
161+
162+ Bitmap endBild = Bitmap .createBitmap (bild , 0 , 0 , bild .getWidth (), bild .getHeight (), m , false );
163+
164+ g .drawBitmap (endBild , position .x , position .y , p );
165+ }
91166
92- //g.drawBitmap(bilder[aktuelle].bild(), position.x, position.y, p);
93- bilder [aktuelle ].zeichnen (g , r );
94-
167+ else
168+ {
169+ Rect destRect = new Rect (position .x (), position .y (), position .x () + spriteBreite , position .y () + spriteHoehe );
170+
171+ Matrix m = new Matrix ();
172+ Paint p = new Paint ();
173+
174+ if (spiegelX && spiegelY ) {
175+ m .preScale (-1 , -1 );
176+ } else if (spiegelX ) {
177+ m .preScale (-1 , 1 );
178+ } else if (spiegelY ) {
179+ m .preScale (1 , -1 );
180+ } else {
181+ m .preScale (1 , 1 );
182+ }
183+
184+ Bitmap endBild = Bitmap .createBitmap (spriteSheet .bild (), 0 , 0 , spriteSheet .bild ().getWidth (), spriteSheet .bild ().getHeight (), m , false );
185+
186+ g .drawBitmap (endBild , sourceRect , destRect , null );
187+ }
95188 }
96189
97190 @ Override
@@ -111,4 +204,19 @@ public Collider erzeugeCollider() {
111204 }
112205 return gc ;
113206 }
207+
208+ public void setzeSpiegelX (boolean s )
209+ {
210+ spiegelX = s ;
211+ }
212+
213+ public void setzeSpiegelY (boolean s )
214+ {
215+ spiegelY = s ;
216+ }
217+
218+ public int aktuellesFrameGeben ()
219+ {
220+ return aktuellesFrame ;
221+ }
114222}
0 commit comments