void IActor.SetCollision(MapLayer mapLayer) { CollisionShape = new PhysicalRectangleShape(PhysicalShapeType.Dynamic, mapLayer.PhysicalWorld); CollisionShape.Density = 2.5f; CollisionShape.Restitution = 0.0f; CollisionShape.Friction = 0.0f; CollisionShape.GroupIndex = -1; DrawingPriority = 2; SetCollision(); }
/// <summary> /// マップのロード /// </summary> /// <param name="mapIO">マップデータ</param> /// <param name="initDoorID">初期ドアID</param> /// <param name="initSavePointID">初期セーブポイント</param> /// <param name="loader">ロードするオブジェクト</param> /// <returns></returns> public async Task LoadMapData(SatIO.MapIO mapIO, int initDoorID, int initSavePointID, ILoader loader) { //背景 foreach (var item in mapIO.BackGrounds) { var backGround = await BackGround.CreateBackGroudAsync(item); AddObject(backGround); loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } //物理世界構築 PhysicalWorld = new PhysicalWorld(new asd.RectF(new asd.Vector2DF(-200, -200), mapIO.Size + new asd.Vector2DF(200, 200) * 2), new asd.Vector2DF(0, 8000)); //カメラ設定 { PlayerCamera = new ScrollCamera(mapIO.CameraRestrictions); PlayerCamera.HomingObject = Player; PlayerCamera.Src = new asd.RectI(0, 0, (int)OriginDisplaySize.X, (int)OriginDisplaySize.Y); PlayerCamera.MapSize = mapIO.Size; AddObject(PlayerCamera); Camera.IsDrawn = false; Camera.IsUpdated = false; } //障害物 foreach (var item in mapIO.CollisionBoxes) { PhysicalRectangleShape temp = new PhysicalRectangleShape(PhysicalShapeType.Static, PhysicalWorld); temp.Density = 1; temp.Restitution = 0; temp.Friction = 0; temp.DrawingArea = new asd.RectF(item.Position, item.Size); Obstacles.Add(temp); loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); #if DEBUG asd.GeometryObject2D geometryObject = new asd.GeometryObject2D(); geometryObject.Shape = temp; geometryObject.Color = new asd.Color(0, 0, 255, 100); geometryObject.DrawingPriority = 2; AddObject(geometryObject); #endif } foreach (var item in mapIO.CollisionTriangles) { PhysicalTriangleShape temp = new PhysicalTriangleShape(PhysicalShapeType.Static, PhysicalWorld); temp.Density = 1; temp.Restitution = 0; temp.Friction = 0; var i = 0; foreach (var vertex in item.vertexes) { temp.SetPointByIndex(vertex, i); i++; } Obstacles.Add(temp); loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); #if DEBUG asd.GeometryObject2D geometryObject = new asd.GeometryObject2D(); geometryObject.Shape = temp; geometryObject.Color = new asd.Color(0, 0, 255, 100); geometryObject.DrawingPriority = 2; AddObject(geometryObject); #endif } //ドア var tempDoors = new List <Door>(); foreach (var item in mapIO.Doors) { var door = await Door.CreateDoorAsync(item); door.OnLeave += OnLeave; AddObject(door); tempDoors.Add(door); loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } //マップオブジェクト foreach (var item in mapIO.MapObjects) { try { var mapObject = await MapObject.CreateMapObjectAsync(item); AddObject(mapObject); } catch (Exception e) { Logger.Error(e); } loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } //イベントオブジェクト List <IActor> actors = new List <IActor>(GameScene.Players); foreach (var item in mapIO.EventObjects) { try { var eventObject = await EventObject.CreateEventObjectAsync(item); AddObject(eventObject); actors.Add(eventObject); } catch (Exception e) { Logger.Error(e); } loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } //イベント if (Scene is GameScene gameScene) { foreach (var item in mapIO.MapEvents) { if (GameScene.EndEvents.Any(obj => obj.Key == gameScene.MapPath && obj.Value == item.ID)) { continue; } try { bool isSkip = false; foreach (var item2 in item.Actors.Where(obj => obj.Path != null && obj.Path.IndexOf(".pc") > -1)) { if (!gameScene.CanUsePlayers.Any(obj => obj.Path == item2.Path)) { isSkip = true; break; } } if (isSkip) { continue; } Object.MapEvent.MapEvent temp = await Object.MapEvent.MapEvent.CreateMapEventAsync(item, actors, PlayerCamera); AddObject(temp); } catch (Exception e) { Logger.Error(e); } loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } } //セーブポイント List <SavePoint> tempSavePoints = new List <SavePoint>(); foreach (var item in mapIO.SavePoints) { SavePoint savePoint = new SavePoint(item); AddObject(savePoint); tempSavePoints.Add(savePoint); loader.ProgressInfo = (loader.ProgressInfo.taskCount, loader.ProgressInfo.progress + 1); } //プレイヤー初期配置 if (initSavePointID != -1 && tempSavePoints.FirstOrDefault(savePoint => savePoint.ID == initSavePointID) != null) { Player.Position = tempSavePoints.FirstOrDefault(savePoint => savePoint.ID == initSavePointID).Position; } else if (initDoorID != -1 && tempDoors.FirstOrDefault(door => door.ID == initDoorID) != null) { Door door = tempDoors.FirstOrDefault(obj => obj.ID == initDoorID); Player.Position = door.Position; door.Come(); } return; }