mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-02 11:28:20 +08:00
Layer proposal
This commit is contained in:
49
doc/examples/layers/.gitignore
vendored
Normal file
49
doc/examples/layers/.gitignore
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# Miscellaneous
|
||||||
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
|
||||||
|
# IntelliJ related
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
|
# is commented out by default.
|
||||||
|
#.vscode/
|
||||||
|
|
||||||
|
# Flutter/Dart/Pub related
|
||||||
|
**/doc/api/
|
||||||
|
**/ios/Flutter/.last_build_id
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.packages
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Web related
|
||||||
|
lib/generated_plugin_registrant.dart
|
||||||
|
|
||||||
|
# Symbolication related
|
||||||
|
app.*.symbols
|
||||||
|
|
||||||
|
# Obfuscation related
|
||||||
|
app.*.map.json
|
||||||
|
|
||||||
|
# Exceptions to above rules.
|
||||||
|
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||||
|
|
||||||
|
android
|
||||||
|
ios
|
||||||
|
macos
|
||||||
|
web
|
||||||
10
doc/examples/layers/.metadata
Normal file
10
doc/examples/layers/.metadata
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: 9d58a87066d1da98eb06826918e4b90cc76ae0ef
|
||||||
|
channel: master
|
||||||
|
|
||||||
|
project_type: app
|
||||||
3
doc/examples/layers/README.md
Normal file
3
doc/examples/layers/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# layers
|
||||||
|
|
||||||
|
Simple project to showcase the layer feature of Flame
|
||||||
BIN
doc/examples/layers/assets/images/bomb_ptero.png
Normal file
BIN
doc/examples/layers/assets/images/bomb_ptero.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
doc/examples/layers/assets/images/sprites.png
Normal file
BIN
doc/examples/layers/assets/images/sprites.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1010 B |
76
doc/examples/layers/lib/main.dart
Normal file
76
doc/examples/layers/lib/main.dart
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import 'package:flutter/material.dart' hide Animation;
|
||||||
|
import 'package:flame/game.dart';
|
||||||
|
import 'package:flame/sprite.dart';
|
||||||
|
import 'package:flame/spritesheet.dart';
|
||||||
|
import 'package:flame/animation.dart';
|
||||||
|
import 'package:flame/layer.dart';
|
||||||
|
import 'package:flame/flame.dart';
|
||||||
|
|
||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
void main() async {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
await Flame.util.fullScreen();
|
||||||
|
|
||||||
|
final sprite = await Sprite.loadSprite('sprites.png');
|
||||||
|
|
||||||
|
await Flame.images.load('bomb_ptero.png');
|
||||||
|
final spriteSheet = SpriteSheet(
|
||||||
|
imageName: 'bomb_ptero.png',
|
||||||
|
textureWidth: 48,
|
||||||
|
textureHeight: 32,
|
||||||
|
columns: 4,
|
||||||
|
rows: 1);
|
||||||
|
|
||||||
|
final animation = spriteSheet.createAnimation(0, stepTime: 0.2, to: 3);
|
||||||
|
runApp(LayerGame(sprite, animation).widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
class LayerGame extends Game {
|
||||||
|
Sprite sprite;
|
||||||
|
Animation animation;
|
||||||
|
Layer layerWithDropShadow;
|
||||||
|
Layer animationLayerWithDropShadow;
|
||||||
|
Layer layerWithoutDropShadow;
|
||||||
|
|
||||||
|
LayerGame(this.sprite, this.animation) {
|
||||||
|
layerWithDropShadow = Layer()..preProcessors.add(ShadowProcessor());
|
||||||
|
animationLayerWithDropShadow = Layer()
|
||||||
|
..preProcessors.add(ShadowProcessor());
|
||||||
|
|
||||||
|
layerWithoutDropShadow = Layer();
|
||||||
|
|
||||||
|
layerWithoutDropShadow.beginRendering();
|
||||||
|
layerWithDropShadow.beginRendering();
|
||||||
|
|
||||||
|
sprite.renderRect(
|
||||||
|
layerWithoutDropShadow.canvas, const Rect.fromLTWH(50, 50, 200, 200));
|
||||||
|
sprite.renderRect(
|
||||||
|
layerWithDropShadow.canvas, const Rect.fromLTWH(50, 50, 200, 200));
|
||||||
|
|
||||||
|
layerWithoutDropShadow.finishRendering();
|
||||||
|
layerWithDropShadow.finishRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void update(double dt) {
|
||||||
|
animation.update(dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void render(Canvas canvas) {
|
||||||
|
layerWithoutDropShadow.render(canvas);
|
||||||
|
layerWithDropShadow.render(canvas, y: 250);
|
||||||
|
|
||||||
|
animationLayerWithDropShadow.beginRendering();
|
||||||
|
animation.getSprite().renderRect(animationLayerWithDropShadow.canvas,
|
||||||
|
const Rect.fromLTWH(0, 0, 150, 100));
|
||||||
|
animationLayerWithDropShadow
|
||||||
|
..finishRendering()
|
||||||
|
..render(canvas, x: 100, y: 600);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Color backgroundColor() => const Color(0xFF38607C);
|
||||||
|
}
|
||||||
27
doc/examples/layers/pubspec.yaml
Normal file
27
doc/examples/layers/pubspec.yaml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
name: layers
|
||||||
|
description: Simple project to showcase the layer feature of Flame
|
||||||
|
|
||||||
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
|
version: 1.0.0+1
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ">=2.7.0 <3.0.0"
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
flutter:
|
||||||
|
sdk: flutter
|
||||||
|
flame:
|
||||||
|
path: ../../../
|
||||||
|
|
||||||
|
cupertino_icons: ^0.1.3
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
flutter_test:
|
||||||
|
sdk: flutter
|
||||||
|
|
||||||
|
flutter:
|
||||||
|
uses-material-design: true
|
||||||
|
assets:
|
||||||
|
- assets/images/sprites.png
|
||||||
|
- assets/images/bomb_ptero.png
|
||||||
71
lib/layer.dart
Normal file
71
lib/layer.dart
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
class Layer {
|
||||||
|
List<LayerProcessor> preProcessors = [];
|
||||||
|
List<LayerProcessor> postProcessors = [];
|
||||||
|
|
||||||
|
Picture _picture;
|
||||||
|
|
||||||
|
PictureRecorder _recorder;
|
||||||
|
Canvas _canvas;
|
||||||
|
|
||||||
|
void render(Canvas canvas, {double x = 0.0, double y = 0.0}) {
|
||||||
|
if (_picture == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.save();
|
||||||
|
canvas.translate(x, y);
|
||||||
|
|
||||||
|
preProcessors.forEach((p) => p.process(_picture, canvas));
|
||||||
|
canvas.drawPicture(_picture);
|
||||||
|
postProcessors.forEach((p) => p.process(_picture, canvas));
|
||||||
|
canvas.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
Canvas get canvas {
|
||||||
|
assert(_canvas != null,
|
||||||
|
'Layer is not ready for rendering, call beginRendering first');
|
||||||
|
return _canvas;
|
||||||
|
}
|
||||||
|
|
||||||
|
void beginRendering() {
|
||||||
|
_recorder = PictureRecorder();
|
||||||
|
_canvas = Canvas(_recorder);
|
||||||
|
}
|
||||||
|
|
||||||
|
void finishRendering() {
|
||||||
|
_picture = _recorder.endRecording();
|
||||||
|
|
||||||
|
_recorder = null;
|
||||||
|
_canvas = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class LayerProcessor {
|
||||||
|
void process(Picture pic, Canvas canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShadowProcessor extends LayerProcessor {
|
||||||
|
Paint _shadowPaint;
|
||||||
|
|
||||||
|
final Offset offset;
|
||||||
|
|
||||||
|
ShadowProcessor({
|
||||||
|
this.offset = const Offset(10, 10),
|
||||||
|
double opacity = 0.9,
|
||||||
|
Color color = const Color(0xFF000000),
|
||||||
|
}) {
|
||||||
|
_shadowPaint = Paint()
|
||||||
|
..colorFilter =
|
||||||
|
ColorFilter.mode(color.withOpacity(opacity), BlendMode.srcATop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void process(Picture pic, Canvas canvas) {
|
||||||
|
canvas.saveLayer(Rect.largest, _shadowPaint);
|
||||||
|
canvas.translate(offset.dx, offset.dy);
|
||||||
|
canvas.drawPicture(pic);
|
||||||
|
canvas.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user