pong minimal

main
ben 2023-11-21 23:41:52 +01:00
parent b53ad6d476
commit bf51c6a614
5 changed files with 125 additions and 37 deletions

View File

@ -2,15 +2,18 @@
Pong Flutter project.
## Getting Started
- Ein einfaches Pong Spiel.
This project is a starting point for a Flutter application.
- Nur Einzelspieler.
A few resources to get you started if this is your first Flutter project:
- Score wird am Ende der Partie angezeigt.
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
- Spiel kann pausiert werden.
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
- Aktueller Score wird während der Pause angezeigt.
Geplante Business Logik:
- Selbstständige Bewegung des Balls
- Einen Punktestand-Zähler
- Button um das Spiel zu pausieren

View File

@ -9,9 +9,11 @@ class PongGame extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const MaterialApp(
return MaterialApp(
title: 'Pong Game',
home: StartScreen(),
theme:
ThemeData(scaffoldBackgroundColor: Color.fromARGB(255, 41, 38, 38)),
home: const StartScreen(),
);
}
}
@ -24,13 +26,23 @@ class StartScreen extends StatelessWidget {
return Scaffold(
body: GestureDetector(
onTap: () {
/* Navigator.of(context).push(MaterialPageRoute(
Navigator.of(context).push(MaterialPageRoute(
builder: (context) {
return const GameScreen();
},
)); */
));
},
child: const Text('Berühren um zu beginnen!'),
child: const Center(
child: Text(
'Berühren um zu beginnen!',
key: Key("tapToStart"),
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
);
}
@ -44,8 +56,90 @@ class GameScreen extends StatefulWidget {
}
class _GameScreenState extends State<GameScreen> {
final racketWidth = 120.0;
final racketHeight = 25.0;
final racketBottomOffset = 100.0;
double ballX = 0;
double ballY = 0;
double racketX = 20;
double racketY = 0;
moveRacket(double x) {
setState(() {
racketX = x - racketWidth / 2;
});
}
@override
Widget build(BuildContext context) {
return const Placeholder();
return Scaffold(
body: GestureDetector(
onHorizontalDragUpdate: (details) {
moveRacket(details.globalPosition.dx);
},
child: CustomPaint(
key: const Key("customPaint"),
painter: PongGamePainter(
racketHeight: 30,
racketWidth: 100,
racketX: racketX,
racketBottomOffset: racketBottomOffset,
ballSize: 20,
ballX: 10,
ballY: 10),
size: Size.infinite,
),
),
);
}
}
class PongGamePainter extends CustomPainter {
final double ballSize;
final double ballX;
final double ballY;
final double racketX;
final double racketWidth;
final double racketHeight;
final double racketBottomOffset;
PongGamePainter({
required this.ballSize,
required this.ballX,
required this.ballY,
required this.racketX,
required this.racketWidth,
required this.racketHeight,
required this.racketBottomOffset,
});
@override
void paint(Canvas canvas, Size size) {
final racketPaint = Paint()..color = Colors.white;
final ballPaint = Paint()..color = Colors.white;
canvas.drawOval(
Rect.fromLTWH(ballX, ballY, ballSize, ballSize),
ballPaint,
);
canvas.drawRect(
Rect.fromLTWH(
racketX,
size.height - racketHeight - racketBottomOffset,
racketWidth,
racketHeight,
),
racketPaint,
);
}
@override
bool shouldRepaint(covariant PongGamePainter oldDelegate) {
return ballX != oldDelegate.ballX ||
ballY != oldDelegate.ballY ||
racketX != oldDelegate.racketX;
}
}

View File

@ -2,7 +2,7 @@ name: pong
description: Pong Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
publish_to: "none" # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: '>=3.1.3 <4.0.0'
sdk: ">=3.1.3 <4.0.0"
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
@ -31,7 +31,6 @@ dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
@ -52,7 +51,6 @@ dev_dependencies:
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.

View File

@ -0,0 +1,7 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:pong/main.dart';
void main() {
test('moveRacket', () {});
}

View File

@ -1,30 +1,16 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pong/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const PongGame());
testWidgets('Tests "Berühren um zu beginnen!"', (WidgetTester tester) async {
final tapToStart = find.byKey(const ValueKey("tapToStart"));
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pumpWidget(const MaterialApp(home: StartScreen()));
await tester.tap(tapToStart);
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
expect(find.text("Berühren um zu beginnen!"), findsOneWidget);
});
}