// mendapatkan index tempat obstacle yang sedang aktif, diaktifkan paling awal, dan memiliki prefab id prefabId, pada pool yang sesuai public int GetIndexLastActive(ObstacleModel.ID prefabId) { int prefabIndex = GetPrefabIndex(prefabId); if (app.model.obstacleModel.indexFirstActive [prefabIndex] == ObstacleModel.INDEX_INACTIVE) { return(ObstacleModel.INDEX_INACTIVE); } int result = app.model.obstacleModel.indexNextActive [prefabIndex] - 1; if (result < 0) { result = app.model.obstacleModel.pool [prefabIndex].Count - 1; } return(result); }
// menonaktifkan obstacle pertama yang aktif dari pool untuk prefab dengan ID prefabId public void DeactivateFromPool(ObstacleModel.ID prefabId) { int prefabIndex = GetPrefabIndex(prefabId); if (app.model.obstacleModel.indexFirstActive [prefabIndex] != ObstacleModel.INDEX_INACTIVE) { DeactivateObstacle(app.model.obstacleModel.pool [prefabIndex][app.model.obstacleModel.indexFirstActive [prefabIndex]]); app.model.obstacleModel.indexFirstActive [prefabIndex]++; if (app.model.obstacleModel.indexFirstActive [prefabIndex] >= app.model.obstacleModel.pool [prefabIndex].Count) { app.model.obstacleModel.indexFirstActive [prefabIndex] = 0; } if (app.model.obstacleModel.indexFirstActive [prefabIndex] == app.model.obstacleModel.indexNextActive [prefabIndex]) { app.model.obstacleModel.indexFirstActive [prefabIndex] = ObstacleModel.INDEX_INACTIVE; } } }
void Update() { // gerakkan obstacle for (int prefabIndex = 0; prefabIndex < app.model.obstacleModel.prefabs.Length; prefabIndex++) { int indexNow = app.model.obstacleModel.indexFirstActive [prefabIndex]; if (indexNow != ObstacleModel.INDEX_INACTIVE) { int indexBorder = app.model.obstacleModel.indexNextActive [prefabIndex]; float xTranslation = -app.model.groundModel.baseGroundSpeed * Time.deltaTime; do { app.model.obstacleModel.pool[prefabIndex][indexNow].GetComponent <Rigidbody2D>().transform.Translate( xTranslation, 0.0f, 0.0f ); indexNow++; if (indexNow >= app.model.obstacleModel.pool[prefabIndex].Count) { indexNow = 0; } } while (indexNow != indexBorder); } } // menyembunyikan obstacle yang terlalu kiri for (int prefabIndex = 0; prefabIndex < app.model.obstacleModel.prefabs.Length; prefabIndex++) { ObstacleModel.ID prefabId = app.model.obstacleModel.prefabIds [prefabIndex]; if (GetIndexFirstActive(prefabId) != ObstacleModel.INDEX_INACTIVE) { GameObject leftmostObstacle = app.model.obstacleModel.pool [prefabIndex] [GetIndexFirstActive(prefabId)]; while (leftmostObstacle.transform.position.x <= app.model.groundModel.xLeft) { DeactivateFromPool(prefabId); if (GetIndexFirstActive(prefabId) == ObstacleModel.INDEX_INACTIVE) { break; } leftmostObstacle = app.model.obstacleModel.pool [prefabIndex] [GetIndexFirstActive(prefabId)]; } } } // menghitung waktu if (!app.model.screenModel.paused && !app.model.screenModel.gameOver) { app.model.obstacleModel.currentDeltaTime += Time.deltaTime; } // cek waktu kapan menggenerate obstacle baru if (app.model.obstacleModel.currentDeltaTime >= app.model.obstacleModel.nextObstacleTime) { int rightmostGroundPrefabIndex = app.controller.groundController.GetPrefabIndex(GroundModel.ID.GROUND_MIDDLE); int rightmostGroundPoolIndex = app.controller.groundController.GetIndexLastActive(GroundModel.ID.GROUND_MIDDLE); GameObject rightmostGround = app.model.groundModel.pool [rightmostGroundPrefabIndex] [rightmostGroundPoolIndex]; Vector3 rightmostGroundPosition = rightmostGround.transform.position; float deltaTime = Random.Range(app.model.obstacleModel.minimumDeltaTime, app.model.obstacleModel.maximumDeltaTime); app.model.obstacleModel.nextObstacleTime = deltaTime; app.model.obstacleModel.currentDeltaTime = 0.0f; int intObstacleID; if (app.controller.backgroundController.area == false) { intObstacleID = Random.Range(0, 2); } else { intObstacleID = Random.Range(1, 3); } ObstacleModel.ID nextObstacleID = (ObstacleModel.ID)intObstacleID; ActivateFromPool(nextObstacleID); // pemosisian GameObject rightmostObstacle = app.model.obstacleModel.pool[GetPrefabIndex(nextObstacleID)][GetIndexLastActive(nextObstacleID)]; if (nextObstacleID == ObstacleModel.ID.OBSTACLE_GROUND_SPIKE) { Debug.Log("duri"); rightmostObstacle.transform.position = new Vector3( app.model.groundModel.xRight + app.model.groundModel.boundSize.x, rightmostGroundPosition.y + (-app.model.groundModel.boundSize.y + app.model.obstacleModel.boundSizes [GetPrefabIndex(nextObstacleID)].y) * 0.5f, rightmostObstacle.transform.position.z ); } else if (nextObstacleID == ObstacleModel.ID.OBSTACLE_SMALL_SLIME) { Debug.Log("slime"); rightmostObstacle.transform.position = new Vector3( app.model.groundModel.xRight + app.model.groundModel.boundSize.x, rightmostGroundPosition.y + (-app.model.groundModel.boundSize.y + app.model.obstacleModel.boundSizes [GetPrefabIndex(nextObstacleID)].y) * 0.5f, rightmostObstacle.transform.position.z ); } else { Debug.Log("lebah"); rightmostObstacle.transform.position = new Vector3( app.model.groundModel.xRight + app.model.groundModel.boundSize.x, rightmostGroundPosition.y + (app.model.groundModel.boundSize.y * 5 / 7 + app.model.playerModel.boundSize.y), rightmostObstacle.transform.position.z ); } } }
// mendapatkan index tempat obstacle yang sedang aktif, diaktifkan paling awal, dan memiliki prefab id prefabId, pada pool yang sesuai public int GetIndexFirstActive(ObstacleModel.ID prefabId) { int prefabIndex = GetPrefabIndex(prefabId); return(app.model.obstacleModel.indexFirstActive [prefabIndex]); }
// mendapatkan index tempat prefab ber-id prefabId pada array of prefab public int GetPrefabIndex(ObstacleModel.ID prefabId) { return(app.model.obstacleModel.prefabIdToPrefabIndex [(int)prefabId]); }