lass BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable {
Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5);
ate SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer;
erride @override @override @override
onMounted() { void onMounted() { void onMounted() { void onMounted() {
nderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy);
omponent(_renderer); addComponent(_renderer); addComponent(_renderer); addComponent(_renderer);
} } }
@override @override @override
void onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) {
final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>();
transform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt;
} } }
} } }
MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState {
ride @override @override @override
le<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* {
GameWidget( yield GameWidget( yield GameWidget( yield GameWidget(
onents: () => [ components: () => [ components: () => [ components: () => [
ectTransform(), ObjectTransform(), ObjectTransform(), ObjectTransform(),
Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0,
BouncingBehavior(), BouncingBehavior(), BouncingBehavior(), BouncingBehavior(),
], ], ], ],
); ); ); );
} } }
} } }
in() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld()));
al Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic
hBatch() { void _flushBatch() { void _flushBatch() { void _flushBatch() {
fer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer();
_gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer);
_gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW);
} } }
s BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable {
set _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5);
SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer;
ide @override @override @override
Mounted() { void onMounted() { void onMounted() { void onMounted() {
rer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy);
onent(_renderer); addComponent(_renderer); addComponent(_renderer); addComponent(_renderer);
} } } }
@override @override @override @override
oid onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) {
final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>();
ransform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt;
} } }
} } }
ameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState {
e @override @override @override
Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* {
yield GameWidget( yield GameWidget( yield GameWidget( yield GameWidget(
components: () => [ components: () => [ components: () => [ components: () => [
ObjectTransform(), ObjectTransform(), ObjectTransform(), ObjectTransform(),
Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0,
BouncingBehavior(), BouncingBehavior(), BouncingBehavior(), BouncingBehavior(),
], ], ], ],
); ); );
} } }
} } }
) => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld()));
// Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic
oid _flushBatch() { void _flushBatch() { void _flushBatch() { void _flushBatch() {
final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer();
gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer);
l.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW);
} } }
ouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable {
_velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5);
riteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer;
@override @override @override
void onMounted() { void onMounted() { void onMounted() { void onMounted() {
_renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy);
addComponent(_renderer); addComponent(_renderer); addComponent(_renderer); addComponent(_renderer);
} } }
erride @override @override @override
onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) {
al transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>();
sform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt;
} } }
} } }
class MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState {
@override @override @override @override
Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* {
yield GameWidget( yield GameWidget( yield GameWidget( yield GameWidget(
components: () => [ components: () => [ components: () => [ components: () => [
ObjectTransform(), ObjectTransform(), ObjectTransform(), ObjectTransform(),
Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0,
BouncingBehavior(), BouncingBehavior(), BouncingBehavior(), BouncingBehavior(),
], ], ],
); ); );
} } }
} } }
oid main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld()));
Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic
_flushBatch() { void _flushBatch() { void _flushBatch() { void _flushBatch() {
al buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer();
bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer);
ufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW);
} } }
cingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable { class BouncingBehavior extends Behavior with Tickable, Collidable {
elocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5); Offset _velocity = const Offset(2.0, 1.5);
late SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer; late SpriteRenderer _renderer;
@override @override @override @override
oid onMounted() { void onMounted() { void onMounted() { void onMounted() {
_renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy); _renderer = SpriteRenderer()..sprite = GameSprite(texture: Asset.enemy);
ddComponent(_renderer); addComponent(_renderer); addComponent(_renderer); addComponent(_renderer);
} } }
ide @override @override @override
Update(double dt) { void onUpdate(double dt) { void onUpdate(double dt) { void onUpdate(double dt) {
transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>(); final transform = getComponent<ObjectTransform>();
rm.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt; transform.position += _velocity * dt;
} } } }
} } }
ss MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState { class MyGameWorld extends GameState {
verride @override @override @override
rable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* { Iterable<Widget> build(BuildContext context) sync* {
eld GameWidget( yield GameWidget( yield GameWidget( yield GameWidget(
omponents: () => [ components: () => [ components: () => [ components: () => [
ObjectTransform(), ObjectTransform(), ObjectTransform(), ObjectTransform(),
amera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0, Camera()..orthographicSize = 5.0,
uncingBehavior(), BouncingBehavior(), BouncingBehavior(), BouncingBehavior(),
], ], ],
); ); ); );
} } } }
} } }
main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld())); void main() => runApp(const Game(child: MyGameWorld()));
ernal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic // Internal Pipeline Logic
lushBatch() { void _flushBatch() { void _flushBatch() { void _flushBatch() {
buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer(); final buffer = _gl.createBuffer();
dBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer); _gl.bindBuffer(GL.ARRAY_BUFFER, buffer);
erData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW); _gl.bufferData(GL.ARRAY_BUFFER, _vertexData, GL.DYNAMIC_DRAW);
} } }
FRAME_TIME (ms) [ACTIVE]
0ms16.6ms (60fps)
TRIGGER_ZONE_#04
OnOverlap: notify()
FPS: 60.0
Delta: 16.6ms
VRAM: 124MB
Draws: 12
viewport: 0,0,1920,1080
GOO2D
A Low Level Flutter 2D Game Engine