Skip to content

Commit

Permalink
Merge branch 'master' of github.com:MysticalNobody/flame_game_jam_2021
Browse files Browse the repository at this point in the history
  • Loading branch information
MysticalNobody committed Oct 30, 2021
2 parents 36cb273 + da29ad7 commit 8d69384
Show file tree
Hide file tree
Showing 7 changed files with 220 additions and 106 deletions.
3 changes: 3 additions & 0 deletions lib/component/components.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@ import 'package:example/presentation/game/game_view.dart';
import 'package:flame/components.dart';
import 'package:flame/extensions.dart';
import 'package:flame/input.dart';
import 'package:flame_forge2d/contact_callbacks.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_forge2d/sprite_body_component.dart';
import 'package:flutter/widgets.dart' as widgets;
import 'package:forge2d/src/dynamics/body.dart';

part 'background_component.dart';
part 'components_priority.dart';
Expand Down
190 changes: 179 additions & 11 deletions lib/component/fixture_component.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,66 @@
part of components;

class FixtureComponent extends SpriteBodyComponent {
FixtureComponent({
/// obstacle to bounce
/// obstacle to win
/// obstacle to lose
enum ObstacleType {
bounce,
win,
lose,
}

class WinContactCallback
extends ContactCallback<CandyBagComponent, WinObstacleComponent> {
WinContactCallback({required this.game, required this.onWin});
final widgets.VoidCallback onWin;
final AppGame game;
@override
void begin(CandyBagComponent a, WinObstacleComponent b, Contact contact) {
log(b.body.toString());
onWin();
}

@override
void end(CandyBagComponent a, WinObstacleComponent b, Contact contact) {}
}

class KillingContactCallback
extends ContactCallback<CandyBagComponent, KillingObstacleComponent> {
KillingContactCallback({required this.game, required this.onKill});
final widgets.VoidCallback onKill;
final AppGame game;
@override
void begin(CandyBagComponent a, KillingObstacleComponent b, Contact contact) {
log(b.body.toString());

game.remove(a);
onKill();
}

@override
void end(CandyBagComponent a, KillingObstacleComponent b, Contact contact) {}
}

class BounceContactCallback
extends ContactCallback<CandyBagComponent, BounceContactCallback> {
BounceContactCallback({required this.game, required this.onBounce});
final widgets.VoidCallback onBounce;
final AppGame game;
@override
void begin(CandyBagComponent a, BounceContactCallback b, Contact contact) {
log(b.toString());
}

@override
void end(CandyBagComponent a, BounceContactCallback b, Contact contact) {}
}

/// Like a door or another player
class CandyBagComponent extends SpriteBodyComponent {
CandyBagComponent({
required this.title,
required this.game,
required this.position,
Expand All @@ -13,39 +72,147 @@ class FixtureComponent extends SpriteBodyComponent {
size * game.aspectRatio,
);

factory FixtureComponent.createWall({
factory CandyBagComponent.create({
required AppGame game,
required Vector2 position,
}) =>
FixtureComponent(
CandyBagComponent(
game: game,
title: SpritesTitles.wall,
title: SpritesTitles.candyBag,
position: position,
type: BodyType.static,
// type: BodyType.dynamic,
size: Vector2(100, 100),
);

factory FixtureComponent.createCandyBag({
final Vector2 position;
final SpritesTitles title;
final AppGame game;
final Sprite sprite;
final BodyType type;

Vector2 getSpriteSize() => sprite.srcSize * game.aspectRatio;

@override
Body createBody() {
final PolygonShape shape = PolygonShape();

final vertices = [
Vector2(-size.x / 2, -size.y / 2),
Vector2(size.x / 2, -size.y / 2),
Vector2(0, size.y / 2),
];
shape.set(vertices);

final fixtureDef = FixtureDef(shape)
..userData = this // To be able to determine object in collision
..restitution = 0.3
..density = 1.0
..friction = 0.2;

final bodyDef = BodyDef()
..userData = this
..position = position
..angle = (position.x + position.y) / 2 * 3.14
..type = type;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}

/// Like a door or another player
class WinObstacleComponent extends BaseObstacleComponent {
WinObstacleComponent({
required AppGame game,
required SpritesTitles title,
required Vector2 position,
required Vector2 size,
BodyType type = BodyType.dynamic,
}) : super(
game: game,
position: position,
size: size,
title: title,
type: type,
);
factory WinObstacleComponent.create({
required AppGame game,
required Vector2 position,
}) =>
FixtureComponent(
WinObstacleComponent(
game: game,
title: SpritesTitles.wall,
position: position,
size: Vector2(100, 100),
title: SpritesTitles.candyBag,
);
}

/// Like a wall
class BounceObstacleComponent extends BaseObstacleComponent {
BounceObstacleComponent({
required AppGame game,
required SpritesTitles title,
required Vector2 position,
required Vector2 size,
BodyType type = BodyType.dynamic,
}) : super(
game: game,
position: position,
size: size,
title: title,
type: type,
);
factory BounceObstacleComponent.create({
required AppGame game,
required Vector2 position,
}) =>
BounceObstacleComponent(
game: game,
title: SpritesTitles.wall,
position: position,
type: BodyType.static,
size: Vector2(100, 100),
);
}

factory FixtureComponent.createGhost({
/// Like a ghost
class KillingObstacleComponent extends BaseObstacleComponent {
KillingObstacleComponent({
required AppGame game,
required SpritesTitles title,
required Vector2 position,
required Vector2 size,
BodyType type = BodyType.dynamic,
}) : super(
game: game,
position: position,
size: size,
title: title,
type: type,
);
factory KillingObstacleComponent.create({
required AppGame game,
required Vector2 position,
}) =>
FixtureComponent(
KillingObstacleComponent(
game: game,
title: SpritesTitles.ghost,
position: position,
size: Vector2(100, 80),
);
}

/// Like a ghost
class BaseObstacleComponent extends SpriteBodyComponent {
BaseObstacleComponent({
required this.title,
required this.game,
required this.position,
required Vector2 size,
this.type = BodyType.dynamic,
}) : sprite = game.getSprite(title),
super(
game.getSprite(title),
size * game.aspectRatio,
);

final Vector2 position;
final SpritesTitles title;
Expand Down Expand Up @@ -73,6 +240,7 @@ class FixtureComponent extends SpriteBodyComponent {
..friction = 0.2;

final bodyDef = BodyDef()
..userData = this
..position = position
..type = type;
return world.createBody(bodyDef)..createFixture(fixtureDef);
Expand Down
45 changes: 31 additions & 14 deletions lib/presentation/game/game_view.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'dart:async';
import 'dart:typed_data';

import 'package:example/component/components.dart';
import 'package:example/component/ground_component.dart';
Expand All @@ -14,9 +13,7 @@ import 'package:flame_forge2d/forge2d_game.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:just_audio/just_audio.dart';
import 'package:path_provider/path_provider.dart';
import 'package:universal_io/io.dart';
// import 'package:just_audio/just_audio.dart';

class AppGameView extends StatefulWidget {
const AppGameView({
Expand All @@ -30,21 +27,21 @@ class AppGameView extends StatefulWidget {
}

class _AppGameViewState extends State<AppGameView> {
final player = AudioPlayer();
// final player = AudioPlayer();
@override
void initState() {
play();
super.initState();
}

Future<void> play() async {
await player.setAsset('assets/audio/pixies-where-is-my-mind.mp3');
// player.play();
// await player.setAsset('assets/audio/pixies-where-is-my-mind.mp3');
// await player.play();
}

@override
void dispose() {
player.stop();
// player.stop();
super.dispose();
}

Expand Down Expand Up @@ -77,6 +74,7 @@ class AppGame extends Forge2DGame
double get worldBottomY => worldBounds.bottom - 100;
@override
Future<void> onLoad() async {
await super.onLoad();
await spritesCache.onLoad();

gameCamera.followPosition();
Expand All @@ -87,7 +85,11 @@ class AppGame extends Forge2DGame
camera
..worldBounds = worldSize.toRect()
..zoom = 0.8;
await addAll(createBoundaries(this));

addContactCallback(WinContactCallback(game: this, onWin: () {}));
addContactCallback(KillingContactCallback(game: this, onKill: () {}));
addContactCallback(BounceContactCallback(game: this, onBounce: () {}));
await add(BackgroundComponent(worldSize, bg));
await add(YoungsterComponent(
game: this,
Expand All @@ -96,27 +98,42 @@ class AppGame extends Forge2DGame
size: Vector2(100, 100),
));

await add(BackgroundComponent(worldSize, bg));
await add(
FixtureComponent.createWall(
YoungsterComponent(
game: this,
position: Vector2(600, -worldBottomY),
title: SpritesTitles.ghost,
position: Vector2(400, -100),
size: Vector2(100, 100),
),
);

await add(
FixtureComponent.createCandyBag(
WinObstacleComponent.create(
game: this,
position: Vector2(500, -worldBottomY),
),
);
await add(
FixtureComponent.createGhost(
CandyBagComponent.create(
game: this,
position: Vector2(500, -worldBottomY + 300),
),
);
await add(
KillingObstacleComponent.create(
game: this,
position: Vector2(350, -145),
),
);
await addAll(createBoundaries(this));
await onAssetsLoad();
return super.onLoad();
}

@override
void render(Canvas canvas) {
// TODO: implement render
print('');
super.render(canvas);
}

@override
Expand Down
Loading

0 comments on commit 8d69384

Please sign in to comment.