<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
放假期間,小T打算回顧一下經典,想用Flutter做一下小遊戲,做什麼好呢,從打飛機到坦克大戰,最後還是想做一款貪吃蛇,依稀還記得,小時候第一次玩遊戲是在父母的小靈通上玩貪吃蛇哈哈,但是光光一個貪吃蛇太單調了,我們就加一個陀螺儀吧~
話不多說,先上效果圖,有圖有真相!!(陀螺儀好難操控)!
非常簡單,就是玩起來有點費手~
github倉庫還沒有搭建,大家可以先看一下文末通知!
1.定義蛇和豆子
2.讓蛇動起來
3.使用陀螺儀來控制蛇
4.讓蛇吃掉豆子
5.吃掉豆子隨機生成一個豆子
///蛇的每一塊的大小 const double size = 10; Offset ball = Offset.zero;//豆子 List<Offset> snakeList = [Offset(50, 0), Offset(60, 0)];//蛇的長度
顯示豆子和蛇:
使用Stack是因為豆子在被蛇吃的時候會重疊
使用Positioned來進行定位
body: Stack( children: snakeList .map((snake) => Positioned.fromRect( rect: Rect.fromCenter( center: adjust(snake), width: size, height: size), child: Container(margin:const EdgeInsets.all(1),color: Colors.black)))//加個外邊距使每一塊更清晰 .toList() ..add(Positioned.fromRect( rect: Rect.fromCenter( center: adjust(ball), width: size, height: size), child: Container(color: Colors.orange))), )
Offset adjust(Offset offset) { return Offset(offset.dx + size / 2, offset.dy + size / 2); //使每一塊更好的展示出來 }
在這裡我們要先給蛇來一個狀態定義:
///控制蛇的狀態 enum Direction { Up, Down, Left, Right }
因為蛇要一直動,所以給一個周期函數:
1.定義200毫秒動一次
2.處理更新蛇的長度
3.求餘的好處在於優化吃豆子,因為隨機生成豆子時,可能是個不會被整除的。
Direction direction = Direction.Left; //給蛇設定一個狀態,預設向左移動 ///周期函數 void didChangeDependencies() { ///兩百毫秒的周期函數 var period = Duration(milliseconds: 200); ///對蛇的長度進行優化 double maxWidth = MediaQuery.of(context).size.width; double widthPad = maxWidth % size; maxWidth -= widthPad; double maxHeight = MediaQuery.of(context).size.height; double heigthPad = maxHeight % size; //這裡除於是為了更好的遊戲體驗 maxHeight -= heigthPad; ///週期呼叫 ///用於貪吃蛇的自己移動,以及碰撞檢測 Timer.periodic(period, (timer) { final snakeHead = snakeList[0]; List<Offset> newSnakeList = List.generate(snakeList.length, (index) { if (index > 0) { return snakeList[index - 1]; } else { ///移動處理 switch (direction) { case Direction.Up: return Offset(snakeHead.dx, (snakeHead.dy - size + maxHeight) % maxHeight); //求餘是保證不會超標 case Direction.Down: return Offset( snakeHead.dx, (snakeHead.dy + size + maxHeight) % maxHeight); case Direction.Left: return Offset( (snakeHead.dx - size + maxWidth) % maxWidth, snakeHead.dy); case Direction.Right: return Offset( (snakeHead.dx + size + maxWidth) % maxWidth, snakeHead.dy); } } }); setState(() { snakeList = newSnakeList; //更新蛇的狀態 }); }); super.didChangeDependencies(); }
Flutter使用陀螺儀需要藉助一個庫:sensors 或者sensors_plus,兩者沒有太大的區別
這個demo使用:
sensors: any
官方給的例子:
import 'package:sensors/sensors.dart'; accelerometerEvents.listen((AccelerometerEvent event) { print(event); }); // [AccelerometerEvent (x: 0.0, y: 9.8, z: 0.0)] 加速度 userAccelerometerEvents.listen((UserAccelerometerEvent event) { print(event); }); // [UserAccelerometerEvent (x: 0.0, y: 0.0, z: 0.0)] gyroscopeEvents.listen((GyroscopeEvent event) { print(event); }); // [GyroscopeEvent (x: 0.0, y: 0.0, z: 0.0)] 陀螺儀
我們在initState對陀螺儀進行監聽:
這裡有x,y,z的三個引數,也可以自己優化偵錯,5.0是當手機傾斜>=45°
@override void initState() { super.initState(); accelerometerEvents.listen((AccelerometerEvent event) { setState(() { _accelerometerValues = <double>[event.x, event.y, event.z]; if(_accelerometerValues[0] >= 5.0){ direction = Direction.Left; }else if(_accelerometerValues[1] >= 5.0){ direction = Direction.Down; }else if(_accelerometerValues[0] <= -5.0){ direction = Direction.Right; }else if(_accelerometerValues[1] <= -5.0){ direction = Direction.Up; } }); }); }
還是在剛剛的周期函數裡新增:
當蛇頭碰到豆子時,給蛇加一格
if(newSnakeList[0] == ball){ newSnakeList..add(snakeList[snakeList.length - 1]); setState(() { ball = randoowPositon(maxWidth, maxHeight); //隨機生成一個豆子,randoowPositon方法在後面 }); }
對豆子的生成也需要優化一下 (之前生成有點問題,現在優化一下)
Offset randoowPositon(double widthRange, double heightRange) { ///隨機生成豆子 var rng = Random(); int intWidthRange = widthRange.toInt(); int intHeightRange = heightRange.toInt(); int finalWdith = rng.nextInt(intWidthRange); int finalHeight = rng.nextInt(intHeightRange); double widthPad = finalWdith % size; double heightPad = finalHeight % size; double actualWidth = finalWdith - widthPad; double actualHeight = finalHeight - heightPad; return Offset(rng.nextInt(widthRange.toInt()).toDouble(), rng.nextInt(heightRange.toInt()).toDouble()); }
到此這篇關於基於Android Flutter編寫貪吃蛇遊戲的文章就介紹到這了,更多相關Flutter貪吃蛇內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45