跑酷游戏_1

using UnityEngine;
using System.Collections;
/*
 * CoroutineData is a quick class used to save off any timinig information needed when the game is paused.
 */
public class CoroutineData { 
 public float startTime; 
 public float duration; 
 public CoroutineData() { startTime = 0; duration = 0; }
 public void calcuateNewDuration() { duration -= Time.time - startTime; }
}
/*
 * The game manager is a singleton which manages the game state. It coordinates with all of the other classes to tell them
 * when to start different game states such as pausing the game or ending the game.
 */
public enum GameOverType { Wall, JumpObstacle, DuckObstacle, Pit, Quit };
public class GameManager : MonoBehaviour {
 
 static public GameManager instance;
    public delegate void PlayerSpawnHandler();
    public event PlayerSpawnHandler onPlayerSpawn;
 public delegate void PauseHandler(bool paused);
 public event PauseHandler onPauseGame;
    public bool godMode;
    public bool enableAllPowerUps;
 public bool showTutorial;
    public bool runInBackground;
    private int activeCharacter;
    private GameObject character;
    private bool gamePaused;
    private bool gameActive;
 
 private InfiniteObjectGenerator infiniteObjectGenerator;
 private PlayerController playerController;
 private GUIManager guiManager;
    private DataManager dataManager;
    private AudioManager audioManager;
    private PowerUpManager powerUpManager;
    private MissionManager missionManager;
    private InputController inputController;
    private ChaseController chaseController;
    private CameraController cameraController;
    private CoinGUICollection coinGUICollection;
 
 public void Awake()
 {
  instance = this; 
 }
 
 public void Start ()
 {
  infiniteObjectGenerator = InfiniteObjectGenerator.instance;
  guiManager = GUIManager.instance;
  dataManager = DataManager.instance;
        audioManager = AudioManager.instance;
  powerUpManager = PowerUpManager.instance;
        missionManager = MissionManager.instance;
        inputController = InputController.instance;
        cameraController = CameraController.instance;
        coinGUICollection = CoinGUICollection.instance;
        Application.runInBackground = runInBackground;
        activeCharacter = -1;
        spawnCharacter();
        spawnChaseObject();
 }
    private void spawnCharacter()
    {
        if (activeCharacter == dataManager.getSelectedCharacter()) {
            return;
        }
        if (character != null) {
            Destroy(character);
        }
        activeCharacter = dataManager.getSelectedCharacter();
        character = GameObject.Instantiate(dataManager.getCharacterPrefab(activeCharacter)) as GameObject;
        playerController = PlayerController.instance;
        playerController.init();
        if (onPlayerSpawn != null) {
            onPlayerSpawn();
        }
    }
    private void spawnChaseObject()
    {
        GameObject prefab;
        if ((prefab = dataManager.getChaseObjectPrefab()) != null) {
            chaseController = (GameObject.Instantiate(prefab) as GameObject).GetComponent<ChaseController>();
        }
    }
 
 public void startGame(bool fromRestart)
 {
        gameActive = true;
        inputController.startGame();
  guiManager.showGUI(GUIState.InGame);
        audioManager.playBackgroundMusic(true);
        cameraController.startGame(fromRestart);
        infiniteObjectGenerator.startGame();
  playerController.startGame();
        if (chaseController != null)
            chaseController.startGame();
 }
    public bool isGameActive()
    {
        return gameActive;
    }
    public void toggleTutorial()
    {
        showTutorial = !showTutorial;
        infiniteObjectGenerator.reset();
        if (showTutorial) {
            infiniteObjectGenerator.showStartupObjects(true);
        } else {
            // show the startup objects if there are any
            if (!infiniteObjectGenerator.showStartupObjects(false))
                infiniteObjectGenerator.spawnObjectRun(false);
        }
        infiniteObjectGenerator.readyFromReset();
    }
 
 public void obstacleCollision(ObstacleObject obstacle, Vector3 position)
 {
        if (!powerUpManager.isPowerUpActive(PowerUpTypes.Invincibility) && !powerUpManager.isPowerUpActive(PowerUpTypes.SpeedIncrease) && !godMode && gameActive) {
            playerController.obstacleCollision(obstacle.getTransform(), position);
   dataManager.obstacleCollision();
            if (dataManager.getCollisionCount() == playerController.maxCollisions) {
                gameOver(obstacle.isJump ? GameOverType.JumpObstacle : GameOverType.DuckObstacle, true);
            } else {
                // the chase object will end the game
                if (playerController.maxCollisions == 0 && chaseController != null) {
                    if (chaseController.isVisible()) {
                        gameOver(obstacle.isJump ? GameOverType.JumpObstacle : GameOverType.DuckObstacle, true);
                    } else {
                        chaseController.approach();
                        audioManager.playSoundEffect(SoundEffects.ObstacleCollisionSoundEffect);
                    }
                } else {
                    // have the chase object approach the character when the collision count gets close
                    if (chaseController != null && dataManager.getCollisionCount() == playerController.maxCollisions - 1) {
                        chaseController.approach();
                    }
                    audioManager.playSoundEffect(SoundEffects.ObstacleCollisionSoundEffect);
                }
            }
  }
 }
 
    // initial collection is true when the player first collects a coin. It will be false when the coin is done animating to the coin element on the GUI
    // returns the value of the coin with the double coin power up considered
 public int coinCollected()
 {
        int coinValue = (powerUpManager.isPowerUpActive(PowerUpTypes.DoubleCoin) ? 2 : 1);
        audioManager.playSoundEffect(SoundEffects.CoinSoundEffect);
        return coinValue;
 }
    public void coinCollected(int coinValue)
    {
        dataManager.addToCoins(coinValue);
    }
    public void activatePowerUp(PowerUpTypes powerUpType, bool activate)
    {
        if (activate) {
            // deactivate the current power up (if a power up is active) and activate the new one
            powerUpManager.deactivatePowerUp();
            powerUpManager.activatePowerUp(powerUpType);
            audioManager.playSoundEffect(SoundEffects.PowerUpSoundEffect);
        }
        playerController.activatePowerUp(powerUpType, activate);
        guiManager.activatePowerUp(powerUpType, activate, dataManager.getPowerUpLength(powerUpType));
    }
 
 public void gameOver(GameOverType gameOverType, bool waitForFrame)
 {
        if (!gameActive && waitForFrame)
            return;
        gameActive = false;
        if (waitForFrame) {
            // mecanim doesn‘t trigger the event if we wait until the frame is over
            playerController.gameOver(gameOverType);
            StartCoroutine(waitForFrameGameOver(gameOverType));
        } else {
            inputController.gameOver();
            // Mission Manager‘s gameOver must be called before the Data Manager‘s gameOver so the Data Manager can grab the 
            // score multiplier from the Mission Manager to determine the final score
            missionManager.gameOver();
            coinGUICollection.gameOver();
            dataManager.gameOver();
            if (playerController.enabled)
                playerController.gameOver(gameOverType);
            if (chaseController != null)
                chaseController.gameOver(gameOverType);
            audioManager.playBackgroundMusic(false);
            if (gameOverType != GameOverType.Quit)
                audioManager.playSoundEffect(SoundEffects.GameOverSoundEffect);
            guiManager.gameOver();
            cameraController.gameOver(gameOverType);
        }
 }
 
 // Game over may be called from a trigger so wait for the physics loop to end
    private IEnumerator waitForFrameGameOver(GameOverType gameOverType)
 {
  yield return new WaitForEndOfFrame();
        gameOver(gameOverType, false);
        // Wait a second for the ending animations to play
        yield return new WaitForSeconds(1.0f);
        guiManager.showGUI(GUIState.EndGame);
 }
 
 public void restartGame(bool start)
 {
        if (gamePaused) {
            if (onPauseGame != null)
                onPauseGame(false);
            gameOver(GameOverType.Quit, false);
        }
  dataManager.reset();
  infiniteObjectGenerator.reset();
  powerUpManager.reset();
  playerController.reset();
        cameraController.reset();
        if (chaseController != null)
            chaseController.reset();
        if (showTutorial) {
            infiniteObjectGenerator.showStartupObjects(true);
        } else {
            // show the startup objects if there are any
            if (!infiniteObjectGenerator.showStartupObjects(false))
                infiniteObjectGenerator.spawnObjectRun(false);
        }
        infiniteObjectGenerator.readyFromReset();
        if (start)
            startGame(true);
 }
    public void backToMainMenu(bool restart)
 {
        if (gamePaused) {
            if (onPauseGame != null)
                onPauseGame(false);
            gameOver(GameOverType.Quit, false);
        }
        if (restart)
            restartGame(false);
  guiManager.showGUI(GUIState.MainMenu);
 }
    // activate/deactivate the character when going into the store. The GUIManager will manage the preview
    public void showStore(bool show)
    {
        // ensure the correct character is used
        if (!show) {
            spawnCharacter();
        }
#if UNITY_3_5
        character.SetActiveRecursively(!show);
#else
        InfiniteRunnerStarterPackUtility.ActiveRecursively(character.transform, !show);
#endif
    }
 
 public void pauseGame(bool pause)
    {
        guiManager.showGUI(pause ? GUIState.Pause : GUIState.InGame);
        audioManager.playBackgroundMusic(!pause);
  if (onPauseGame != null)
            onPauseGame(pause);
        inputController.enabled = !pause;
        gamePaused = pause;
 }
 
 public void upgradePowerUp(PowerUpTypes powerUpType)
 {
        // Can‘t upgrade if the player can‘t afford the power up
        int cost = dataManager.getPowerUpCost(powerUpType);
        if (dataManager.getTotalCoins() < cost) {
            return;
        }
  dataManager.upgradePowerUp(powerUpType);
        dataManager.adjustTotalCoins(-cost);
 }
    public void selectCharacter(int character)
    {
        int characterCost = dataManager.getCharacterCost(character);
        if (characterCost == -1) { // can only select a character if it has been purchased
            if (dataManager.getSelectedCharacter() != character) {
                dataManager.setSelectedCharacter(character);
            }
        }
    }
    public void purchaseCharacter(int character)
    {
        int cost = dataManager.getCharacterCost(character);
        if (dataManager.getTotalCoins() < cost) {
            return;
        }
        dataManager.purchaseCharacter(character);
        dataManager.setSelectedCharacter(character);
        dataManager.adjustTotalCoins(-cost);
    }
 
 public void OnApplicationPause(bool pause)
 {
        if (gamePaused)
            return;
  if (onPauseGame != null)
   onPauseGame(pause);
 }
}
时间: 2024-11-08 09:35:39

跑酷游戏_1的相关文章

Unity跑酷游戏中的路点生成算法

最近做了一个小的跑酷游戏,今天就我前几天写的 游戏玩家跟随在跑道上的路点行走的简单逻辑进行一下梳理,希望大家和我自己都能够有一定的进步. 下面我先说一下该款游戏的一些有必要知道的前提.跑道是动态生成的,而路点又是作为跑道子对象waypoints的子对象(简单而言,就是孙子对象)存在.所以,路点也就是动态创建,动态销毁了.我的思路是在游戏刚刚加载时,由RacetrackGenerator脚本类在初始化时先动态生成两个跑道,而每个跑道都有一个自己的WaypointsManager(路点管理器脚本),

蓝图跑酷游戏教学的项目文件

#虚幻4# 蓝图跑酷游戏教学的项目文件.总有人要这个,其实照着视频做一遍才好,因为工程很多东西体现不出来,功能拆分,编码思路,进度把控什么的都看不出来.连PPT一块发了. 链接: https://pan.baidu.com/s/1i46NMlf 密码: ciew

跑酷游戏的角色控制设计经验

你可能想制作一款超现实主义基于立体像素的第一人称的跑酷游戏.你正努力制定一个产品计划.哪个环节最耗时?图像?声音?还是关卡设计?我打赌一定是角色控制.我还打赌这会耗费4年半的时间,为什么? 跑酷游戏的玩家移动极为重要,需要大量时间才能摸准正确的感觉. 每款游戏都有自己的特点,你绝对找不到解释如何针对你自己的游戏展开设计的文章或攻略.你只能自己摸着石头过河. 也就是说,每款游戏都有一些值得借鉴的智慧和经验.在此以我自己的亲身经历为例. 制作角色 你是一名程序员,但在处理GIMP的时候也能如鱼得水,

虚幻4蓝图跑酷游戏制作公开课

#虚幻4# 蓝图跑酷游戏制作公开课,持续更新中. 油管地址:http://t.cn/Rczx3Jv 国内地址:http://t.cn/Rczx3JP 本课程是免费课程,赞助随意,一杯咖啡钱即可,几杯也行,慢慢喝--

HTML5游戏实战(3): 60行代码实现水平跑酷游戏

跑酷游戏无疑是目前最受欢迎的游戏类型之一,3D跑酷游戏可能比较难做一点(这个我不懂),2D跑酷却是非常容易的,只要有美术资源,做一个<天天酷跑>这类流行游戏也并非是什么难事. 这里通过一个松鼠跑酷的游戏介绍一下用Gamebuilder+CanTK开发游戏的方法,这个游戏的主场景仅用了60来行代码. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏和APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://g

HTML5游戏实战(1):50行代码实现正面跑酷游戏

前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. 0.先Show一下最终成果: 在线运行:http://gamebuilder.duapp.com/apprun.php?appid=ZecSmA0UGRTh9juSEmu8RjkK-41416104149375 在线编辑:http://gamebuilder.duapp.com/gamebuilder.php?appid=

Cocos2d-x3.2刀塔创奇三消游戏源码,跑酷游戏源码,塔防游戏源码

闲的无聊, 写了三个小游戏,基本知识点如下 三消游戏: 原理是一个二维数组, 跑酷游戏: TiledMap,Sprite以及动画层和地图层的碰撞 塔防游戏: Cocostudio UI编辑器,动画编辑器,场景编辑器,动态获取场景 UI编辑器的动画 TiledMap,Action动画,节点自动删除 关卡数据配置文件,关卡切换 异步加载资源 ------------------------------- 最近很忙,就到这里了,看不懂代码等我的新书吧<Cocos2d-x3.2教程> 下载地址 三消游

【141103】跑酷游戏源代码

本源码是模拟的跑酷小游戏,带有流畅的人物奔跑动画效果,还有欢快的音乐.源码基于VC 2010创建,请用VS2010或更高版本编译运行.在帧动画的判断上,本可以直接使用求余运算, 但是%求余运算速度及效率不好, 所以使用简单的判断操作代替.通过源码可了解下绘制人物.透明贴图的相关技巧,这些技巧对于编写游戏来用是相当有用的. 游戏源码下载地址:点击下载

笔记:利用 Cocos2dx 3.2 与 Box2D制作一个跑酷游戏

最近写lua写得没有力气了,所以想让脑袋放松一下,刚好看到有人在用swift做游戏: Swift游戏实战-跑酷熊猫 于是脑子一短路,就想到了利用这些素材来做一个游戏. 本来不想记笔记的,但是由于选择物理引擎的时候遇到诸多问题,所以选择记录下来,目前只做了个雏形,需要再完善一点. 需要知识: 1 cocos2dx-3.2 基本知识 2 box2d有一定的了解. 由于比较简单,所以把所有代码给上了先,然后再简单介绍下遇到的问题之类的东西. 首先是主角,熊猫类: Panda.h 1 #ifndef _