【Flutter&Flame-Spiel - Wählen Sie eine aus】Explore Component | Details zur Komponentenverwendung

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&FlameWenn 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:


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 addMethode , und die Baumstruktur ist zu diesem Zeitpunkt wie folgt:

Jetzt gibt es ein Problem: Da der Gesundheitsbalken und die Lautstärke zum AdventurerWidget , führt Adventurerdas 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, Adventurerda 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 LifeComponentbuild und Adventurerexistiert zusammen mit HeroComponentin :


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. boolWenn 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 toTargetMethode . Zu Beginn kann _checkFlipdie isLeftEigenschaft Wenn sie umgekehrt werden muss, ist dies die flipumgekehrte 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 flipin , 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 isLeftes 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 HeroAttrKlasse , 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 HeroComponentbeim Erstellen HeroAttrvon 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 HeroAttrdem :

---->[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 HeroAttrder 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 HeroAttreingekapselt , sodass HeroComponentSie ü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~

\

Ich denke du magst

Origin juejin.im/post/7105584277143699470
Empfohlen
Rangfolge