From 0028b5cb15f7b115de197aa5fb4adc62776d2040 Mon Sep 17 00:00:00 2001 From: Lim Chee Keen <62128387+xjyribro@users.noreply.github.com> Date: Sat, 23 Mar 2024 20:21:09 +0800 Subject: [PATCH] docs: Jenny example (#3086) Replace this text. --------- Co-authored-by: xjyribro Co-authored-by: Lukas Klingsbo --- examples/assets/images/dialogue_box.png | Bin 0 -> 1458 bytes examples/assets/images/green_button_sqr.png | Bin 0 -> 675 bytes examples/assets/images/red_button_sqr.png | Bin 0 -> 670 bytes examples/assets/yarn/advanced.yarn | 21 +++++ examples/assets/yarn/simple.yarn | 6 ++ examples/lib/main.dart | 2 + .../flame_jenny/commons/commons.dart | 8 ++ .../flame_jenny/components/button_row.dart | 71 +++++++++++++++ .../flame_jenny/components/dialogue_box.dart | 43 +++++++++ .../components/dialogue_button.dart | 36 ++++++++ .../dialogue_controller_component.dart | 85 ++++++++++++++++++ .../components/dialogue_text_box.dart | 17 ++++ .../flame_jenny/components/menu_button.dart | 35 ++++++++ .../bridge_libraries/flame_jenny/jenny.dart | 29 ++++++ .../flame_jenny/jenny_advanced_example.dart | 76 ++++++++++++++++ .../flame_jenny/jenny_simple_example.dart | 36 ++++++++ examples/pubspec.yaml | 2 + 17 files changed, 467 insertions(+) create mode 100644 examples/assets/images/dialogue_box.png create mode 100644 examples/assets/images/green_button_sqr.png create mode 100644 examples/assets/images/red_button_sqr.png create mode 100644 examples/assets/yarn/advanced.yarn create mode 100644 examples/assets/yarn/simple.yarn create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/commons/commons.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/button_row.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_box.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_button.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_text_box.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/components/menu_button.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/jenny.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/jenny_advanced_example.dart create mode 100644 examples/lib/stories/bridge_libraries/flame_jenny/jenny_simple_example.dart diff --git a/examples/assets/images/dialogue_box.png b/examples/assets/images/dialogue_box.png new file mode 100644 index 0000000000000000000000000000000000000000..d9bdbbc66c77d488e6f785092fd7cf6b9707e5ed GIT binary patch literal 1458 zcmeAS@N?(olHy`uVBq!ia0y~yV0r*#H*l~4Nw2MUsu&m;8#0}p13aCb6$*;-(=u~X z85lGs)=u=*a0!%Xo4>QeWm2SvSb5`AO~uHp4w0pXr|uuxTmJ9Lo$OuZDak8yrnb)S z-QU`48qFQObjtimTU$jpPF(l?&dgb!$5vjhtUCXFU+r`21+r^IzxHrv?d)B#=2U6@x??VvHY+UQ=8v>A*WaUJvtinK z&3mGJ(UQuFHEMU>dNm*7_cG`Hv&uqt!!o18c{XM`GGf;*r{+xCIJGeMVco;NmbV`J z%%UH(JSsg}R(4hE+se2b6H3ySP1V~y*YMcP6fW7xq0>%IQde58+~w}`Zn5Z}+{SvZ zm}NVrZ9HOlh|A3Ff&1Ts?{8ME+;`6@$XO(7UhV(A!dcrNR-gX9zpv*1Z;4g&9$eD= z8P1pZ!THPDN!JP)e5DKOLNA?>-EpJk+VMFLr5Zz2qrI0tcpI`WlP@Z7LES=w?T>8L zzY9!{^o==u&#q*tYW2oLyI-Gr{w?3Pu+IKNTT$`F=`x(aC}B(Tc6VXWV^Cty7hlzS z7AV45;1OBOz@VoL!i*J5?aP3I>?NMQuIw+E*f?0NSF;yu0fi(>Tq8=H^K)}k^GX<; zi&7IyQd1PlGfOfQ+&z5*!W;R-85o%RJY5_^DsH{KyD|4wfJno`#~R8T83Y4YX$YsV zNLi^ZSe)46)38EmO$FooC*hW#m}h4nZ~5M`f4!OBy4msW$JLmC7J-4=$#sR3w_ksL zDv*i6fc5v`!VqWsIOQGUpJ%EwG8_mANp9Lx-eA7?x5m=udTbm%+By&o$cN|>9t8V`lrruoDceV zSM*+!Gy{XL+#qb!WVPe5GX1wW`3|U!rT684jeL<#<1<$(~2Int|cL z^Sgf@%mC75=a_81eo|#%n6ND-chk|DvTy3sPIB(}D$Ky}LjUUdumGT%HWmv8hCizr zw*Tj4U@+$?U|?`)U}k7wU}s|n6kqHCC zhtn`qXZSVP1Jg(!Fw6Y%{Q5bv;WjYcG<+<(T{=}f^$q{=H%XvC-@iP(A=;Udq2YB& z@pIPv_2;i9*>yk7`doYV`t$a!A`A>3N6N4N@^m@!*gs$E7$bwg-NWXtdjA&8YjQsl zKlwv&5-?g1%HEeZdO533oq12+hmH=bBf*Bi2oJvWrz#Wn z(3n^|(bnUzgUr$R;H65U?A%=zDJ%TMj_AvHi*_e0+#(uPYOwPQ_bd|?O})OR?1KmU zkFIL&-n@=)U6aBO#z$`+EP0`%`cGeTOUK6tJLKQLvwe4u(P{Cakj>dl0j8%tjwUCW zZP#Lpdw5)d<&49W87tK_8`U9`*->Z2O z-c9~e70oTr`1kgKqovW4zc-wgO?crso#*7lKPIhCj1~5a^G`7{Z+Cb<>vnXu{BnMW zwp~&C82R`bH!7vBuimqJ`R48Q=ePX&&A6_&XupnA+hkz0uqAoBy8vk*`02d69!PN( zctjR6Fz6|RFk{71`!b*)dx@v7EBgy(ab`x1Nv@31Kq1Kz*N775{M_8syb=cIqSVBa z)D(sC%#sWRcTeAd@J2pyprUF|7srr{dv9-TKZDyQnUz%FK_d7EeJJ3W% z1_cHN7KR1}1_1^JCI$xv1`Z^_E1_lPCfiSI*e_V6w?>k4^I?riH-MTLJYD@<);T3K F0RZWt3m*Ug literal 0 HcmV?d00001 diff --git a/examples/assets/images/red_button_sqr.png b/examples/assets/images/red_button_sqr.png new file mode 100644 index 0000000000000000000000000000000000000000..041864dd3a924ec232cdd9180890b928826273d0 GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pC!3HGX9;gjrU|?*?baoE#baqxKD9TUE%t>Wn z(3n^|(bnUzgUr$R;H65U?A%=zDJ%TMj_AvHi*_e0+#(uPYOwPQ_bd|?O})OR?1KmU zkFIL&-n@=)U6aBO#z$`+EP0`%`cGeTOUK6tJLKQLvwe4u(P{Cakj>dl0j8%tjwUCW zZP#Lpdw5)d<&49W87tK_8`U9`*->Z2O z-c9~e70oTr`1kgKqovW4zc-wgO?crso#*7lKPIhCj1~5a^G`7{Z+Cb<>vnXu{BnMW zwp~&C82R`bH!7vBuimqJ`R48Q=ePX&&A6_&XupnA+hkz0uqAoBy8vk*`02d69!PN( zctjR6Fz6|RFk{71`!b*)dx@v7EBgy(ab`w|EprUN1BE0@Tq8=H^K)}k^GX<;i&7Iy zQd1PlGfOfQ+&z5*!W;R-fr`pJT^vI)?!CRWk+(rXz#-6}?*L!Ua|XT#40*@--Yi(F zcq!B4#BbRPce(E#y|CqJ4eQ@)kzO_P#FZs)->SY5Y&4hOI;(c?cV;$rpka&*3JeS^ z3=Iqn0t^gH3=Rwo97uv^Ld(s!Y(K4GpRg)#LJj94*1MOU0yQysy85}Sb4q9e0FJr} A=>Px# literal 0 HcmV?d00001 diff --git a/examples/assets/yarn/advanced.yarn b/examples/assets/yarn/advanced.yarn new file mode 100644 index 000000000..7012d8008 --- /dev/null +++ b/examples/assets/yarn/advanced.yarn @@ -0,0 +1,21 @@ +<> +<> +title: gamble +--- +Jenny: Hello {$playerName}. This is a game of chance. +Jenny: You can win or lose up to 10 coins. Do you want to play? +-> No + Jenny: No bids made. +-> Yes + <> // returns a random value from -10 to 10 + <> + Jenny: Too bad, you did not win anything. + <> + Jenny: Bad luck. You lost {$winnings} coins. + Jenny: Play again to change your fortunes. + <> + Jenny: Congratulations! You won {$winnings} coins. + Jenny: Play again to win even more. + <> + <> +=== \ No newline at end of file diff --git a/examples/assets/yarn/simple.yarn b/examples/assets/yarn/simple.yarn new file mode 100644 index 000000000..f312b2362 --- /dev/null +++ b/examples/assets/yarn/simple.yarn @@ -0,0 +1,6 @@ +<> +title: hello_world +--- +Jenny: Hello world. My name is Jenny. +Jenny: Thanks for using Flame! +=== \ No newline at end of file diff --git a/examples/lib/main.dart b/examples/lib/main.dart index f4fb18a89..b7ac835fb 100644 --- a/examples/lib/main.dart +++ b/examples/lib/main.dart @@ -16,6 +16,7 @@ import 'package:examples/stories/bridge_libraries/flame_forge2d/joints/revolute_ import 'package:examples/stories/bridge_libraries/flame_forge2d/joints/rope_joint.dart'; import 'package:examples/stories/bridge_libraries/flame_forge2d/joints/weld_joint.dart'; import 'package:examples/stories/bridge_libraries/flame_isolate/isolate.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/jenny.dart'; import 'package:examples/stories/bridge_libraries/flame_lottie/lottie.dart'; import 'package:examples/stories/bridge_libraries/flame_spine/flame_spine.dart'; import 'package:examples/stories/camera_and_viewport/camera_and_viewport.dart'; @@ -98,6 +99,7 @@ void runAsDashbook() { // Bridge package examples addForge2DStories(dashbook); addFlameIsolateExample(dashbook); + addFlameJennyExample(dashbook); addFlameLottieExample(dashbook); addFlameSpineExamples(dashbook); diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/commons/commons.dart b/examples/lib/stories/bridge_libraries/flame_jenny/commons/commons.dart new file mode 100644 index 000000000..79f92abd1 --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/commons/commons.dart @@ -0,0 +1,8 @@ +String baseLink(String path) { + const basePath = + 'https://github.com/flame-engine/flame/blob/main/packages/flame_jenny/'; + + return '$basePath$path'; +} + +const double fontSize = 24; diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/button_row.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/button_row.dart new file mode 100644 index 000000000..52524946d --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/button_row.dart @@ -0,0 +1,71 @@ +import 'package:examples/stories/bridge_libraries/flame_jenny/components/dialogue_button.dart'; +import 'package:flame/components.dart'; +import 'package:jenny/jenny.dart'; + +class ButtonRow extends PositionComponent { + ButtonRow({required super.size}) : super(position: Vector2(0, 96)); + + void removeButtons() { + final buttonList = children.query(); + if (buttonList.isNotEmpty) { + for (final dialogueButton in buttonList) { + if (dialogueButton.parent != null) { + dialogueButton.removeFromParent(); + } + } + } + } + + void showNextButton(Function() onNextButtonPressed) { + removeButtons(); + final nextButton = DialogueButton( + assetPath: 'green_button_sqr.png', + text: 'Next', + position: Vector2(size.x / 2, 0), + onPressed: () { + onNextButtonPressed(); + removeButtons(); + }, + ); + add(nextButton); + } + + void showOptionButtons({ + required Function(int optionNumber) onChoice, + required DialogueOption option1, + required DialogueOption option2, + }) { + removeButtons(); + final optionButtons = [ + DialogueButton( + assetPath: 'green_button_sqr.png', + text: option1.text, + position: Vector2(size.x / 4, 0), + onPressed: () { + onChoice(0); + removeButtons(); + }, + ), + DialogueButton( + assetPath: 'red_button_sqr.png', + text: option2.text, + position: Vector2(size.x * 3 / 4, 0), + onPressed: () { + onChoice(1); + removeButtons(); + }, + ), + ]; + addAll(optionButtons); + } + + void showCloseButton(Function() onClose) { + final closeButton = DialogueButton( + assetPath: 'green_button_sqr.png', + text: 'Close', + onPressed: () => onClose(), + position: Vector2(size.x / 2, 0), + ); + add(closeButton); + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_box.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_box.dart new file mode 100644 index 000000000..4820ce8d0 --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_box.dart @@ -0,0 +1,43 @@ +import 'package:examples/stories/bridge_libraries/flame_jenny/components/button_row.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/components/dialogue_text_box.dart'; +import 'package:flame/components.dart'; +import 'package:jenny/jenny.dart'; + +class DialogueBoxComponent extends SpriteComponent with HasGameReference { + DialogueTextBox textBox = DialogueTextBox(text: ''); + final Vector2 spriteSize = Vector2(736, 128); + late final ButtonRow buttonRow = ButtonRow(size: spriteSize); + + @override + Future onLoad() async { + position = Vector2(game.size.x / 2, 96); + anchor = Anchor.center; + sprite = await Sprite.load( + 'dialogue_box.png', + srcSize: spriteSize, + ); + await addAll([buttonRow, textBox]); + return super.onLoad(); + } + + void changeText(String newText, Function() goNextLine) { + textBox.text = newText; + buttonRow.showNextButton(goNextLine); + } + + void showOptions({ + required Function(int optionNumber) onChoice, + required DialogueOption option1, + required DialogueOption option2, + }) { + buttonRow.showOptionButtons( + onChoice: onChoice, + option1: option1, + option2: option2, + ); + } + + void showCloseButton(Function() onClose) { + buttonRow.showCloseButton(onClose); + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_button.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_button.dart new file mode 100644 index 000000000..f685782ce --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_button.dart @@ -0,0 +1,36 @@ +import 'package:examples/stories/bridge_libraries/flame_jenny/commons/commons.dart'; +import 'package:flame/components.dart'; +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; + +class DialogueButton extends SpriteButtonComponent { + DialogueButton({ + required super.position, + required this.assetPath, + required this.text, + required super.onPressed, + super.anchor = Anchor.center, + }); + + final String text; + final String assetPath; + + @override + Future onLoad() async { + button = await Sprite.load(assetPath); + add( + TextComponent( + text: text, + position: Vector2(48, 16), + anchor: Anchor.center, + size: Vector2(88, 28), + textRenderer: TextPaint( + style: const TextStyle( + fontSize: fontSize, + color: Colors.white70, + ), + ), + ), + ); + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart new file mode 100644 index 000000000..79580df5a --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart @@ -0,0 +1,85 @@ +import 'dart:async'; +import 'package:examples/stories/bridge_libraries/flame_jenny/components/dialogue_box.dart'; +import 'package:flame/components.dart' hide Timer; +import 'package:jenny/jenny.dart'; + +class DialogueControllerComponent extends Component + with DialogueView, HasGameReference { + Completer _forwardCompleter = Completer(); + Completer _choiceCompleter = Completer(); + Completer _closeCompleter = Completer(); + late final DialogueBoxComponent _dialogueBoxComponent = + DialogueBoxComponent(); + + @override + Future onNodeStart(Node node) async { + _closeCompleter = Completer(); + _addDialogueBox(); + } + + void _addDialogueBox() { + game.camera.viewport.add(_dialogueBoxComponent); + } + + @override + Future onNodeFinish(Node node) async { + _dialogueBoxComponent.showCloseButton(_onClose); + return _closeCompleter.future; + } + + void _onClose() { + if (!_closeCompleter.isCompleted) { + _closeCompleter.complete(); + } + final list = game.camera.viewport.children.query(); + if (list.isNotEmpty) { + game.camera.viewport.removeAll(list); + } + } + + Future _advance() async { + return _forwardCompleter.future; + } + + @override + FutureOr onLineStart(DialogueLine line) async { + _forwardCompleter = Completer(); + _changeTextAndShowNextButton(line); + await _advance(); + return super.onLineStart(line); + } + + void _changeTextAndShowNextButton(DialogueLine line) { + final characterName = line.character?.name ?? ''; + final dialogueLineText = '$characterName: ${line.text}'; + _dialogueBoxComponent.changeText(dialogueLineText, _goNextLine); + } + + void _goNextLine() { + if (!_forwardCompleter.isCompleted) { + _forwardCompleter.complete(); + } + } + + @override + FutureOr onChoiceStart(DialogueChoice choice) async { + _forwardCompleter = Completer(); + _choiceCompleter = Completer(); + _dialogueBoxComponent.showOptions( + onChoice: _onChoice, + option1: choice.options[0], + option2: choice.options[1], + ); + await _advance(); + return _choiceCompleter.future; + } + + void _onChoice(int optionNumber) { + if (!_forwardCompleter.isCompleted) { + _forwardCompleter.complete(); + } + if (!_choiceCompleter.isCompleted) { + _choiceCompleter.complete(optionNumber); + } + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_text_box.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_text_box.dart new file mode 100644 index 000000000..fe38ebfcc --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/dialogue_text_box.dart @@ -0,0 +1,17 @@ +import 'package:examples/stories/bridge_libraries/flame_jenny/commons/commons.dart'; +import 'package:flame/components.dart'; +import 'package:flutter/material.dart'; + +class DialogueTextBox extends TextBoxComponent { + DialogueTextBox({required super.text}) + : super( + position: Vector2(16, 16), + size: Vector2(704, 96), + textRenderer: TextPaint( + style: const TextStyle( + fontSize: fontSize, + color: Colors.black, + ), + ), + ); +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/components/menu_button.dart b/examples/lib/stories/bridge_libraries/flame_jenny/components/menu_button.dart new file mode 100644 index 000000000..de1619652 --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/components/menu_button.dart @@ -0,0 +1,35 @@ +import 'package:flame/components.dart'; +import 'package:flame/input.dart'; +import 'package:flame/palette.dart'; +import 'package:flame/text.dart'; +import 'package:flutter/material.dart'; + +class MenuButton extends ButtonComponent { + MenuButton({ + required super.position, + required super.onPressed, + required this.text, + }) : super(size: Vector2(128, 42)); + + late String text; + + final Paint white = BasicPalette.white.paint(); + final TextPaint topTextPaint = TextPaint( + style: TextStyle(color: BasicPalette.black.color), + ); + + @override + Future onLoad() async { + button = RectangleComponent(paint: white, size: size); + anchor = Anchor.center; + add( + TextComponent( + text: text, + textRenderer: topTextPaint, + position: size / 2, + anchor: Anchor.center, + priority: 1, + ), + ); + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/jenny.dart b/examples/lib/stories/bridge_libraries/flame_jenny/jenny.dart new file mode 100644 index 000000000..e9d512e76 --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/jenny.dart @@ -0,0 +1,29 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/commons/commons.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/jenny_advanced_example.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/jenny_simple_example.dart'; +import 'package:flame/game.dart'; + +void addFlameJennyExample(Dashbook dashbook) { + dashbook.storiesOf('FlameJenny') + ..add( + 'Simple Jenny example', + (_) => GameWidget( + game: JennySimpleExample(), + ), + codeLink: baseLink( + 'bridge_libraries/flame_jenny/jenny_simple_example.dart', + ), + info: JennySimpleExample.description, + ) + ..add( + 'Advanced Jenny example', + (_) => GameWidget( + game: JennyAdvancedExample(), + ), + codeLink: baseLink( + 'bridge_libraries/flame_jenny/jenny_advanced_example.dart', + ), + info: JennyAdvancedExample.description, + ); +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/jenny_advanced_example.dart b/examples/lib/stories/bridge_libraries/flame_jenny/jenny_advanced_example.dart new file mode 100644 index 000000000..c7686aa2f --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/jenny_advanced_example.dart @@ -0,0 +1,76 @@ +import 'dart:ui'; + +import 'package:examples/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/components/menu_button.dart'; +import 'package:flame/components.dart'; +import 'package:flame/game.dart'; +import 'package:flame/palette.dart'; +import 'package:flame/text.dart'; +import 'package:flutter/services.dart'; +import 'package:jenny/jenny.dart'; + +class JennyAdvancedExample extends FlameGame { + static const String description = ''' + This is an advanced example of how to use the Jenny Package. + It includes implementing dialogue choices, setting custom variables, + using commands and implementing User-Defined Commands, . + '''; + + int coins = 0; + + final Paint white = BasicPalette.white.paint(); + final TextPaint mainTextPaint = TextPaint( + style: TextStyle(color: BasicPalette.white.color), + ); + final TextPaint buttonTextPaint = TextPaint( + style: TextStyle(color: BasicPalette.black.color), + ); + final startButtonSize = Vector2(128, 56); + + late final TextComponent header = TextComponent( + text: 'Select player name.', + position: Vector2(size.x / 2, 56), + size: startButtonSize, + anchor: Anchor.center, + textRenderer: mainTextPaint, + ); + + Future startDialogue(String playerName) async { + final dialogueControllerComponent = DialogueControllerComponent(); + add(dialogueControllerComponent); + + final yarnProject = YarnProject(); + + yarnProject + ..commands.addCommand1('updateCoins', updateCoins) + ..variables.setVariable(r'$playerName', playerName) + ..parse(await rootBundle.loadString('assets/yarn/advanced.yarn')); + final dialogueRunner = DialogueRunner( + yarnProject: yarnProject, + dialogueViews: [dialogueControllerComponent], + ); + dialogueRunner.startDialogue('gamble'); + } + + void updateCoins(int amountChange) { + coins += amountChange; + header.text = 'Select player name. Current coins: $coins'; + } + + @override + Future onLoad() async { + addAll([ + header, + MenuButton( + position: Vector2(size.x / 4, 128), + onPressed: () => startDialogue('Jessie'), + text: 'Jessie', + ), + MenuButton( + position: Vector2(size.x * 3 / 4, 128), + onPressed: () => startDialogue('James'), + text: 'James', + ), + ]); + } +} diff --git a/examples/lib/stories/bridge_libraries/flame_jenny/jenny_simple_example.dart b/examples/lib/stories/bridge_libraries/flame_jenny/jenny_simple_example.dart new file mode 100644 index 000000000..7aacc0831 --- /dev/null +++ b/examples/lib/stories/bridge_libraries/flame_jenny/jenny_simple_example.dart @@ -0,0 +1,36 @@ +import 'package:examples/stories/bridge_libraries/flame_jenny/components/dialogue_controller_component.dart'; +import 'package:examples/stories/bridge_libraries/flame_jenny/components/menu_button.dart'; +import 'package:flame/game.dart'; +import 'package:flutter/services.dart'; +import 'package:jenny/jenny.dart'; + +class JennySimpleExample extends FlameGame { + static const String description = ''' + This is a simple example of how to use the Jenny Package. + It includes instantiating YarnProject and parsing a .yarn script. + '''; + + Future startDialogue() async { + final dialogueControllerComponent = DialogueControllerComponent(); + add(dialogueControllerComponent); + + final yarnProject = YarnProject(); + yarnProject.parse(await rootBundle.loadString('assets/yarn/simple.yarn')); + final dialogueRunner = DialogueRunner( + yarnProject: yarnProject, + dialogueViews: [dialogueControllerComponent], + ); + dialogueRunner.startDialogue('hello_world'); + } + + @override + Future onLoad() async { + addAll([ + MenuButton( + position: Vector2(size.x / 2, 96), + onPressed: startDialogue, + text: 'Start conversation', + ), + ]); + } +} diff --git a/examples/pubspec.yaml b/examples/pubspec.yaml index abd00ba16..0036431dc 100644 --- a/examples/pubspec.yaml +++ b/examples/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: flutter: sdk: flutter google_fonts: ^4.0.4 + jenny: ^1.3.0 meta: ^1.9.1 padracing: ^1.0.0 provider: ^6.0.5 @@ -49,3 +50,4 @@ flutter: - assets/tiles/ - assets/audio/music/ - assets/audio/sfx/ + - assets/yarn/