UNPKG

react-native-games

Version:

Free games for your react native projects.

1 lines 7.57 kB
"use strict";import{create}from 'zustand';import{subscribeWithSelector}from 'zustand/middleware';import{immerMiddleware}from "../../services/UtilsService.js";import{DINO_JUMP_CONSTANTS,DINO_JUMP_GAME_CONFIG,getGroundY}from "./DinoJumpConstants.js";import{playSound,GAME_SOUNDS}from "../../services/SoundsService.js";import{playHaptic,HapticType}from "../../services/HapticsService.js";export const useDinoJumpStore = create()(subscribeWithSelector(immerMiddleware((set,get)=>({isPlaying:false,isGameOver:false,isPaused:false,dinosaurY:47,dinosaurVelocityY:0,dinosaurState:'running',isJumping:false,isDucking:false,obstacles:[],clouds:[],stars:[],collisionBlasts:[],score:0,distance:0,speed:3,timeLeft:300,timeElapsed:0,startTime:null,lives:3,groundOffset:0,offset:0,setOffset:offset =>{set(state =>{state.offset = offset;});},startGame:()=>{const currentState = get();if(currentState.isPlaying)return;set(state =>{state.isPlaying = true;state.isGameOver = false;state.isPaused = false;state.startTime = Date.now();state.dinosaurState = 'running';});},stopGame:()=>{const state = get();state.resetGame();},resetGame:()=>{set(state =>{state.isPlaying = false;state.isGameOver = false;state.isPaused = false;state.dinosaurY = 47;state.dinosaurVelocityY = 0;state.dinosaurState = 'running';state.isJumping = false;state.isDucking = false;state.obstacles = [];state.clouds = [];state.score = 0;state.distance = 0;state.speed = 3;state.timeLeft = 300;state.timeElapsed = 0;state.startTime = null;state.lives = 3;state.groundOffset = 0;});},pauseGame:()=>{set(state =>{state.isPaused = true;});},resumeGame:()=>{set(state =>{state.isPaused = false;});},jump:()=>{try{const state = get();if(!state || !state.isPlaying || state.isGameOver || state.isPaused || state.isJumping){return;}set(state =>{state.isJumping = true;state.dinosaurVelocityY = DINO_JUMP_CONSTANTS.jumpForce;state.dinosaurState = 'jumping';});}catch(error){console.error('Jump action error:',error);}},updateDinosaur:_deltaTime =>{const state = get();if(!state.isPlaying || state.isGameOver)return;set(state =>{if(state.isJumping){state.dinosaurVelocityY += DINO_JUMP_CONSTANTS.gravity;state.dinosaurY += state.dinosaurVelocityY;if(state.dinosaurY >= 47){state.dinosaurY = 47;state.dinosaurVelocityY = 0;state.isJumping = false;state.dinosaurState = 'running';}}});},addObstacle:obstacle =>{set(state =>{if(state.obstacles.length < 8){state.obstacles.push(obstacle);}});},removeObstacle:id =>{set(state =>{state.obstacles = state.obstacles.filter(obstacle => obstacle.id !== id);});},updateObstacles:_deltaTime =>{const state = get();if(!state.isPlaying || state.isGameOver)return;set(state =>{state.obstacles.forEach(obstacle =>{obstacle.x -= obstacle.speed;});state.obstacles = state.obstacles.filter(obstacle => obstacle.x > -obstacle.width);});},addCloud:cloud =>{set(state =>{state.clouds.push(cloud);});},addStar:star =>{set(state =>{state.stars.push(star);});},updateStars:_deltaTime =>{const state = get();if(!state.isPlaying || state.isGameOver)return;set(state =>{state.stars.forEach(star =>{star.x -= star.speed;});state.stars = state.stars.filter(star => star.x > -star.width);});},updateClouds:_deltaTime =>{const state = get();if(!state.isPlaying || state.isGameOver)return;set(state =>{state.clouds.forEach(cloud =>{cloud.x -= cloud.speed;});state.clouds = state.clouds.filter(cloud => cloud.x > -cloud.width);});},removeCollisionBlast:id =>{set(state =>{state.collisionBlasts = state.collisionBlasts.filter(blast => blast.id !== id);});},checkCollisions:settings =>{const state = get();const dinosaurX = DINO_JUMP_GAME_CONFIG.DINOSAUR_X;const dinosaurWidth = DINO_JUMP_GAME_CONFIG.DINOSAUR_WIDTH;const dinosaurHeight = state.isDucking ? 30:DINO_JUMP_GAME_CONFIG.DINOSAUR_HEIGHT;const groundY = getGroundY(state.offset);const dinosaurScreenY = groundY - dinosaurHeight - 2 -(47 - state.dinosaurY);for(const star of state.stars){if(dinosaurX < star.x + star.width && dinosaurX + dinosaurWidth > star.x && dinosaurScreenY < star.y + star.height && dinosaurScreenY + dinosaurHeight > star.y){set(state =>{state.lives = Math.min(state.lives + 1,5);state.score += 50;state.stars = state.stars.filter(s => s.id !== star.id);});playSound(GAME_SOUNDS.DINO_JUMP.COLLECT,settings.enableSounds);playHaptic(HapticType.SUCCESS,settings.enableHaptics);}}for(const obstacle of state.obstacles){if(dinosaurX < obstacle.x + obstacle.width && dinosaurX + dinosaurWidth > obstacle.x && dinosaurScreenY < obstacle.y + obstacle.height && dinosaurScreenY + dinosaurHeight > obstacle.y){set(state =>{state.lives -= 1;const collisionX = obstacle.x + obstacle.width / 2;const collisionY = obstacle.y + obstacle.height / 2;state.collisionBlasts.push({id:`blast_${Date.now()}`,x:collisionX,y:collisionY});state.obstacles = state.obstacles.filter(obs => obs.id !== obstacle.id);if(state.lives <= 0){state.isGameOver = true;state.isPlaying = false;state.dinosaurState = 'dead';playSound(GAME_SOUNDS.DINO_JUMP.GAME_OVER,settings.enableSounds);playHaptic(HapticType.ERROR,settings.enableHaptics);}else{playSound(GAME_SOUNDS.DINO_JUMP.HIT,settings.enableSounds);playHaptic(HapticType.HEAVY,settings.enableHaptics);}});return true;}}return false;},updateScore:points =>{set(state =>{state.score += points;state.distance += 1;});},updateSpeed:()=>{set(state =>{const speedIncrease = Math.floor(state.distance / 100)* 0.5;state.speed = Math.min(3 + speedIncrease,10);});},updateGround:_deltaTime =>{const state = get();if(!state.isPlaying || state.isGameOver)return;set(state =>{state.groundOffset += state.speed;if(state.groundOffset >= 100){state.groundOffset = 0;}});},decrementTime:()=>{set(state =>{if(state.timeLeft > 0){state.timeLeft--;if(state.startTime){state.timeElapsed = Math.floor((Date.now()- state.startTime)/ 1000);}}else{state.isPlaying = false;state.isGameOver = true;state.startTime = null;}});},initializeGame:difficulty =>{set(state =>{const speeds ={easy:3,medium:5,hard:7};state.speed = speeds[difficulty];const timeLimits = DINO_JUMP_CONSTANTS.timeLimit;const timeLimit = timeLimits[difficulty];state.isPlaying = false;state.isGameOver = false;state.isPaused = false;state.dinosaurY = 47;state.dinosaurVelocityY = 0;state.dinosaurState = 'running';state.isJumping = false;state.isDucking = false;state.obstacles = [];state.clouds = [];state.score = 0;state.distance = 0;state.timeLeft = timeLimit;state.timeElapsed = 0;state.startTime = null;state.groundOffset = 0;});}}))));export const useIsPlaying =()=> useDinoJumpStore(state => state.isPlaying);export const useIsGameOver =()=> useDinoJumpStore(state => state.isGameOver);export const useIsPaused =()=> useDinoJumpStore(state => state.isPaused);export const useDinosaurY =()=> useDinoJumpStore(state => state.dinosaurY);export const useDinosaurVelocityY =()=> useDinoJumpStore(state => state.dinosaurVelocityY);export const useDinosaurStateValue =()=> useDinoJumpStore(state => state.dinosaurState);export const useIsJumping =()=> useDinoJumpStore(state => state.isJumping);export const useIsDucking =()=> useDinoJumpStore(state => state.isDucking);export const useScore =()=> useDinoJumpStore(state => state.score);export const useTimeLeft =()=> useDinoJumpStore(state => state.timeLeft);export const useLives =()=> useDinoJumpStore(state => state.lives);export const useObstacles =()=> useDinoJumpStore(state => state.obstacles);export const useClouds =()=> useDinoJumpStore(state => state.clouds);export const useGroundOffset =()=> useDinoJumpStore(state => state.groundOffset);export const useStars =()=> useDinoJumpStore(state => state.stars);