Schaffen Sie weiter, beschleunigen Sie das Wachstum! Dies ist der 12. Tag meiner Teilnahme an der „Nuggets Daily New Plan · June Update Challenge“, klicken Sie hier, um die Veranstaltungsdetails anzuzeigen
Vorwort
Dies ist eine Reihe von Tutorials, die von Zhang Fengjietlie erstellt und in der Nuggets-Community veröffentlicht wurden. Flutter&Flame
Wenn Sie diesen Artikel auf anderen Plattformen sehen, können Sie zu den Nuggets wechseln, um ihn gemäß dem Link anzuzeigen. Da der Artikel aktualisiert und überarbeitet werden kann, hat die Version des Nuggets-Artikels Vorrang. Liste der Artikel in dieser Reihe:
- 【Flutter&Flame Game-One】Öffne die Tür zu einer neuen Welt
- 【Flutter & Flame Game - Ⅱ】Joystick und Charakterbewegung
- 【Flutter & Flame Game - 3】 Tastaturereignisse und Gestenbedienung
- 【Flutter&Flame-Spiel - 4】Methode zum Laden von Sprite-Bildern
- 【Flutter&Flame Game - Wu】Canvas Participation | Gesundheitsbalken des Charakters
- 【Flutter&Flame-Spiel - Lu】Critical Dash | Verwendung von Textkomponenten
- 【Flutter & Flame Game - 7】 Leute folgen dem Finger | Animation berühren und bewegen
- 【Flutter&Flame-Spiel - 摌】Nachladen abgeschlossen | Waffenstart des Charakters
- 【Flutter&Flame Game - Nine】Explore Component | Was ist Component
- [Flutter&Flame-Spiel - Abholung] Komponente erkunden | Komponentenlebenszyklus-Callback
- 【Flutter&Flame-Spiel - Wählen Sie eine aus】Explorer Component | Details zur Komponentenverwendung (
本文
)
1. Über den Komponentenbaum
Wie in der folgenden Szene gezeigt, ist jedes angezeigte Objekt Component
, sie bilden eine Baumstruktur. Siehe [11/01] für den Code
Verschiedene Rollen werden dem Baum durch die add
Methode , und die Baumstruktur ist zu diesem Zeitpunkt wie folgt:
Jetzt gibt es ein Problem: Da der Gesundheitsbalken und die Lautstärke zum Adventurer
Widget , führt Adventurer
das Transformationsverhalten des auch dazu, dass sich der Gesundheitsbalken ändert. Die folgenden Zeichen werden entlang der Y-Achse gespiegelt, und Sie können sehen, dass die Gesundheitsleiste und der Text ebenfalls gespiegelt sind, was nicht unseren Erwartungen entsprach.
Wie man es löst? Die Idee ist sehr einfach, Adventurer
da ein separater Spiegel benötigt wird, kann er nicht der übergeordnete Spiegel der Gesundheitsleiste sein. Die Beziehung zwischen den beiden kann von einer Eltern-Kind-Beziehung zu einer Bruderbeziehung geändert werden.Hier wird der Blutbalken als LifeComponent
build und Adventurer
existiert zusammen mit HeroComponent
in :
2. Spiegelung der Charakterbewegung
Nun möchte ich folgenden Effekt erzielen: Befindet sich der Berührungspunkt auf der linken Seite des Zeichens, wird das Zeichen nach links gespiegelt, ansonsten wird der Spiegel nach rechts umgekehrt. Der Zweck davon ist, dass der Charakter die Richtung des Angriffs wählen kann, z. B. nach links schauen, um das Monster auf der linken Seite anzugreifen: siehe Code [11/02]
Da hier nur links und rechts vertauscht sind HeroComponent
, definieren Sie einen Wert vonisLeft
in , um den Zustand aufzuzeichnen. bool
Wenn Sie andere Richtungen unterstützen müssen, z. B. nach oben, unten, oben links, unten rechts usw., können Sie dies durch Aufzählung beibehalten.
---->[HeroComponent]----
bool isLeft = true;
late Adventurer adventurer;
late LifeComponent lifeComponent;
复制代码
Beim Anklicken des Bildschirms wird die toTarget
Methode . Zu Beginn kann _checkFlip
die isLeft
Eigenschaft Wenn sie umgekehrt werden muss, ist dies die flip
umgekehrte Rolle:
---->[HeroComponent#toTarget]----
void toTarget(Vector2 target) {
_checkFlip(target);
// 略同...
}
void _checkFlip(Vector2 target){
if (target.x < position.x) {
if (isLeft) {
flip();
isLeft = false;
}
}
if (target.x > position.x) {
if (!isLeft) {
flip();
isLeft = true;
}
}
}
复制代码
Früher wollte ich nur den Protagonisten umkehren, also flip
in , ausführen adventurer.flip
. Dies hat keinen Einfluss auf die Anzeige des Blutbalkens:
void flip({
bool x = false,
bool y = true,
}) {
adventurer.flip(x: x, y: y);
}
复制代码
---->[HeroComponent#flip]----
void flip({
bool x = false,
bool y = true,
}) {
adventurer.flip(x: x, y: y);
}
复制代码
Darüber hinaus müssen Sie bei der Umkehrung auch auf die Richtung achten, in die die Kugel abgefeuert wird. Da die vordere Kugel immer nach rechts abgefeuert wird, sollte sie sich, wenn sie nach links gerichtet ist, wie folgt nach links bewegen:
Es ist auch relativ einfach zu handhaben, je nachdem, ob isLeft
es wirklich links oder rechts zu starten ist, wie folgttag1
---->[Bullet]----
@override
void update(double dt) {
super.update(dt);
Vector2 ds = Vector2(isLeft ? 1 : -1, 0) * speed * dt; // tag1
_length += ds.length;
position.add(ds);
if (_length > maxRange) {
_length = 0;
removeFromParent();
}
}
复制代码
3. Über die Instandhaltung von Immobilien
Um die Demonstration zu erleichtern, sind die Attribute der Charaktere relativ verstreut, wie Geschwindigkeit und Angriffskraft. Da kann man hier abkapseln HeroComponent
, um die Protagonistenklasse zu erhalten. Sie können eine HeroAttr
Klasse , um die Eigenschaften der Hauptfigur wie folgt zu verwalten:
class HeroAttr {
double life; // 生命值
double speed; // 速度
double attackSpeed; // 攻击速度
double attackRange; // 射程
double attack; // 攻击力
double crit; // 暴击率
double critDamage; // 暴击伤害
HeroAttr({
required this.life,
required this.speed,
required this.attackSpeed,
required this.attackRange,
required this.attack,
required this.crit,
required this.critDamage,
});
}
复制代码
Übergeben Sie auf diese Weise HeroComponent
beim Erstellen HeroAttr
von das Objekt, um die Attributinformationen des Objekts zu ermitteln.
---->[TolyGame#onLoad]----
final HeroAttr heroAttr = HeroAttr(
life: 3000,
speed: 100,
attackSpeed: 200,
attackRange: 200,
attack: 50,
crit: 0.75,
critDamage: 1.5,
);
player = HeroComponent(attr: heroAttr);
add(player);
复制代码
Auf diese Weise kann der Lebensverlustwert des Monsters nach HeroAttr
dem :
---->[Liveable]----
void loss(HeroAttr attr) {
double point = attr.attack;
double crit = attr.crit;
double critDamage = attr.critDamage;
bool isCrit = _random.nextDouble() < crit;
if (isCrit) {
point = point * critDamage;
}
_damageText.addDamage(-point.toInt(), isCrit: isCrit);
}
复制代码
Beim Hinzufügen von Kugeln können die Angriffsgeschwindigkeit und -reichweite anhand HeroAttr
der Attributinformationen von bestimmt werden:
In diesem Artikel erweitern wir die Funktion von Rollen weiter, da wir wissen, dass sich die Transformation von übergeordneten Komponenten auf untergeordnete Komponenten auswirkt, sodass Sie bei der Verwendung von Komponenten auf die Beziehung zwischen Komponenten achten müssen. Darüber hinaus sind die Charakterinformationen durch HeroAttr
eingekapselt , sodass HeroComponent
Sie über mehrere Protagonistenknoten hinzufügen und Monster im Doppelmodus bekämpfen können.
An diesem Punkt können Sie sehen TolyGame
, dass es sehr chaotisch ist. Im nächsten Kapitel werde ich vorstellen, wie man mehrere Charaktere und Monster verwaltet, einschließlich der Generierung von Monstern, dem Abfeuern von Kugeln, dem Treffen des Protagonisten usw. Das war's für diesen Artikel, bis morgen~
@张风捷特烈 2022.06.05 未允禁转
我的 公众号: 编程之王
我的 掘金主页
: Zhang Fengjieteli我的 B站主页
: Zhang Fengjieteli我的 github 主页
: toly1994328
\