Eiffel Media API
Overview Cluster Class Classes Index      Previous Next      Top Features

em

Class EM_SCENE


Direct ancestors

EM_TIME_SINGLETON, EM_SHARED_SCENE

Known direct descendants

EM_DRAWABLE_SCENE, EM_GL_SCENE, EM_COMPONENT_SCENE

Features

Invariants

indexing

description

Base class for interactive scenes.
Descendants have to implement redraw and initialize_scene.

An EM_SCENE consists of:
- An event_loop that runs the scene and dispatches events to subscribers.
- A screen onto which the scene is drawn when running.

There are some handle_xxx features to handle important events for user interaction
that descendants can redefine to interact.

An EM_SCENE is supposed to be used as follows (i.e. by EM_APPLICATION):
- initialize_scene: called first to initialize the scene
- run: called after initialize_scene to run the scene
- other features: called by event_loop.dispatch

If you want that another scene is executed after your scene ends use set_next_scene
accordingly. Then call start_next_scene to start it.
If you want to end the program call quit.

Use animation features to get animatable objects (i.e. sprites) running.
Like this all animatable objects get animated before the scene is redrawn.

Subclasses must call make_scene at creation.

date

$Date: 2005/10/26 03:47:00 $

revision

$Revision: 1.18 $

deferred class

EM_SCENE

feature -- Initialization

initialize_scene

-- Initialize scene.
-- This is called before the scene is shown on screen.

uninitialize_scene

-- Uninitialize scene.
-- This is called right before next scene is displayed.
-- Redefine this to clean up some needed things (openGl properties, images, ...)

feature -- Access

event_loop: EM_EVENT_LOOP

-- Event loop that makes scene running

next_scene: EM_SCENE

-- Scene that should be executed after this scene ends.
-- If next_scene = Void the program just ends.

screen: EM_VIDEO_SURFACE

-- Surface where scene is drawed

feature -- Status report

is_running: BOOLEAN

-- Is scene currently running?
-- Otherwise no events are dispatched and no animation will run right now.

feature -- Status setting

set_frame_counter_visibility (a_value: BOOLEAN)

-- If a_value is True make frame counter visible,
-- else make it invisible.

feature -- Element change

callback_for_set_next_scene_and_start: FUNCTION[ANY, TUPLE[], EM_SCENE]

-- we have to create next scene in same thread as the SDL thread
-- this function should point to a feature were next scene is created

next_scene_is_set: BOOLEAN

-- Indicates that next scene is set and must be proceeded by
-- the main SDL Thread (syncronise both threads)

set_next_scene (a_scene: like next_scene)

-- Set next_scene to a_scene.

ensure
next_scene_set: next_scene = a_scene
set_next_scene_from_outside (a_callback: like callback_for_set_next_scene_and_start)

-- Set next_scene to a_scene from an other thread
-- Make sure that start_next_scene is called by the main SDL Thread

ensure
next_scene_set: callback_for_set_next_scene_and_start = a_callback
next_scene_set: next_scene_is_set = true

feature -- Miscellaneous

quit

-- Stop scene whitout starting another one.

run (a_screen: EM_VIDEO_SURFACE)

-- Run scene and show it on a_screen.

require
a_screen_not_void: a_screen /= Void
start_next_scene

-- Stop Current and advance to next_scene.

start_next_scene_threaded

-- Call creation procedure for next scene and start this scene immediadely

feature -- Drawing

redraw

-- Redraw scene.

feature -- Events

animation_event: EM_EVENT_TYPE [TUPLE [INTEGER]]

-- Animation event, allows animatable objects to perform animation
-- (i.e. moving them selves) before they get drawed.
-- As an argument the reference time in milliseconds is passed
-- up to which the animatable objects should draw them selves.
-- This event gets published right before the scene is redrawed.

feature -- Animation

animate

-- Let all subscribed animatable objects perform their animation.
-- (Calls go_to_time of animatable objects with current time tick)

start_animating (an_animatable: EM_ANIMATABLE)

-- Subscribe an_animatable to be animated when Current is running.

stop_animating (an_animatable: EM_ANIMATABLE)

-- Unsubscribe an_animatable from beeing animated when Current is running.

invariant

make_scene_called: is_make_scene_called
animation_event_not_void: animation_event /= Void
event_loop_not_void: event_loop /= Void
screen_not_void_when_running: is_running implies screen /= Void

-- From ANY
reflexive_equality: standard_is_equal (Current)
reflexive_conformance: conforms_to (Current)

has_running_scene_definition: has_running_scene implies running_scene /= Void

end