private void OnAllFramesReady(object sender, AllFramesReadyEventArgs eventArgs) { KinectSensor kinectSensor = sender as KinectSensor; if (kinectSensor == null) { return; } using (SkeletonFrame skeletonFrame = eventArgs.OpenSkeletonFrame()) { if (skeletonFrame != null) { if ((this.mSkeletonBuffer == null) || (this.mSkeletonBuffer.Length != skeletonFrame.SkeletonArrayLength)) { this.mSkeletonBuffer = new Skeleton[skeletonFrame.SkeletonArrayLength]; } skeletonFrame.CopySkeletonDataTo(this.mSkeletonBuffer); int playerId = 0; foreach (Skeleton skeleton in this.mSkeletonBuffer) { if (skeleton.TrackingState != SkeletonTrackingState.Tracked) { continue; } Player player = null; if (this.mPlayers.ContainsKey(playerId)) { player = this.mPlayers[playerId]; } else { player = new Player(playerId); player.SetPlayerBounds(this.mPlayerBounds); this.mPlayers.Add(playerId, player); } player.TimeLastUpdated = DateTime.Now; if (skeleton.Joints.Count > 0) { player.IsAlive = true; player.State = PlayerState.Alive; // 衝突判定を行う部位 // 頭, 手, 足 player.UpdateJointPosition(skeleton.Joints, JointType.Head); player.UpdateJointPosition(skeleton.Joints, JointType.HandLeft); player.UpdateJointPosition(skeleton.Joints, JointType.HandRight); player.UpdateJointPosition(skeleton.Joints, JointType.FootLeft); player.UpdateJointPosition(skeleton.Joints, JointType.FootRight); // ボーン // 手, 肩 player.UpdateBonePosition(skeleton.Joints, JointType.HandRight, JointType.WristRight); player.UpdateBonePosition(skeleton.Joints, JointType.WristRight, JointType.ElbowRight); player.UpdateBonePosition(skeleton.Joints, JointType.ElbowRight, JointType.ShoulderRight); player.UpdateBonePosition(skeleton.Joints, JointType.HandLeft, JointType.WristLeft); player.UpdateBonePosition(skeleton.Joints, JointType.WristLeft, JointType.ElbowLeft); player.UpdateBonePosition(skeleton.Joints, JointType.ElbowLeft, JointType.ShoulderLeft); // 頭, 肩 player.UpdateBonePosition(skeleton.Joints, JointType.ShoulderCenter, JointType.Head); player.UpdateBonePosition(skeleton.Joints, JointType.ShoulderLeft, JointType.ShoulderCenter); player.UpdateBonePosition(skeleton.Joints, JointType.ShoulderCenter, JointType.ShoulderRight); // 足 player.UpdateBonePosition(skeleton.Joints, JointType.HipLeft, JointType.KneeLeft); player.UpdateBonePosition(skeleton.Joints, JointType.KneeLeft, JointType.AnkleLeft); player.UpdateBonePosition(skeleton.Joints, JointType.AnkleLeft, JointType.FootLeft); player.UpdateBonePosition(skeleton.Joints, JointType.HipRight, JointType.KneeRight); player.UpdateBonePosition(skeleton.Joints, JointType.KneeRight, JointType.AnkleRight); player.UpdateBonePosition(skeleton.Joints, JointType.AnkleRight, JointType.FootRight); player.UpdateBonePosition(skeleton.Joints, JointType.HipLeft, JointType.HipCenter); player.UpdateBonePosition(skeleton.Joints, JointType.HipCenter, JointType.HipRight); // 胴体 player.UpdateBonePosition(skeleton.Joints, JointType.HipCenter, JointType.ShoulderCenter); } playerId++; } } } using (ColorImageFrame colorImageFrame = eventArgs.OpenColorImageFrame()) { if (colorImageFrame != null) { colorImageFrame.CopyPixelDataTo(this.mPixelBuffer); this.mMainImageBuffer.Lock(); this.mMainImageBuffer.WritePixels( new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height), this.mPixelBuffer, colorImageFrame.Width * 4, 0); this.mMainImageBuffer.Unlock(); } } }
public HitType CheckHits(Player player) { int playerId = player.Id; Dictionary<Bone, BoneData> segments = player.Segments; DateTime currentTime = DateTime.Now; foreach (var pair in segments) { for (int i = 0; i < this.mFallingItems.Count; i++) { FallingItem fallingItem = this.mFallingItems[i]; if (fallingItem.mState == FallingItemState.Falling) { Point hitCenterPosition = new Point(0.0, 0.0); double lineHitLocation = 0.0; Segment segment = pair.Value.GetEstimatedSegment(currentTime); if (fallingItem.Hit(segment, ref hitCenterPosition, ref lineHitLocation)) { switch (this.mGameMode) { case GameMode.TwoPlayer: case GameMode.OnePlayer: fallingItem.mState = FallingItemState.Dissolving; fallingItem.mDissolve = 0.0; fallingItem.mVelocityX = 0.0; fallingItem.mVelocityY = 0.0; player.Score += this.GetItemScore(fallingItem); if ((player.Score / 2000) > 0) { player.Level = player.Score / 2000; } else { player.Level = 1; } this.mFallingItems[i] = fallingItem; switch (fallingItem.mType) { case FallingItemType.Cherry: case FallingItemType.BigCherry: case FallingItemType.Spike: --player.LifeCount; if (player.LifeCount <= 0) { player.IsAlive = false; player.State = PlayerState.GameOver; } break; case FallingItemType.OneUp: ++player.LifeCount; break; } switch (fallingItem.mType) { case FallingItemType.Cherry: return HitType.HitCherry; case FallingItemType.BigCherry: return HitType.HitBigCherry; case FallingItemType.Spike: return HitType.HitSpike; case FallingItemType.Coin500Yen: case FallingItemType.Coin100Yen: case FallingItemType.Coin50Yen: case FallingItemType.Coin10Yen: case FallingItemType.Coin5Yen: case FallingItemType.Coin1Yen: return HitType.CoinGet; case FallingItemType.OneUp: return HitType.OneUp; } return HitType.None; } } } } } return HitType.None; }
private void CheckPlayers() { // プレイヤーの削除 foreach (var player in this.mPlayers) { if (player.Value.IsAlive == false) { this.mGameState |= GameState.GameOver; this.mGameOverStartTime = DateTime.Now; this.mLastGameOverPlayer = player.Value; this.mHighScores.Add(new KeyValuePair<int, TimeSpan>(this.mLastGameOverPlayer.Score, DateTime.Now.Subtract(this.mFallingItemsManager.GameStartTime))); this.mPlayers.Remove(player.Value.Id); break; } } // ゲームモードの設定 // 有効なプレイヤー数をカウント int playersCount = this.mPlayers.Count(player => player.Value.IsAlive); if (playersCount != this.mAlivePlayersCount) { switch (playersCount) { case 2: this.mGameState |= GameState.Main; this.mGameState &= ~GameState.Title; this.mFallingItemsManager.SetGameMode(GameMode.TwoPlayer); break; case 1: this.mGameState |= GameState.Main; this.mGameState &= ~GameState.Title; this.mFallingItemsManager.SetGameMode(GameMode.OnePlayer); break; case 0: this.mGameState &= ~GameState.Main; this.mGameState |= GameState.Title; this.mFallingItemsManager.SetGameMode(GameMode.NoPlayer); break; } this.mAlivePlayersCount = playersCount; } }