Skip to content

Commit 3acb086

Browse files
committed
add controller
1 parent 0bd4a56 commit 3acb086

File tree

5 files changed

+228
-67
lines changed

5 files changed

+228
-67
lines changed

lib/gamer/gamer.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'package:flutter/material.dart';
2+
3+
///the height of game pad
4+
const GAME_PAD_MATRIX_H = 20;
5+
6+
///the width of game pad
7+
const GAME_PAD_MATRIX_W = 10;
8+
9+
///state of [Gamer]
10+
enum GamerState { none, paused, running }
11+
12+
Gamer gamer = Gamer._();
13+
14+
class Gamer {
15+
Gamer._() {
16+
//inflate game pad data
17+
for (int i = 0; i < GAME_PAD_MATRIX_H; i++) {
18+
_data.add(List.filled(GAME_PAD_MATRIX_W, false));
19+
}
20+
}
21+
22+
///the gamer data
23+
final List<List<bool>> _data = [];
24+
List<List<bool>> get data => _data;
25+
26+
void rotate() {
27+
debugPrint("rotate");
28+
}
29+
30+
void right() {
31+
debugPrint("right");
32+
}
33+
34+
void left() {
35+
debugPrint("left");
36+
}
37+
38+
void drop() {
39+
debugPrint("drop");
40+
}
41+
42+
void down() {
43+
debugPrint("down");
44+
}
45+
}

lib/main.dart

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import 'package:flutter/material.dart';
2-
import 'package:flutter/services.dart';
3-
import 'package:tetris/material/images.dart';
42
import 'package:tetris/panel/screen.dart';
5-
import 'dart:ui' as ui;
3+
import 'package:tetris/panel/controller.dart';
64

75
void main() => runApp(MyApp());
86

@@ -22,42 +20,26 @@ class MyApp extends StatelessWidget {
2220
}
2321
}
2422

25-
class _HomePage extends StatefulWidget {
26-
@override
27-
_HomePageState createState() {
28-
return new _HomePageState();
29-
}
30-
}
31-
32-
class _HomePageState extends State<_HomePage> {
33-
@override
34-
void initState() {
35-
super.initState();
36-
_doLoadMaterial();
37-
}
38-
39-
void _doLoadMaterial() async {
40-
final bytes = await rootBundle.load("assets/material.png");
41-
final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
42-
final frame = await codec.getNextFrame();
43-
setState(() {
44-
material = frame.image;
45-
});
46-
}
47-
23+
class _HomePage extends StatelessWidget {
4824
@override
4925
Widget build(BuildContext context) {
5026
final size = MediaQuery.of(context).size;
5127
final screenW = size.width * 0.8;
5228

53-
Widget screen;
54-
if (material != null) {
55-
screen = Screen(width: screenW);
56-
}
57-
return Container(
58-
color: Color(0xffefcc19),
59-
child: Center(
60-
child: screen,
29+
return SizedBox.expand(
30+
child: Container(
31+
color: Color(0xffefcc19),
32+
child: Padding(
33+
padding: MediaQuery.of(context).padding,
34+
child: Column(
35+
children: <Widget>[
36+
Spacer(),
37+
Screen(width: screenW),
38+
Spacer(),
39+
GameController(),
40+
],
41+
),
42+
),
6143
),
6244
);
6345
}

lib/panel/controller.dart

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import 'package:flutter/material.dart';
2+
import 'dart:math' as math;
3+
4+
import 'package:tetris/gamer/gamer.dart';
5+
6+
class GameController extends StatelessWidget {
7+
@override
8+
Widget build(BuildContext context) {
9+
return SizedBox(
10+
height: 200,
11+
child: Row(
12+
children: <Widget>[
13+
Expanded(
14+
child: Container(
15+
child: Center(
16+
child: _Button(
17+
size: Size(90, 90),
18+
onTap: () {
19+
gamer.drop();
20+
},
21+
),
22+
),
23+
)),
24+
Expanded(child: _DirectionController()),
25+
],
26+
),
27+
);
28+
}
29+
}
30+
31+
const Size _DIRECTION_BUTTON_SIZE = const Size(60, 60);
32+
33+
const double _DIRECTION_SPACE = 10;
34+
35+
class _DirectionController extends StatelessWidget {
36+
@override
37+
Widget build(BuildContext context) {
38+
return Center(
39+
child: Transform.rotate(
40+
angle: math.pi / 4,
41+
child: Column(
42+
mainAxisSize: MainAxisSize.min,
43+
children: <Widget>[
44+
SizedBox(height: _DIRECTION_SPACE),
45+
Row(
46+
mainAxisSize: MainAxisSize.min,
47+
children: <Widget>[
48+
_Button(
49+
size: _DIRECTION_BUTTON_SIZE,
50+
onTap: () {
51+
gamer.rotate();
52+
}),
53+
SizedBox(width: _DIRECTION_SPACE),
54+
_Button(
55+
size: _DIRECTION_BUTTON_SIZE,
56+
onTap: () {
57+
gamer.right();
58+
}),
59+
],
60+
),
61+
SizedBox(height: _DIRECTION_SPACE),
62+
Row(
63+
mainAxisSize: MainAxisSize.min,
64+
children: <Widget>[
65+
_Button(
66+
size: _DIRECTION_BUTTON_SIZE,
67+
onTap: () {
68+
gamer.left();
69+
}),
70+
SizedBox(width: _DIRECTION_SPACE),
71+
_Button(
72+
size: _DIRECTION_BUTTON_SIZE,
73+
onTap: () {
74+
gamer.down();
75+
},
76+
),
77+
],
78+
),
79+
SizedBox(height: _DIRECTION_SPACE),
80+
],
81+
),
82+
),
83+
);
84+
}
85+
}
86+
87+
enum Direction { up, down, left, right }
88+
89+
class _Button extends StatelessWidget {
90+
final Size size;
91+
92+
final VoidCallback onTap;
93+
94+
const _Button({Key key, @required this.size, @required this.onTap})
95+
: super(key: key);
96+
97+
@override
98+
Widget build(BuildContext context) {
99+
return Material(
100+
elevation: 4,
101+
shape: CircleBorder(),
102+
child: InkResponse(onTap: onTap, child: SizedBox.fromSize(size: size)),
103+
);
104+
}
105+
}

lib/panel/player_panel.dart

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'package:flutter/material.dart';
22
import 'package:tetris/material/briks.dart';
33
import 'package:tetris/material/images.dart';
4+
import 'package:tetris/gamer/gamer.dart';
45

5-
const MATRIX_H = 20;
6-
const MATRIX_W = 10;
6+
const MATRIX_H = GAME_PAD_MATRIX_H;
7+
const MATRIX_W = GAME_PAD_MATRIX_W;
78

89
///the matrix of player content
910
class PlayerPanel extends StatelessWidget {
@@ -27,7 +28,7 @@ class PlayerPanel extends StatelessWidget {
2728
),
2829
child: Stack(
2930
children: <Widget>[
30-
_PlayerBackground(),
31+
_PlayerPad(),
3132
_GameUninitialized(),
3233
],
3334
),
@@ -36,6 +37,21 @@ class PlayerPanel extends StatelessWidget {
3637
}
3738
}
3839

40+
class _PlayerPad extends StatelessWidget {
41+
@override
42+
Widget build(BuildContext context) {
43+
return Column(
44+
children: gamer.data.map((list) {
45+
return Row(
46+
children: list.map((b) {
47+
return Brik(enable: b);
48+
}).toList(),
49+
);
50+
}).toList(),
51+
);
52+
}
53+
}
54+
3955
class _GameUninitialized extends StatelessWidget {
4056
@override
4157
Widget build(BuildContext context) {
@@ -54,21 +70,3 @@ class _GameUninitialized extends StatelessWidget {
5470
);
5571
}
5672
}
57-
58-
class _PlayerBackground extends StatelessWidget {
59-
@override
60-
Widget build(BuildContext context) {
61-
List<Widget> rows = [];
62-
for (int i = 0; i < MATRIX_H; i++) {
63-
List<Widget> children = [];
64-
for (int j = 0; j < MATRIX_W; j++) {
65-
children.add(Brik(enable: false));
66-
}
67-
Row row = Row(children: children);
68-
rows.add(row);
69-
}
70-
return Column(
71-
children: rows,
72-
);
73-
}
74-
}

lib/panel/screen.dart

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,64 @@
1+
import 'dart:ui' as ui;
2+
13
import 'package:flutter/material.dart';
4+
import 'package:flutter/services.dart';
5+
import 'package:tetris/material/images.dart';
26
import 'player_panel.dart';
37
import 'status_panel.dart';
48

59
const Color _background = Color(0xff9ead86);
610

7-
class Screen extends StatelessWidget {
11+
class Screen extends StatefulWidget {
812
///the with of scrren
913
final double width;
1014

1115
const Screen({Key key, @required this.width}) : super(key: key);
1216

17+
@override
18+
ScreenState createState() {
19+
return new ScreenState();
20+
}
21+
}
22+
23+
class ScreenState extends State<Screen> {
24+
@override
25+
void initState() {
26+
super.initState();
27+
_doLoadMaterial();
28+
}
29+
30+
void _doLoadMaterial() async {
31+
if (material != null) {
32+
return;
33+
}
34+
final bytes = await rootBundle.load("assets/material.png");
35+
final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
36+
final frame = await codec.getNextFrame();
37+
setState(() {
38+
material = frame.image;
39+
});
40+
}
41+
1342
@override
1443
Widget build(BuildContext context) {
1544
//play panel need 70%
16-
final playerPanelWidth = width * 0.6;
45+
final playerPanelWidth = widget.width * 0.6;
1746
return SizedBox(
1847
height: playerPanelWidth * 2,
19-
width: width,
48+
width: widget.width,
2049
child: Container(
2150
color: _background,
22-
child: Row(
23-
children: <Widget>[
24-
PlayerPanel(width: playerPanelWidth),
25-
SizedBox(
26-
width: width - playerPanelWidth,
27-
child: StatusPanel(),
28-
)
29-
],
30-
),
51+
child: material == null
52+
? null
53+
: Row(
54+
children: <Widget>[
55+
PlayerPanel(width: playerPanelWidth),
56+
SizedBox(
57+
width: widget.width - playerPanelWidth,
58+
child: StatusPanel(),
59+
)
60+
],
61+
),
3162
),
3263
);
3364
}

0 commit comments

Comments
 (0)