diff --git a/Nu/Nu/Nu/Nu.fsproj b/Nu/Nu/Nu/Nu.fsproj index d27abe0774..ab674a4382 100644 --- a/Nu/Nu/Nu/Nu.fsproj +++ b/Nu/Nu/Nu/Nu.fsproj @@ -89,7 +89,6 @@ - diff --git a/Nu/Nu/Nu/WorldDispatchers.fs b/Nu/Nu/Nu/WorldDispatchers.fs index 026ec85d32..b230ea9457 100644 --- a/Nu/Nu/Nu/WorldDispatchers.fs +++ b/Nu/Nu/Nu/WorldDispatchers.fs @@ -366,7 +366,7 @@ module GuiDispatcherModule = let gui = evt.Subscriber : Entity let data = evt.Data : MouseButtonData let handling = - if World.isSimulantSelected gui world && gui.GetVisible world then + if World.isEntitySelected gui world && gui.GetVisible world then let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (gui.GetViewType world) data.Position) world if data.Down && gui.GetSwallowMouseLeft world && @@ -407,7 +407,7 @@ module ButtonDispatcherModule = let handleMouseLeftDown evt world = let button = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected button world then + if World.isEntitySelected button world then let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (button.GetViewType world) data.Position) world if button.GetVisible world && Math.isPointInBounds mousePositionWorld (button.GetBounds world) then @@ -423,7 +423,7 @@ module ButtonDispatcherModule = let handleMouseLeftUp evt world = let button = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected button world then + if World.isEntitySelected button world then let wasDown = button.GetDown world let world = button.SetDown false world let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (button.GetViewType world) data.Position) world @@ -595,7 +595,7 @@ module ToggleDispatcherModule = let handleMouseLeftDown evt world = let toggle = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected toggle world then + if World.isEntitySelected toggle world then let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (toggle.GetViewType world) data.Position) world if toggle.GetVisible world && Math.isPointInBounds mousePositionWorld (toggle.GetBounds world) then @@ -609,7 +609,7 @@ module ToggleDispatcherModule = let handleMouseLeftUp evt world = let toggle = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected toggle world then + if World.isEntitySelected toggle world then let wasPressed = toggle.GetPressed world let world = toggle.SetPressed false world let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (toggle.GetViewType world) data.Position) world @@ -678,7 +678,7 @@ module FeelerDispatcherModule = let handleMouseLeftDown evt world = let feeler = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected feeler world then + if World.isEntitySelected feeler world then let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (feeler.GetViewType world) data.Position) world if feeler.GetVisible world && Math.isPointInBounds mousePositionWorld (feeler.GetBounds world) then @@ -694,7 +694,7 @@ module FeelerDispatcherModule = let handleMouseLeftUp evt world = let feeler = evt.Subscriber : Entity let data = evt.Data : MouseButtonData - if World.isSimulantSelected feeler world && feeler.GetVisible world then + if World.isEntitySelected feeler world && feeler.GetVisible world then if feeler.GetEnabled world then let world = feeler.SetTouched false world let eventTrace = EventTrace.record "FeelerDispatcher" "handleMouseLeftDown" EventTrace.empty diff --git a/Nu/Nu/Nu/WorldEvents.fs b/Nu/Nu/Nu/WorldEvents.fs index f962c8cc50..ee1d5da628 100644 --- a/Nu/Nu/Nu/WorldEvents.fs +++ b/Nu/Nu/Nu/WorldEvents.fs @@ -23,10 +23,6 @@ type [] KeyboardKeyData = Repeated : bool Down : bool } -/// The data for a change in a simulant. -type SimulantChangeData<'s, 'w when 's :> Simulant and 'w :> 'w Eventable> = - ParticipantChangeData<'s, 'w> - /// The data for a collision event. type [] CollisionData = { Normal : Vector2 @@ -35,7 +31,7 @@ type [] CollisionData = /// The data for a change in the world's ambient state. /// NOTE: I couldn't give its field the more normal name of 'OldWorld' due to field name conflicts with the more -/// pervasive SimulantChangeData type below. +/// pervasive ParticipantChangeData type. type [] AmbientStateChangeData = { OldWorldWithOldState : World } @@ -90,16 +86,16 @@ module Events = let AmbientState = ntoa !!"AmbientState" let AmbientStateChange = AmbientState -<- ntoa !!"Change" let Game = ntoa !!"Game" - let GameChange = Game -<- ntoa> !!"Change" + let GameChange = Game -<- ntoa> !!"Change" let Screen = ntoa !!"Screen" let ScreenAdd = Screen -<- ntoa !!"Add" let ScreenRemoving = Screen -<- ntoa !!"Removing" - let ScreenChange = Screen -<- ntoa> !!"Change" + let ScreenChange = Screen -<- ntoa> !!"Change" let Group = ntoa !!"Group" let GroupAdd = Group -<- ntoa !!"Add" let GroupRemoving = Group -<- ntoa !!"Removing" - let GroupChange = Group -<- ntoa> !!"Change" + let GroupChange = Group -<- ntoa> !!"Change" let Entity = ntoa !!"Entity" let EntityAdd = Entity -<- ntoa !!"Add" let EntityRemoving = Entity -<- ntoa !!"Removing" - let EntityChange = Entity -<- ntoa> !!"Change" \ No newline at end of file + let EntityChange = Entity -<- ntoa> !!"Change" \ No newline at end of file diff --git a/Nu/Nu/Nu/WorldGame.fs b/Nu/Nu/Nu/WorldGame.fs index 10887494f2..12d95fb8df 100644 --- a/Nu/Nu/Nu/WorldGame.fs +++ b/Nu/Nu/Nu/WorldGame.fs @@ -88,6 +88,34 @@ module WorldGameModule = static member setSelectedScreen screen world = World.setOptSelectedScreen (Some screen) world + /// Determine if an entity is selected by being in a group of the currently selected screeen. + static member isEntitySelected entity world = + let screenName = Address.head entity.EntityAddress + match World.getOptSelectedScreen world with + | Some selectedScreen -> screenName = selectedScreen.ScreenName + | None -> false + + /// Determine if a group is selected by being in the currently selected screeen. + static member isGroupSelected group world = + let screenName = Address.head group.GroupAddress + match World.getOptSelectedScreen world with + | Some selectedScreen -> screenName = selectedScreen.ScreenName + | None -> false + + /// Determine if a screen is the currently selected screeen. + static member isScreenSelected screen world = + World.getOptSelectedScreen world = Some screen + + /// Determine if a simulant is contained by, or is the same as, the currently selected screen. + /// Game is always considered 'selected' as well. + static member isSimulantSelected (simulant : Simulant) world = + match Address.getNames simulant.SimulantAddress with + | [] -> true + | screenName :: _ -> + match World.getOptSelectedScreen world with + | Some screen -> screen.ScreenName = screenName + | None -> false + /// Write a game to an xml writer. static member writeGame (writer : XmlWriter) world = let gameState = World.getGameState world diff --git a/Nu/Nu/Nu/WorldObservation.fs b/Nu/Nu/Nu/WorldObservation.fs index 63b5317b7e..b20f28e2f4 100644 --- a/Nu/Nu/Nu/WorldObservation.fs +++ b/Nu/Nu/Nu/WorldObservation.fs @@ -18,11 +18,13 @@ module Observation = observation |> organize (fun _ world -> World.getUpdateCount world) |> toFst |> choose /// Take events from an observation only while World.isTicking evaluates to true. - let [] isTicking _ world = World.isTicking world + let [] isTicking _ world = + World.isTicking world - /// Take events from an observation only when the observer is selected in the world (see - /// documentation for World.isAddressSelected for what this means (it's very useful!)). - let [] isObserverSelected evt world = World.isSimulantSelected evt.Subscriber world + /// Take events from an observation only when the observer is contained by, or is the same as, + /// the currently selected screen. Game is always considered 'selected' as well. + let [] isObserverSelected evt world = + World.isSimulantSelected evt.Subscriber world /// Take events from an observation only when the currently selected screen is idling (that /// is, there is no screen transition in progress). diff --git a/Nu/Nu/Nu/WorldSimulant.fs b/Nu/Nu/Nu/WorldSimulant.fs deleted file mode 100644 index 3464557c64..0000000000 --- a/Nu/Nu/Nu/WorldSimulant.fs +++ /dev/null @@ -1,27 +0,0 @@ -// Nu Game Engine. -// Copyright (C) Bryan Edds, 2012-2016. - -namespace Nu -open System -open Prime -open Nu - -[] -module WorldSimulantModule = - - type World with - - /// Query that the world contains a simulant. - static member containsSimulant<'a when 'a :> Simulant> (simulant : 'a) world = - (world :> World Eventable).ContainsParticipant simulant - - /// Query that a simulant is the either currently selected screen or contained by it. - static member isSimulantSelected<'s when 's :> Simulant> (simulant : 's) world = - let optScreen = World.getOptSelectedScreen world - let optScreenNames = Option.map (fun (screen : Screen) -> Address.getNames screen.ScreenAddress) optScreen - let simulantNames = Address.getNames simulant.SimulantAddress - match (simulantNames, optScreenNames) with - | ([], _) -> true - | (_, None) -> false - | (_, Some []) -> false - | (addressHead :: _, Some (screenAddressHead :: _)) -> addressHead = screenAddressHead \ No newline at end of file diff --git a/Nu/Prime/Debug/Prime.exe b/Nu/Prime/Debug/Prime.exe index ca2c3a6048..55863f9554 100644 Binary files a/Nu/Prime/Debug/Prime.exe and b/Nu/Prime/Debug/Prime.exe differ diff --git a/Nu/Prime/Debug/Prime.pdb b/Nu/Prime/Debug/Prime.pdb index b8fe1dd7e0..4051b20314 100644 Binary files a/Nu/Prime/Debug/Prime.pdb and b/Nu/Prime/Debug/Prime.pdb differ diff --git a/Nu/Prime/Release/Prime.exe b/Nu/Prime/Release/Prime.exe index b937694f9c..e27d08b28e 100644 Binary files a/Nu/Prime/Release/Prime.exe and b/Nu/Prime/Release/Prime.exe differ diff --git a/Nu/Prime/Release/Prime.pdb b/Nu/Prime/Release/Prime.pdb index 2559c183aa..27c2083b76 100644 Binary files a/Nu/Prime/Release/Prime.pdb and b/Nu/Prime/Release/Prime.pdb differ