From 29ac05952748d55a598901b08132195726f5cf4e Mon Sep 17 00:00:00 2001 From: Luan Nico Date: Sun, 24 Aug 2025 20:31:54 -0400 Subject: [PATCH] feat: Add glossary and first cube slides --- .../slides/assets/images/diagrams/mesh.png | Bin 0 -> 3982 bytes .../slides/assets/images/diagrams/surface.png | Bin 0 -> 12354 bytes .../slides/assets/images/diagrams/vertex.png | Bin 0 -> 4222 bytes packages/slides/lib/main.dart | 3 + .../lib/slides/components/slide_game.dart | 23 ++++++ .../lib/slides/slide_04_flame_game_loop.dart | 11 +-- .../slides/lib/slides/slide_06_3d_axes.dart | 11 +-- .../slides/lib/slides/slide_09_glossary.dart | 28 +++++++ .../lib/slides/slide_10_first_cube.dart | 74 ++++++++++++++++++ packages/slides/lib/slides/slides.dart | 2 + packages/template/README.md | 2 +- 11 files changed, 135 insertions(+), 19 deletions(-) create mode 100644 packages/slides/assets/images/diagrams/mesh.png create mode 100644 packages/slides/assets/images/diagrams/surface.png create mode 100644 packages/slides/assets/images/diagrams/vertex.png create mode 100644 packages/slides/lib/slides/components/slide_game.dart create mode 100644 packages/slides/lib/slides/slide_09_glossary.dart create mode 100644 packages/slides/lib/slides/slide_10_first_cube.dart diff --git a/packages/slides/assets/images/diagrams/mesh.png b/packages/slides/assets/images/diagrams/mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..cf332f2d7f8789b81fa447c88672d8eca3904c37 GIT binary patch literal 3982 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%0DJhRFEaak?|MQBa7>RARx=-?oPFhM#jPenU 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 literal 0 HcmV?d00001 diff --git a/packages/slides/lib/main.dart b/packages/slides/lib/main.dart index 73cbec0..ece8e66 100644 --- a/packages/slides/lib/main.dart +++ b/packages/slides/lib/main.dart @@ -45,6 +45,9 @@ class FlutterDeckExample extends StatelessWidget { Slide06ThreeDimensionalAxes(), Slide07ThreeDimensionalProjections(), Slide08Matrices(), + Slide09Glossary(), + Slide10FirstCube(), + Slides.title('Sample Slides'), SlideSampleImage(), SlideSampleCode(), SlideSampleGame(), diff --git a/packages/slides/lib/slides/components/slide_game.dart b/packages/slides/lib/slides/components/slide_game.dart new file mode 100644 index 0000000..aeeb865 --- /dev/null +++ b/packages/slides/lib/slides/components/slide_game.dart @@ -0,0 +1,23 @@ +import 'package:flame/game.dart'; +import 'package:flutter/material.dart'; + +class SlideGame extends StatelessWidget { + final GameFactory game; + + const SlideGame({ + required this.game, + super.key, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 800, + height: 600, + child: GameWidget.controlled( + gameFactory: game, + autofocus: false, + ), + ); + } +} diff --git a/packages/slides/lib/slides/slide_04_flame_game_loop.dart b/packages/slides/lib/slides/slide_04_flame_game_loop.dart index 3bb6fa4..d7eb94d 100644 --- a/packages/slides/lib/slides/slide_04_flame_game_loop.dart +++ b/packages/slides/lib/slides/slide_04_flame_game_loop.dart @@ -1,6 +1,6 @@ -import 'package:flame/game.dart'; import 'package:flame_3d_workshop_slides/games/game_loop/game_loop.dart'; import 'package:flame_3d_workshop_slides/slides/components/slide.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide_game.dart'; import 'package:flame_3d_workshop_slides/slides/components/slide_text.dart'; import 'package:flutter/material.dart'; @@ -11,14 +11,7 @@ class Slide04FlameGameLoop extends Slide { List children(BuildContext context) { return [ SlideText.title('Game Loop'), - Container( - width: 800, - height: 600, - child: const GameWidget.controlled( - gameFactory: GameLoop.new, - autofocus: false, - ), - ), + const SlideGame(game: GameLoop.new), ]; } } diff --git a/packages/slides/lib/slides/slide_06_3d_axes.dart b/packages/slides/lib/slides/slide_06_3d_axes.dart index 6c166bd..e705f89 100644 --- a/packages/slides/lib/slides/slide_06_3d_axes.dart +++ b/packages/slides/lib/slides/slide_06_3d_axes.dart @@ -2,13 +2,13 @@ import 'dart:async'; import 'dart:math'; import 'package:flame/components.dart' hide Matrix4; -import 'package:flame/game.dart' hide Matrix4; import 'package:flame/palette.dart'; import 'package:flame_3d/camera.dart'; import 'package:flame_3d/components.dart'; import 'package:flame_3d/game.dart'; import 'package:flame_3d/resources.dart'; import 'package:flame_3d_workshop_slides/slides/components/slide.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide_game.dart'; import 'package:flame_3d_workshop_slides/slides/components/slide_text.dart'; import 'package:flutter/material.dart' hide Matrix4, Material; @@ -19,14 +19,7 @@ class Slide06ThreeDimensionalAxes extends Slide { List children(BuildContext context) { return [ SlideText.title('3D Axes'), - Container( - width: 800, - height: 600, - child: const GameWidget.controlled( - gameFactory: _ThreeDimensionalAxesGame.new, - autofocus: false, - ), - ), + const SlideGame(game: _ThreeDimensionalAxesGame.new), ]; } } diff --git a/packages/slides/lib/slides/slide_09_glossary.dart b/packages/slides/lib/slides/slide_09_glossary.dart new file mode 100644 index 0000000..68da184 --- /dev/null +++ b/packages/slides/lib/slides/slide_09_glossary.dart @@ -0,0 +1,28 @@ +import 'package:flame_3d_workshop_slides/slides/components/slide.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide_text.dart'; +import 'package:flutter/material.dart' hide Matrix4, Material; + +class Slide09Glossary extends Slide { + Slide09Glossary({super.key}) : super(route: '/slide_09_glossary'); + + @override + List children(BuildContext context) { + return [ + SlideText.title('Glossary'), + SlideText.p('Some useful terms that we are going to be using a lot.'), + SlideText.bullet('Vertex'), + SlideText.bullet('Surface'), + SlideText.bullet('Mesh'), + SlideText.bullet('Model'), + const SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Image.asset('assets/images/diagrams/vertex.png'), + Image.asset('assets/images/diagrams/surface.png'), + Image.asset('assets/images/diagrams/mesh.png'), + ], + ), + ]; + } +} diff --git a/packages/slides/lib/slides/slide_10_first_cube.dart b/packages/slides/lib/slides/slide_10_first_cube.dart new file mode 100644 index 0000000..5b25a7f --- /dev/null +++ b/packages/slides/lib/slides/slide_10_first_cube.dart @@ -0,0 +1,74 @@ +import 'package:flame/palette.dart'; +import 'package:flame_3d/camera.dart'; +import 'package:flame_3d/components.dart'; +import 'package:flame_3d/game.dart'; +import 'package:flame_3d/resources.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide_game.dart'; +import 'package:flame_3d_workshop_slides/slides/components/slide_text.dart'; +import 'package:flutter/material.dart' hide Matrix4, Material; + +class Slide10FirstCube extends Slide { + Slide10FirstCube({super.key}) : super(route: '/slide_10_first_cube'); + + @override + List children(BuildContext context) { + return [ + SlideText.title('Our First Cube!'), + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8.0, + children: [ + SlideText.code(''' +class _FirstCubeGame extends FlameGame3D { + _FirstCubeGame() + : super( + world: World3D(clearColor: ...), + camera: CameraComponent3D( + position: Vector3.all(8), + ), + ); + + @override + Future onLoad() async { + world.addAll([ + MeshComponent( + mesh: CuboidMesh( + size: Vector3.all(2.0), + material: SpatialMaterial(albedoColor: ...), + ), + ), + ]); + return super.onLoad(); + } +} + '''), + const SlideGame(game: _FirstCubeGame.new), + ], + ), + ]; + } +} + +class _FirstCubeGame extends FlameGame3D { + _FirstCubeGame() + : super( + world: World3D(clearColor: const Color(0xFF000000)), + camera: CameraComponent3D( + position: Vector3.all(8), + ), + ); + + @override + Future onLoad() async { + world.addAll([ + MeshComponent( + mesh: CuboidMesh( + size: Vector3.all(2.0), + material: SpatialMaterial(albedoColor: BasicPalette.white.color), + ), + ), + ]); + return super.onLoad(); + } +} diff --git a/packages/slides/lib/slides/slides.dart b/packages/slides/lib/slides/slides.dart index 0270f67..14584a4 100644 --- a/packages/slides/lib/slides/slides.dart +++ b/packages/slides/lib/slides/slides.dart @@ -7,6 +7,8 @@ export 'slide_05_flame_components.dart'; export 'slide_06_3d_axes.dart'; export 'slide_07_3d_projections.dart'; export 'slide_08_matrices.dart'; +export 'slide_09_glossary.dart'; +export 'slide_10_first_cube.dart'; export 'slide_sample_code.dart'; export 'slide_sample_game.dart'; export 'slide_sample_image.dart'; diff --git a/packages/template/README.md b/packages/template/README.md index cf2d810..ee74cfc 100644 --- a/packages/template/README.md +++ b/packages/template/README.md @@ -1,3 +1,3 @@ # template -Use this template to start working on your game using `flame_3d`. \ No newline at end of file +Use this template to start working on your game using `flame_3d`.