Skip to content

Commit

Permalink
Merge branch 'dev' into app
Browse files Browse the repository at this point in the history
# Conflicts:
#	lib/race_controller.dart
  • Loading branch information
m-r-davari committed Feb 11, 2024
2 parents a98db10 + c7fd507 commit 9883dcc
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 77 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

A nostalgia racing game developed using Flutter.

## Play Online
Link : https://m-r-davari.github.io/nostalgia_nitro/

## Getting Started

This project is a starting point for a Flutter application.
Expand Down
2 changes: 0 additions & 2 deletions lib/asphalt_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import 'dart:math' as math;

class AsphaltWidget extends StatelessWidget {
final List<GlobalKey> npcCarKeys;

//final bool isEmpty;
final bool isLap;

const AsphaltWidget({Key? key, required this.npcCarKeys, this.isLap = false}) : super(key: key);
Expand Down
3 changes: 1 addition & 2 deletions lib/core/di/AppBindings.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

import 'package:get/get.dart';
import 'package:nostalgia_nitro/car_controller.dart';
import 'package:nostalgia_nitro/core/shared_pref.dart';
import 'package:nostalgia_nitro/utils/shared_pref.dart';
import 'package:nostalgia_nitro/race_controller.dart';
import 'package:shared_preferences/shared_preferences.dart';

Expand All @@ -12,7 +12,6 @@ class AppBindings extends Bindings {
Future<void> dependencies() async {
await Get.putAsync(() => SharedPreferences.getInstance(), permanent: true);
Get.put<SharedPrefUtil>(SharedPrefUtil(Get.find<SharedPreferences>()),permanent: true);
Get.put<RaceController>(RaceController(),permanent: true);
Get.put<CarController>(CarController(),permanent: true);
}

Expand Down
3 changes: 2 additions & 1 deletion lib/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:nostalgia_nitro/race_page.dart';

class HomePage extends StatefulWidget {
Expand Down Expand Up @@ -26,7 +27,7 @@ class _HomePageState extends State<HomePage> {
children: [
ElevatedButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (ctx)=>const RacePage()));
Get.toNamed('/race_page');
},
child: const Text('Start Game')
)
Expand Down
14 changes: 11 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:nostalgia_nitro/core/di/AppBindings.dart';
import 'package:nostalgia_nitro/home_page.dart';
import 'package:nostalgia_nitro/race_controller.dart';
import 'package:nostalgia_nitro/race_page.dart';
import 'package:nostalgia_nitro/splash_page.dart';

void main() {
AppBindings appBindings = AppBindings();
runApp(MyApp(appBindings: appBindings,));
runApp(MyApp(
appBindings: appBindings,
));
}

class MyApp extends StatelessWidget {

final AppBindings appBindings;
const MyApp({super.key,required this.appBindings});

const MyApp({super.key, required this.appBindings});

@override
Widget build(BuildContext context) {
Expand All @@ -33,6 +36,11 @@ class MyApp extends StatelessWidget {
name: "/race_page",
page: () => const RacePage(),
transition: Transition.fade,
binding: BindingsBuilder(
() {
Get.put(RaceController());
},
),
),
GetPage(
name: "/splash_page",
Expand Down
178 changes: 117 additions & 61 deletions lib/race_controller.dart
Original file line number Diff line number Diff line change
@@ -1,90 +1,96 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:nostalgia_nitro/asphalt_widget.dart';
import 'package:nostalgia_nitro/car_controller.dart';
import 'package:nostalgia_nitro/car_widget.dart';
import 'package:nostalgia_nitro/core/shared_pref.dart';
import 'package:nostalgia_nitro/utils/shared_pref.dart';

class RaceController extends GetxController {

ScrollController scrollController = ScrollController();
final carController = Get.find<CarController>();
final sharePref = Get.find<SharedPrefUtil>();
Rx<int> hiScore = 0.obs;
RxList<AsphaltWidget> asphalts = <AsphaltWidget>[].obs;
Rx<int> speed = 16000.obs;
Rx<int> speed = 7520.obs; //16000
Rx<bool> isNitroActive = false.obs;
Rx<int> score = 0.obs;
Rx<int> lap = 0.obs;
Rx<int> armor = 4.obs;
Rx<double> nitroPercent = 1.0.obs;
RenderBox? tempNpcCar;
Rx<bool> isCrashed = false.obs;
static int asphaltDefLength = 5;//10

void handleAsphalts(ScrollController scrollController){

//asphalts def setting was :
void handleAsphalts() {
//asphalts def setting was 10 (new is 5) :
// 10 asphalt in init widget,
// first if condition will check the 10*2 length, if(asphalt.length==20)=> clear asphalts, then return.
// second if condition will check if(asphalt.isEmpty) will have for (0 to 10) to add new asphalts,then return.
// then we will have for(0 to 10), and check the doubleLength -1 if condition (asphalt.length==19) in it.

print('--- handling asphalt --- offset : ${scrollController.offset} --- asphalt length : ${asphalts.length}');

//print('--- handling asphalt --- offset : ${scrollController.offset} --- asphalt length : ${asphalts.length}');

if(asphalts.length == 4){
if (asphalts.length == 10) {
asphalts.clear();
scrollController.jumpTo(scrollController.position.minScrollExtent);
//print('--- removing as-l -- : ${asphalts.length}');//
return;
}


if(asphalts.isEmpty){
//print('------ refull---------');
if (asphalts.isEmpty) {
lap.value += 1;
scrollController.jumpTo(scrollController.position.minScrollExtent);
for(int i = 0 ; i < 2 ; i++){
if(i==0){
asphalts.add(AsphaltWidget(key: GlobalKey(),isLap: true, npcCarKeys: const []));
}
else{
asphalts.add(AsphaltWidget(key: GlobalKey(),npcCarKeys: generateMpcKeys(),));
for (int i = 0; i < 5; i++) {
if (i == 0) {
asphalts.add(AsphaltWidget(key: GlobalKey(), isLap: true, npcCarKeys: const []));
} else {
asphalts.add(AsphaltWidget(
key: GlobalKey(),
npcCarKeys: generateMpcKeys(),
));
}
}
Future.delayed(Duration.zero,(){
if(isNitroActive.value){
Future.delayed(Duration.zero, () {
if (isNitroActive.value) {
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 2).toInt();
}
else{
} else {
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 4).toInt();
}
scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: speed.value), curve: Curves.linear);
scrollController.animateTo(scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: speed.value), curve: Curves.linear);
});
return;
}

for(int i = 0 ; i < 2 ; i++){
if(asphalts.length==3){
asphalts.add(AsphaltWidget(key: GlobalKey(),isLap: true, npcCarKeys: const [],));
}
else{
asphalts.add(AsphaltWidget(key: GlobalKey(),npcCarKeys: generateMpcKeys(),));
for (int i = 0; i < 5; i++) {
if (asphalts.length == 9) {
asphalts.add(AsphaltWidget(
key: GlobalKey(),
isLap: true,
npcCarKeys: const [],
));
} else {
asphalts.add(AsphaltWidget(
key: GlobalKey(),
npcCarKeys: generateMpcKeys(),
));
}
}
Future.delayed(Duration.zero,(){
if(isNitroActive.value){
Future.delayed(Duration.zero, () {
if (isNitroActive.value) {
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 2).toInt();
}
else{
} else {
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 4).toInt();
}
scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: speed.value), curve: Curves.linear);
scrollController.animateTo(scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: speed.value), curve: Curves.linear);
});

}

void handleAccident(ScrollController scrollController)async{

final asphaltsInShow = asphalts.where((element) => (element.key as GlobalKey).currentContext!= null).toList();
void handleAccident() async {
final asphaltsInShow = asphalts.where((element) => (element.key as GlobalKey).currentContext != null).toList();
// print('scroll ---> ${scrollController.offset} --- $asphaltsInShow');
final carsInshow = asphaltsInShow.expand<GlobalKey>((element) => element.npcCarKeys.where((element) => element.currentContext!=null));
final carsInshow = asphaltsInShow.expand<GlobalKey>((element) => element.npcCarKeys.where((element) => element.currentContext != null));
// print('cars ---> len : ${carsInshow.length} --- $carsInshow');
final carsInCrashZone = carsInshow.where((element) {
RenderBox npcCarBox = element.currentContext!.findRenderObject() as RenderBox;
Expand All @@ -93,64 +99,114 @@ class RaceController extends GetxController {
});
// print('cars in crash zone ---> len : ${carsInCrashZone.length} --- $carsInCrashZone');

if (carsInCrashZone.isNotEmpty){
if (carsInCrashZone.isNotEmpty) {
RenderBox mainCarBox = carKey.currentContext!.findRenderObject() as RenderBox;
Offset mainCarPosition = mainCarBox.localToGlobal(Offset.zero);
for(final carInCrashZone in carsInCrashZone){
for (final carInCrashZone in carsInCrashZone) {
RenderBox npcCarBox = carInCrashZone.currentContext!.findRenderObject() as RenderBox;
Offset mpcCarPosition = npcCarBox.localToGlobal(Offset.zero);
// print('mpc size --- ${mpcCarBox.size} ---- dx : ${mpcCarPosition.dx}');
// print('main size --- ${mainCarBox.size} ---- dx : ${mainCarPosition.dx}');
if(mainCarPosition.dx.ceil()==mpcCarPosition.dx.ceil()){
if (mainCarPosition.dx.ceil() == mpcCarPosition.dx.ceil()) {
double mainCarTop = mainCarPosition.dy;
double mainCarBottom = mainCarPosition.dy + carHeight;
double npcCarTop = mpcCarPosition.dy;
double npcCarBottom = mpcCarPosition.dy + carHeight;
if((npcCarBottom >= mainCarTop && npcCarBottom <= mainCarBottom) || (npcCarTop >= mainCarTop && npcCarTop <= mainCarBottom)){
if(tempNpcCar!=npcCarBox){
if ((npcCarBottom >= mainCarTop && npcCarBottom <= mainCarBottom) || (npcCarTop >= mainCarTop && npcCarTop <= mainCarBottom)) {
if (tempNpcCar != npcCarBox) {
armor.value -= 1;
if(armor.value==0){
print('**crashed**');
if (armor.value == 0) {
//print('**crashed**');
isCrashed.value = true;
scrollController.jumpTo(scrollController.offset);
if(hiScore.value < score.value){
if (hiScore.value < score.value) {
sharePref.saveHiScore(score.value);
hiScore.value = score.value;
}
tempNpcCar = null;
showCrashDialog();
break;
}
tempNpcCar = npcCarBox;
}

}
}
}

}


}

void calculateScores(ScrollController scrollController)async{
void calculateScores() async {
score.value += 1;
}

void handleNitro(ScrollController scrollController)async{
if(isNitroActive.value && nitroPercent.value >= 0){
void handleNitro() async {
if (isNitroActive.value && nitroPercent.value >= 0) {
nitroPercent -= 0.0025;
}
else if(!isNitroActive.value && nitroPercent.value <= 1){
} else if (!isNitroActive.value && nitroPercent.value <= 1) {
nitroPercent += 0.0025;
}
else if(isNitroActive.value && nitroPercent.value <= 0){
} else if (isNitroActive.value && nitroPercent.value <= 0) {
isNitroActive.value = false;
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 4).toInt();
scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: speed.value), curve: Curves.linear);
scrollController.animateTo(scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: speed.value), curve: Curves.linear);
}
}

List<GlobalKey> generateMpcKeys(){
List<GlobalKey> generateMpcKeys() {
return List.generate(12, (index) => GlobalKey());
}


}
void resetGame(){
isCrashed.value = false;
speed.value = 7520;
scrollController.jumpTo(scrollController.position.minScrollExtent);
asphalts.clear();
for (int i = 0; i < asphaltDefLength; i++) {
if (i == 0) {
asphalts.add(AsphaltWidget(key: GlobalKey(), isLap: true, npcCarKeys: const []));
} else {
asphalts.add(AsphaltWidget(
key: GlobalKey(),
npcCarKeys: generateMpcKeys(),
));
}
}
score.value = 0;
lap.value = 0;
armor.value = 4;
nitroPercent.value = 1;
isNitroActive.value = false;
carController.carAlignment.value = Alignment.bottomCenter;
speed.value = ((scrollController.position.maxScrollExtent - scrollController.offset) * 2).toInt();
scrollController.animateTo(scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: speed.value), curve: Curves.linear);
}


void showCrashDialog(){
showDialog(
context: Get.context!,
barrierDismissible: false,
builder: (ctx) {
return AlertDialog(
title: const Text('Oops!'),
content: const Text('You have crashed 💥 , no worries its just a game 😉'),
actions: [
ElevatedButton(
onPressed: () {
resetGame();
Get.back();
},
child: const Text('Retry')),
ElevatedButton(
onPressed: () {
Get.back();
Get.back();
},
child: const Text('Exit')),
],
);
});
}
}
Loading

0 comments on commit 9883dcc

Please sign in to comment.