Stichwort
Spritesheet. Dieses Bild hast du, und dazu einen Richtungs Vektor der angibt in welche Richtung dein Spieler sich bewegen soll (ein Tupel oder ein short[2] array boten sich da an). Je nachdem, ob dein Spieler hoch geht (y = -1) oder runter (y = 1) bzw. nach rechts (x = 1) oder links (x = -1) blittest du die jeweilige Reihe deines Spritesheets.
Wenn die Reihen nicht passend angeordnet sind, kannst du dies durch entsprechende Konstanten beheben (Auf Nachfrage dazu mehr
![:D](wcf/images/smilies/biggrin.png.pagespeed.ce.UPFXer8Yu2.png)
).
Die Animation des Gehens bekommst du hin, indem du alle paar ticks (frames) eine (interne) Variable erhöhst (z.B. mit einer extra Variable _speed) und somit Schrittweise die einzelnen Positionen durchgehst/blittest.
Bps. Code:
|
C-/C++-Quelltext
|
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
|
void update() {
if (!this._move || !this._drawable) {
return;
}
this._update += this._speed;
while (this._update >= 1.0) {
this._update--;
this._inc_frame(1);
this.push(this._dir.x, this._dir.y);
}
}
protected void _inc_frame(in byte inc) {
this._current_frame += inc;
if (this._current_frame >= this._cols) {
this._current_frame = 0;
if (this._rows > 1) {
this._current_dir += 1;
if (this._current_dir >= this._rows) {
this._current_dir = 0;
}
}
}
}
|
_current_dir ist hierbei die Zeile des Spritesheets, _current_frame der aktuelle Bildausschnitt dieser Zeile (also die Spalte).
_cols bzw. _rows wären dann die maximale Höhe (hier 4) und Breite (ebenfalls 4).
Wie du den Teilausschnitt nun renderst ist sehr einfach: einfach den Ausschnitt ausschneiden und dann für das blitten benutzen, etwa so:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
Rect rect = new Rect(
(this._current_frame * this._width),
(this._current_dir * this._height),
this._width, this._height
);
|