diff --git a/.gitignore b/.gitignore index ac4a906..0366100 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ .pub-cache/ .pub/ /build/ +.flutter-plugins-dependencies # Android related **/android/**/gradle-wrapper.jar diff --git a/android/gradle.properties b/android/gradle.properties index 2bd6f4f..1441b1d 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,3 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/assets/galaxy.png b/assets/galaxy.png index 0ee14ad..f32cc92 100644 Binary files a/assets/galaxy.png and b/assets/galaxy.png differ diff --git a/assets/rainbow1.png b/assets/rainbow1.png new file mode 100644 index 0000000..ec25fbe Binary files /dev/null and b/assets/rainbow1.png differ diff --git a/assets/white.png b/assets/white.png new file mode 100644 index 0000000..e49ed3c Binary files /dev/null and b/assets/white.png differ diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh new file mode 100644 index 0000000..77a0220 --- /dev/null +++ b/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=C:\Users\User\Documents\flutter\flutter" +export "FLUTTER_APPLICATION_PATH=C:\Users\User\Documents\FlutterApps\studypoints\studypoints" +export "FLUTTER_TARGET=lib\main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build\ios" +export "FLUTTER_FRAMEWORK_DIR=C:\Users\User\Documents\flutter\flutter\bin\cache\artifacts\engine\ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" diff --git a/lib/avatar/data/avatar.dart b/lib/avatar/data/avatar.dart index 52c8ceb..f168542 100644 --- a/lib/avatar/data/avatar.dart +++ b/lib/avatar/data/avatar.dart @@ -7,6 +7,7 @@ class Avatar { String hair; String skin; String feet = 'assets/feet1.png'; + String hairEffect; Color hairColor = Colors.red; List accessoires = []; @@ -16,6 +17,7 @@ class Avatar { this.face, this.hair, this.skin, + this.hairEffect, }); operator [](String type) { @@ -32,6 +34,8 @@ class Avatar { return skin; case 'extra': return accessoires; + case 'hairEffect': + return hairEffect; } } @@ -52,6 +56,9 @@ class Avatar { case 'skin': skin = value; break; + case 'hairEffect': + hairEffect = value; + break; } } } diff --git a/lib/avatar/data/image_merger.dart b/lib/avatar/data/image_merger.dart new file mode 100644 index 0000000..e1c2676 --- /dev/null +++ b/lib/avatar/data/image_merger.dart @@ -0,0 +1,45 @@ +import 'package:flutter/painting.dart'; +import 'package:flutter/material.dart'; +import 'dart:ui' as ui; +import 'dart:async'; + +class ImageMerger extends StatelessWidget { + final BlendMode blendMode; + final String image; + final Widget blendedWidget; + + ImageMerger({ + this.image, + this.blendedWidget, + this.blendMode = BlendMode.modulate, + }); + + Future _getImage() { + Completer completer = Completer(); + AssetImage(image).resolve(ImageConfiguration()).addListener( + ImageStreamListener( + (ImageInfo info, bool _) => completer.complete(info.image))); + return completer.future; + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _getImage(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return ShaderMask( + blendMode: blendMode, + child: Container(child: blendedWidget), + shaderCallback: (Rect bounds) { + return ImageShader(snapshot.data, TileMode.clamp, TileMode.clamp, + Matrix4.identity().storage); + }, + ); + } else { + return blendedWidget; + } + }, + ); + } +} diff --git a/lib/avatar/data/repository.dart b/lib/avatar/data/repository.dart index 8e91ca7..67859c4 100644 --- a/lib/avatar/data/repository.dart +++ b/lib/avatar/data/repository.dart @@ -176,6 +176,30 @@ class ShopItemRepository extends Repository { thumbnail: 'assets/extra2.png', cost: 100, ), + ShopItem( + id: 'hairEffect1', + type: 'hairEffect', + name: 'Normal', + resource: 'assets/white.png', + thumbnail: 'assets/white.png', + cost: 50, + ), + ShopItem( + id: 'hairEffect2', + type: 'hairEffect', + name: 'Galaxy', + resource: 'assets/galaxy.png', + thumbnail: 'assets/galaxy.png', + cost: 50, + ), + ShopItem( + id: 'hairEffect3', + type: 'hairEffect', + name: 'Rainbow', + resource: 'assets/rainbow1.png', + thumbnail: 'assets/rainbow1.png', + cost: 50, + ), ]; ShopItem fetch(String id) => diff --git a/lib/avatar/widgets/avatar_screen.dart b/lib/avatar/widgets/avatar_screen.dart index b228663..a1aecd1 100644 --- a/lib/avatar/widgets/avatar_screen.dart +++ b/lib/avatar/widgets/avatar_screen.dart @@ -200,6 +200,10 @@ class _AvatarScreenState extends State { return 'Skin'; case 'extra': return 'Accessoires'; + case 'hairEffect': + return 'Hair Effects'; + default: + return 'Other'; } } } diff --git a/lib/avatar/widgets/avatar_view.dart b/lib/avatar/widgets/avatar_view.dart index bc56172..9ba5b8e 100644 --- a/lib/avatar/widgets/avatar_view.dart +++ b/lib/avatar/widgets/avatar_view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:studypoints/avatar/data/image_merger.dart'; import 'package:studypoints/services/user.dart'; import 'package:studypoints/avatar/data/avatar.dart'; import 'package:flutter/painting.dart'; @@ -42,10 +43,19 @@ class AvatarViewState extends State { Image.asset(getRessource(avatar.skin)), Image.asset(getRessource(avatar.face)), Image.asset("assets/head1.png"), - Image.asset( - getRessource(avatar.hair), - color: Provider.of(context).avatar.hairColor, - colorBlendMode: BlendMode.modulate, + ImageMerger( + image: getRessource(avatar.hairEffect), + blendMode: BlendMode.modulate, + blendedWidget: Container( + width: widget.width, + height: widget.height, + child: Image.asset( + getRessource(avatar.hair), + color: avatar.hairEffect != 'hairEffect3' + ? Provider.of(context).avatar.hairColor + : Colors.white, + colorBlendMode: BlendMode.modulate, + )), ), Image.asset("assets/ears1.png"), Image.asset(getRessource(avatar.body)), diff --git a/lib/main.dart b/lib/main.dart index 14613ad..6d3ac98 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,6 +36,7 @@ class StudyPointsApp extends StatelessWidget { face: items.firstOfType('face').id, hair: items.firstOfType('hair').id, skin: items.firstOfType('skin').id, + hairEffect: items.firstOfType('hairEffect').id, )), ), ], diff --git a/lib/services/user.dart b/lib/services/user.dart index 73844df..b125e66 100644 --- a/lib/services/user.dart +++ b/lib/services/user.dart @@ -12,6 +12,7 @@ class UserService { ShopItemRepository().firstOfType('face').id, ShopItemRepository().firstOfType('hair').id, ShopItemRepository().firstOfType('body').id, + ShopItemRepository().firstOfType('hairEffect').id, ...ShopItemRepository().fetchType('skin').map((item) => item.id), ]; diff --git a/pubspec.lock b/pubspec.lock index 343c95b..107abe8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.3.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" charcode: dependency: transitive description: @@ -73,14 +73,14 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.7" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.2" + version: "1.6.4" path_provider: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0+1" provider: dependency: "direct main" description: @@ -108,7 +108,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.5" screenshot: dependency: "direct main" description: @@ -155,7 +155,7 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" term_glyph: dependency: transitive description: