mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-03 20:36:31 +08:00
114 lines
3.4 KiB
Dart
Executable File
114 lines
3.4 KiB
Dart
Executable File
import 'dart:math';
|
|
|
|
import 'package:flame/components.dart';
|
|
import 'package:flame/flame.dart';
|
|
import 'package:flame/game.dart';
|
|
import 'package:flame/input.dart';
|
|
import 'package:flame_isolate_example/brains/path_finder.dart';
|
|
import 'package:flame_isolate_example/brains/worker_overmind.dart';
|
|
import 'package:flame_isolate_example/constants.dart';
|
|
import 'package:flame_isolate_example/game_map/game_map.dart';
|
|
import 'package:flame_isolate_example/objects/colonists_object.dart';
|
|
import 'package:flame_isolate_example/terrain/terrain.dart';
|
|
import 'package:flame_isolate_example/units/worker.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
class ColonistsGame extends FlameGame with KeyboardEvents {
|
|
final PositionComponent _cameraPosition = PositionComponent();
|
|
late final GameMap _currentMap;
|
|
final world = World();
|
|
late final CameraComponent cameraComponent;
|
|
|
|
@override
|
|
Future<void> onLoad() async {
|
|
cameraComponent = CameraComponent.withFixedResolution(
|
|
world: world,
|
|
width: 400,
|
|
height: 600,
|
|
);
|
|
addAll([cameraComponent, world]);
|
|
cameraComponent.follow(_cameraPosition);
|
|
cameraComponent.viewfinder.zoom = 0.4;
|
|
|
|
await Flame.images.load('bread.png');
|
|
await Flame.images.load('worker.png');
|
|
await Flame.images.load('cheese.png');
|
|
|
|
world.add(_currentMap = GameMap());
|
|
|
|
_cameraPosition.position = Vector2(
|
|
GameMap.mapSizeX * Constants.tileSize / 2,
|
|
GameMap.mapSizeY * Constants.tileSize / 2,
|
|
);
|
|
|
|
add(WorkerOvermind());
|
|
}
|
|
|
|
Terrain tileAtPosition(int x, int y) {
|
|
return _currentMap.tileAtPosition(x, y);
|
|
}
|
|
|
|
static const double cameraSpeed = 200;
|
|
|
|
double _downForce = 0;
|
|
double _upForce = 0;
|
|
double _rightForce = 0;
|
|
double _leftForce = 0;
|
|
|
|
@override
|
|
KeyEventResult onKeyEvent(
|
|
RawKeyEvent event,
|
|
Set<LogicalKeyboardKey> keysPressed,
|
|
) {
|
|
var howMuch = 0.0;
|
|
if (event is RawKeyDownEvent) {
|
|
howMuch = 1;
|
|
} else if (event is RawKeyUpEvent) {
|
|
howMuch = 0;
|
|
}
|
|
|
|
if (event.data.logicalKey == LogicalKeyboardKey.keyS) {
|
|
_downForce = howMuch;
|
|
} else if (event.data.logicalKey == LogicalKeyboardKey.keyW) {
|
|
_upForce = howMuch;
|
|
} else if (event.data.logicalKey == LogicalKeyboardKey.keyD) {
|
|
_rightForce = howMuch;
|
|
} else if (event.data.logicalKey == LogicalKeyboardKey.keyA) {
|
|
_leftForce = howMuch;
|
|
} else if (event.data.logicalKey == LogicalKeyboardKey.numpadAdd &&
|
|
event is RawKeyDownEvent) {
|
|
cameraComponent.viewfinder.zoom = min(
|
|
cameraComponent.viewfinder.zoom + 0.1,
|
|
5,
|
|
);
|
|
} else if (event.data.logicalKey == LogicalKeyboardKey.numpadSubtract &&
|
|
event is RawKeyDownEvent) {
|
|
cameraComponent.viewfinder.zoom = max(
|
|
cameraComponent.viewfinder.zoom - 0.1,
|
|
0.1,
|
|
);
|
|
}
|
|
return super.onKeyEvent(event, keysPressed);
|
|
}
|
|
|
|
final direction = Vector2(0, 0);
|
|
|
|
@override
|
|
void update(double dt) {
|
|
super.update(dt);
|
|
direction.setValues(_rightForce - _leftForce, _downForce - _upForce);
|
|
final step = direction..scale(cameraSpeed * dt * 4);
|
|
_cameraPosition.position += step;
|
|
if (workers.isNotEmpty) {
|
|
cameraComponent.follow(workers.first);
|
|
}
|
|
}
|
|
|
|
PathFinderData get pathFinderData => _currentMap.pathFinderData;
|
|
|
|
Set<Worker> get workers => _currentMap.workers;
|
|
|
|
List<ColonistsObject> get worldObjects => _currentMap.worldObjects;
|
|
}
|