【文章翻譯】Quick assists for editing
【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
原文:https://medium.com/dartlang/quick-assists-for-editing-453f051fb28c
編輯的快速輔助
您是否在編碼時花費太多時間執行重複性的任務?如果是這樣,那麼我有一些好消息要告訴您。許多重複性的任務可以使用我們稱為「快速輔助」的功能自動執行。
【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
原文:https://medium.com/dartlang/quick-assists-for-editing-453f051fb28c
您是否在編碼時花費太多時間執行重複性的任務?如果是這樣,那麼我有一些好消息要告訴您。許多重複性的任務可以使用我們稱為「快速輔助」的功能自動執行。
【文章內容使用 Gemini 1.5 Pro 自動產生】
原文:https://medium.com/flutter/put-flutter-to-work-95f5fdcc592e
如果您一直想要嘗試使用 Flutter,但又不想從頭開始構建,那麼 Flutter 的 新增至應用程式功能 就是一個很棒的起點。為了讓您更輕鬆地將 Flutter 投入使用,我們與 Flutter 團隊合作,創建了一個新增至應用程式的示例原型,以展示如何在付出最少努力的情況下,將 Flutter 整合到原生程式碼庫中。無論您是想試用 Flutter,還是想以實際的方式向您的團隊展示 Flutter 的運作方式,這篇文章都適合您!
【文章內容使用 Gemini 1.5 Pro 自動產生】
原文:https://medium.com/flutter/announcing-the-flutter-casual-games-toolkit-c22e401d8fee
對大多數開發人員來說,Flutter 是一個應用程式框架。但圍繞著休閒遊戲開發也有一個不斷發展的社群,他們利用 Flutter 提供的硬體加速圖形支援。
在過去的一年中,成千上萬的 Flutter 遊戲已發佈。例如,Lotum,開發史上最受歡迎的文字拼圖遊戲 [4 Pics 1 Word](https://flutter.dev/showcase/lotum) 的遊戲公司,用 Flutter 重寫了整個遊戲。[Flame](https://flame-engine.org/),一個建立在 Flutter 之上的社群驅動的開源遊戲引擎,其貢獻者和使用者一直在穩定地增長。
為了了解我們如何提供更好的支援,我們 [採訪了幾位開發人員](https://medium.com/flutter/perspectives-from-early-adopters-of-flutter-as-a-game-development-tool-f95fb3406d51),他們已成功構建並發佈了 Flutter 手機遊戲。我們詢問他們使用 Flutter 建立遊戲的感受,他們的回答揭示了幾個主題:
同時,研究參與者提到,建立 Flutter 遊戲的最大挑戰是找到資源和學習材料,以便開始使用並整合到平台遊戲服務中。為了滿足這些需求,我們正在發佈一個新的入門工具包,以加速您的遊戲開發。
全新的 [Flutter 休閒遊戲工具包](http://flutter.dev/games) 提供了一個專用的範本(由 [Filip Hracek](https://github.com/filiph) 開發),您可以使用它來構建自己的遊戲。這個入門專案提供了預先構建的「鈴鐺和哨子」,例如主選單、設定頁面、聲音支援等等,但有趣的部份留給您:構建遊戲!
若要開始使用,請查看有關如何使用遊戲範本的 [影片教學](https://youtu.be/zGgeBNiRy-8)。它提供了有關構建 [井字遊戲](https://github.com/filiph/tictactoe) 的逐步指南(也可以從 [iOS](https://apps.apple.com/us/app/tic-tac-toe-puzzle-game/id1611729977) / [Android](https://play.google.com/store/apps/details?id=dev.flutter.tictactoe) 商店下載)。若要查看 Filip 在開發遊戲時遇到的所有細節,請查看他的 [原始開發日誌](https://docs.google.com/document/d/e/2PACX-1vRM-pZYVNOcJhCh5-ZHt8jGwWpNvx4KtpJZECHmaUPn9PIOgdTThK5OBRblCM6PQC4skqDRdW0lJnyM/pub)。
除了遊戲可能需要的常見 UI 和功能元素外,您還獲得了遊戲開發所需的關鍵服務的預先整合模組和範例程式碼。例如,遊戲範本整合了 Apple Game Center 和 Google Play Games Services,以便您可以輕鬆地顯示排行榜和成就等功能。
如果您打算讓您的遊戲盈利,範本使用 [Google 行動廣告 SDK](https://pub.dev/packages/google_mobile_ads),並向您展示如何實作範例廣告。範本還使用 [應用程式內購買](https://pub.dev/packages/in_app_purchase) 套件,讓您可以在遊戲中為玩家提供額外的內容,例如高級體驗、數位商品和訂閱。
最後,遊戲範本包含 [Firebase Crashlytics](https://pub.dev/packages/firebase_crashlytics),因此您可以深入了解遊戲中可能發生的任何崩潰或錯誤。所有遊戲範本的原始碼都可以在 GitHub 上的這個 [Flutter 範例儲存庫](https://github.com/flutter/samples/tree/master/game_template#readme) 中找到。
Flutter 的優勢之一是其樂於助人且熱情的社群。若要與其他 Flutter 遊戲開發人員聊天、提出問題和分享最佳實務,請考慮加入 r/FlutterDev Discord 伺服器上的 [專用遊戲頻道](https://discord.gg/WY5NwwjBQz)!非常感謝 Flutter 社群成員 @Miyoyo 幫助建立這個社群空間來支援 Flutter 遊戲開發人員!(順便說一下,如果您已經是 r/FlutterDev 社群的成員,以下是一個 [直接連結](https://discord.com/channels/420324994703163402/964110538986651658)。)
如果您的遊戲需要 Cloud 或 Firebase 服務,或者您想透過廣告將您的遊戲推廣給更多使用者,您可以獲得 [Google Ads](https://ads.google.com/intl/en_us/home/flutter/#!/) 和 [Cloud](https://cloud.google.com/free?utm_source=flutter&utm_medium=display&utm_campaign=FY22-Q2-flutter-games_get-started&utm_content=-&utm_term=-) 團隊提供的最高 900 美元的信用額度(適用條款和限制)!
我們從過去的研究中了解到,如今大多數 Flutter 遊戲都是休閒手機遊戲,因此我们在設計 Flutter 休閒遊戲工具包時優先考慮了手機場景。
這並不意味著您的創造力應該局限於手機平台。事實上,範例 [井字遊戲](https://github.com/filiph/tictactoe) 可以在 [網頁](https://filiph.github.io/tictactoe/) 和桌面上運行!
同時,我們最近在 DartPad 上加入了對社群驅動的遊戲引擎 Flame 的支援,因此您可以在 DartPad 上探索 [使用 Flame 構建遊戲](https://dartpad.dev/?id=3e52ca7b51ba15f989ad880b8b3314a2),而無需下載 SDK。更重要的是,由 Very Good Ventures (VGV) 撰寫並在 Google I/O 上推出的基於網頁的 [彈珠遊戲](https://pinball.flutter.dev/),是用 Flutter 使用 Flame 引擎構建的!若要了解彈珠遊戲是如何建立的,請查看 VGV 團隊的 [彈珠文章](https://medium.com/flutter/i-o-pinball-powered-by-flutter-and-firebase-d22423f3f5d) 或 [查看程式碼](https://github.com/flutter/pinball)。
遊戲開發是 Flutter 正在發展的一個令人興奮的新場景!展望未來,我們希望加入更多 codelab 和其他資源,幫助您開發遊戲。這是我們第一次嘗試讓您更容易使用,我們充分意識到可能存在許多改進的空間。我們最近開始與社群成員 [wolfenrain](https://github.com/wolfenrain) 合作,對遊戲相關的議題進行分類。如果您需要希望 Flutter SDK 能更好地支援的產品功能,請在 GitHub 上提交議題(或為現有的議題投票)。
請查看專用的 [遊戲開發](http://flutter.dev/games) 頁面,您可以在此了解上面提到的資源,還可以找到指向 [文件](http://docs.flutter.dev/resources/games-toolkit) 的連結,以及 Flutter 社群遊戲開發專家推薦的函式庫、套件和工具的參考。
自 Flutter 1.0 發佈以來,您不斷以出色的應用程式讓我們驚嘆不已,現在我們迫不及待地想看看您將使用 Flutter 推出什麼令人興奮的遊戲!
【文章內容使用 Gemini 1.5 Pro 自動產生】
在今年的 Google I/O 上,我們推出了 Flutter 休閒遊戲工具包,這個工具包是一套資源,用於支援 Flutter 社群中的遊戲開發者。在此之前,Flutter 並未將遊戲開發作為官方支援的用例,儘管我們對一些成功案例印象深刻,例如流行的文字解謎遊戲 4 圖 1 字 以及 Flame 引擎等社群努力。那麼,為什麼我們決定正式支持遊戲開發,以及我們如何決定工具包的初始版本應該包含哪些內容呢? 在這篇文章中,我們將分享與 Flutter 遊戲開發工具的早期採用者進行的兩項使用者研究,並解釋他們的觀點如何塑造我們的策略和工具包的設計。
【文章內容使用 Gemini 1.5 Pro 自動產生】
原文:https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0
是時候再次發佈 Flutter 穩定版本了——我們非常自豪地宣布 Flutter 3!僅僅三個月前,我們宣布了 Flutter 對 Windows 的支援。今天,我們很高興地宣布,除了 Windows 之外,Flutter 現在也穩定支援 macOS 和 Linux!
【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
原文:https://medium.com/dartlang/dart-2-17-b216bfc80c5d
今天在 Google I/O 上,我們宣布推出新的 Dart SDK,版本 2.17。此版本基於我們提升生產力和平台可攜性的核心主題而構建。它提供了新的語言特性:支援成員的列舉、改進了向父類別轉發參數的功能,以及更靈活的命名參數。我們改進了工具,推出了 package:lints 的一個新的主要版本——我們的工具支援根據我們的最佳實務檢查 Dart 程式碼——並廣泛更新了核心函式庫 API 文件,其中包含豐富的程式碼範例。為了改進平台整合,我們提供了在 Flutter 外掛中使用 dart:ffi(原生 C 互通性)的新範本、對 RISC-V 處理器的實驗性支援,以及對簽署 macOS 和 Windows 可執行檔的支援。
【文章內容使用 Gemini 1.5 Pro 自動產生】
原文:https://medium.com/flutter/i-o-pinball-powered-by-flutter-and-firebase-d22423f3f5d
為了 Google I/O,我們與 Flutter 團隊合作,重新構想了一款經典彈珠台遊戲,該遊戲使用 Flutter 和 Firebase 構建。以下是如何在 Flame 遊戲引擎的幫助下將 [I/O 彈珠台](https://pinball.flutter.dev/) 在網頁上呈現。
對於構建由使用者互動驅動的遊戲(例如益智遊戲和文字遊戲)來說,Flutter 架構是一個很好的選擇。當談到使用遊戲迴圈的遊戲時,[Flame](https://docs.flame-engine.org/)(一個建立在 Flutter 之上的二維遊戲引擎)可以成為一個有用的工具。I/O 彈珠台使用 Flame 的開箱即用功能,例如動畫、物理、碰撞偵測等等,同時也利用 Flutter 架構的基礎設施。如果您可以使用 Flutter 構建應用程式,那麼您已經擁有了使用 Flame 構建遊戲所需的基礎。
在傳統應用程式中,螢幕通常在使用者發生事件或互動之前都是視覺上的靜態。對於遊戲來說,則相反 - UI 是持續渲染的,遊戲的狀態也在不斷變化。Flame 提供了一個遊戲 Widget,它在內部管理遊戲迴圈,以便 UI 能夠以高效能的方式持續渲染。`Game` 類別包含遊戲元件和邏輯的實作,這些實作傳遞給 Widget 樹中的 `GameWidget`。在 I/O 彈珠台中,遊戲迴圈會對彈珠在遊戲場上的位置和狀態做出反應,如果彈珠與物體發生碰撞或掉出了遊戲,則會應用必要的特效。
@override
void update(double dt) {
super.update(dt);
final direction = -parent.body.linearVelocity.normalized();
angle = math.atan2(direction.x, -direction.y);
size = (_textureSize / 45) *
parent.body.fixtures.first.shape.radius;
}
構建 I/O 彈珠台的挑戰之一是弄清楚如何僅使用二維元素來建立三維效果。元件的順序決定了它們在螢幕上的渲染方式。例如,當彈珠向上發射到斜坡時,彈珠的順序會上升,因此它看起來像是位於斜坡的頂部。
彈珠、彈射器、兩個彈射器和 Chrome 恐龍都是具有動態主體的元素,這些元素會受到世界物理的影響。彈珠的大小也會根據它在遊戲場上的位置而變化。當彈珠移動到遊戲場的頂部時,它的尺寸會縮小,從使用者的角度來看,它看起來離使用者更遠。此外,彈珠上的重力會根據彈珠台的角度進行調整,因此彈珠在斜坡上會下降得更快。
/// 根據彈珠在遊戲場上的位置縮放彈珠的主體和 Sprite。
class BallScalingBehavior extends Component with ParentIsA<Ball> {
@override
void update(double dt) {
super.update(dt);
final boardHeight = BoardDimensions.bounds.height;
const maxShrinkValue = BoardDimensions.perspectiveShrinkFactor;
final standardizedYPosition = parent.body.position.y + (boardHeight / 2);
final scaleFactor = maxShrinkValue +
((standardizedYPosition / boardHeight) * (1 - maxShrinkValue));
parent.body.fixtures.first.shape.radius = (Ball.size.x / 2) * scaleFactor;
final ballSprite = parent.descendants().whereType<SpriteComponent>();
if (ballSprite.isNotEmpty) {
ballSprite.single.scale.setValues(
scaleFactor,
scaleFactor,
);
}
}
}
I/O 彈珠台很大程度上依賴於由 Flame 團隊維護的 [forge2d](https://pub.dev/packages/forge2d) 套件。此套件將開源 [Box2D 物理引擎](https://box2d.org/) 移植到 Dart 中,以便可以輕鬆地與 Flutter 整合。我們使用 forge2d 來為遊戲的物理提供動力,例如遊戲場上物體(Fixture)之間的碰撞偵測。
forge2D 允許我們監聽 Fixture 之間的碰撞事件。然後,我們為 Fixture 添加 `ContactCallbacks`,以便在兩個元素之間發生接觸時收到通知。例如,當彈珠(具有具有 `CircleShape` 的 Fixture)與彈珠台(具有具有 `EllipseShape` 的 Fixture)發生接觸時,得分會增加。在這些回呼函式中,我們可以精確設定接觸的開始和結束位置,因此當兩個元素與另一個元素發生接觸時,就會發生碰撞。
@override
Body createBody() {
final shape = CircleShape()..radius = size.x / 2;
final bodyDef = BodyDef(
position: initialPosition,
type: BodyType.dynamic,
userData: this,
);
return world.createBody(bodyDef)
..createFixtureFromShape(shape, 1);
}
彈珠台遊戲場上有一些元素,例如 Android、Dash、Sparky 和 Chrome 恐龍,它們是動畫的。對於這些元素,我們使用了 Sprite 表格,這些表格包含在 Flame 引擎中,並帶有 `SpriteAnimationComponent`。對於每個元素,我們都有一個檔案,其中包含圖像的不同方向、檔案中的幀數以及幀之間的時間。使用這些資料,Flame 中的 `SpriteAnimationComponent` 會將所有圖像在迴圈中編譯在一起,使元素看起來像動畫。
final spriteSheet = gameRef.images.fromCache(
Assets.images.android.spaceship.animatronic.keyName,
);
const amountPerRow = 18;
const amountPerColumn = 4;
final textureSize = Vector2(
spriteSheet.width / amountPerRow,
spriteSheet.height / amountPerColumn,
);
size = textureSize / 10;
animation = SpriteAnimation.fromFrameData(
spriteSheet,
SpriteAnimationData.sequenced(
amount: amountPerRow * amountPerColumn,
amountPerRow: amountPerRow,
stepTime: 1 / 24,
textureSize: textureSize,
),
);
I/O 彈珠台排行榜實時顯示世界各地玩家的最高分。使用者還可以將他們的得分分享到 Twitter 和 Facebook。我們使用 Firebase [Cloud Firestore](https://firebase.google.com/docs/firestore) 來追蹤前十名得分,並將其擷取以顯示在排行榜上。當新的得分寫入排行榜時,[Cloud Function](https://firebase.google.com/docs/functions) 會將得分按降序排序,並移除任何不在前十名的得分。
/// 擷取前 10 個 [LeaderboardEntryData]。
Future<List<LeaderboardEntryData>> fetchTop10Leaderboard() async {
try {
final querySnapshot = await _firebaseFirestore
.collection(_leaderboardCollectionName)
.orderBy(_scoreFieldName, descending: true)
.limit(_leaderboardLimit)
.get();
final documents = querySnapshot.docs;
return documents.toLeaderboard();
} on LeaderboardDeserializationException {
rethrow;
} on Exception catch (error, stackTrace) {
throw FetchTop10LeaderboardException(error, stackTrace);
}
}
與傳統應用程式相比,構建響應式的遊戲可能會更容易。彈珠台遊戲場只需要縮放到設備的大小即可。對於 I/O 彈珠台,我們根據設備的大小以固定比例進行縮放。這確保了無論顯示大小如何,座標系始終保持一致,這對於確保元件在設備之間一致地顯示和互動非常重要。
I/O 彈珠台還可以適應行動或桌面瀏覽器。在行動瀏覽器中,使用者可以點擊發射按鈕開始遊戲,也可以點擊螢幕的左右兩側來控制對應的彈射器。在桌面瀏覽器中,使用者可以使用鍵盤來發射彈珠和控制彈射器。
彈珠台程式碼庫遵循分層架構,每個功能都在其自己的資料夾中。此專案中,遊戲邏輯也與視覺元件分開。這可以確保我們能夠輕鬆地獨立更新視覺元素,而與遊戲邏輯無關,反之亦然。
彈珠台的主題會根據使用者在開始遊戲之前選擇的角色而有所不同。主題由 `CharacterThemeCubit` 類別控制。根據角色選擇,彈珠顏色、背景和其他元素會更新。
/// {@template character_theme}
/// 用於建立角色主題的基類。
///
/// 角色特定的遊戲元件應在此處指定一個 getter,以
/// 載入其對應的遊戲資產。
/// {@endtemplate}
abstract class CharacterTheme extends Equatable {
/// {@macro character_theme}
const CharacterTheme();/// 角色名稱。
String get name;
/// 彈珠的資產。
AssetGenImage get ball;
/// 背景的資產。
AssetGenImage get background;
/// 圖示資產。
AssetGenImage get icon;
/// 排行榜的圖示資產。
AssetGenImage get leaderboardIcon;
/// 閒置角色動畫的資產。
AssetGenImage get animation;
@override
List<Object> get props => [
name,
ball,
background,
icon,
leaderboardIcon,
animation,
];
}
I/O 彈珠台的遊戲狀態由 [flame_bloc](https://pub.dev/packages/flame_bloc) 處理,flame_bloc 是一個將 bloc 與 Flame 元件連接起來的套件。例如,我們使用 flame_bloc 來追蹤剩餘的遊戲回合數、透過遊戲獲得的任何獎金以及目前的遊戲得分。此外,Widget 樹的頂部還有一個 Widget,其中包含載入頁面的邏輯,包括如何玩遊戲的說明。我們還遵循 [行為模式](https://en.wikipedia.org/wiki/Behavioral_pattern) 來封裝和隔離遊戲功能的某些元素,這些元素基於其元件。例如,彈珠台在被彈珠擊中時會發出聲音,因此我們實作了 `BumperNoiseBehavior` 類別來處理此問題。
class BumperNoiseBehavior extends ContactBehavior {
@override
void beginContact(Object other, Contact contact) {
super.beginContact(other, contact);
readProvider<PinballPlayer>().play(PinballAudio.bumper);
}
}
程式碼庫還包含全面的單元、Widget 和黃金測試。有時,由於單個元件可能具有多個責任,這使得它們難以隔離測試,因此測試遊戲會帶來一些挑戰。結果,我們最終定義了一些模式來更好地隔離和測試元件。我們還將改進整合到 [flame_test](https://pub.dev/packages/flame_test) 套件中。
此專案很大程度上依賴於 Flame 元件,以將彈珠台體驗呈現出來。程式碼庫附帶了一個元件沙箱,它類似於 [UI 元件庫](https://gallery.flutter.dev/#/)。這是在開發遊戲時的一個有用的工具,因為它允許您隔離開發遊戲元件,並確保它們在整合到遊戲中之前,看起來和行為符合預期。
看看您是否可以在 [I/O 彈珠台](https://pinball.flutter.dev/) 中獲得高分!程式碼在 [這個 GitHub 儲存庫](https://github.com/flutter/pinball) 中是開源的。請關注排行榜,並在社交媒體上分享您的得分!
【文章內容使用 Gemini 1.5 Pro 自動產生】
原文:https://medium.com/flutter/does-flutter-boost-developer-productivity-475f713724b3
Flutter 團隊持續進行每季一次的使用者調查,以收集您,也就是 Flutter 開發人員的意見。2022 年的第一份調查於 2 月 22 日至 3 月 3 日進行,並透過 Flutter IDE 外掛、docs.flutter.dev 網站和 Twitter 進行訪問,超過 8,000 人參與了調查。