Jypeli  5
The simple game programming library
Game.cs
Siirry tämän tiedoston dokumentaatioon.
1 #region MIT License
2 /*
3  * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4  * Information Technology.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #endregion
25 
26 /*
27  * Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28  */
29 
30 using System;
31 using System.ComponentModel;
32 using System.Xml;
33 using System.Xml.Serialization;
34 using Microsoft.Xna.Framework;
35 using Microsoft.Xna.Framework.Graphics;
36 using System.Collections.Generic;
37 using System.Linq;
38 using Microsoft.Xna.Framework.Content;
39 
40 #if WINDOWS
41 using System.Runtime.InteropServices;
42 #endif
43 
44 #if XBOX
45 using Microsoft.Xna.Framework.GamerServices;
46 #endif
47 
48 using Jypeli.Widgets;
49 using Jypeli.Effects;
50 using Jypeli.Controls;
51 using Jypeli.WP7;
52 
53 using XnaColor = Microsoft.Xna.Framework.Color;
54 using XnaSoundEffect = Microsoft.Xna.Framework.Audio.SoundEffect;
55 using XnaRectangle = Microsoft.Xna.Framework.Rectangle;
56 using System.Reflection;
57 using System.Diagnostics;
58 
59 
60 namespace Jypeli
61 {
65  [Save]
66  public partial class Game : Microsoft.Xna.Framework.Game, ControlContexted, IDisposable, GameObjectContainer
67  {
68 #if WINDOWS
69  [DllImport( "user32.dll" )]
70  private static extern int GetSystemMetrics( int smIndex );
71 
72  [DllImport("user32.dll")]
73  private static extern bool SetProcessDPIAware();
74 
75  [DllImport("gdi32.dll")]
76  static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
77 
78  enum DeviceCap
79  {
80  VERTRES = 10,
81  DESKTOPVERTRES = 117,
82  }
83 #endif
84 
85  Queue<Action> PendingActions = new Queue<Action>();
86 
90  public bool IsPaused { get; set; }
91 
95  public SynchronousList<Layer> Layers { get; private set; }
96 
100  public IList<Layer> StaticLayers
101  {
102  get { return Layers.FindAll( l => l.IgnoresZoom && l.RelativeTransition == Vector.Zero ).AsReadOnly(); }
103  }
104 
108  public IList<Layer> DynamicLayers
109  {
110  get { return Layers.FindAll( l => !l.IgnoresZoom || l.RelativeTransition != Vector.Zero ).AsReadOnly(); }
111  }
112 
116  public int MinLayer
117  {
118  get { return Layers.FirstIndex; }
119  }
120 
124  public int MaxLayer
125  {
126  get { return Layers.LastIndex; }
127  }
128 
132  public int LayerCount
133  {
134  get { return Layers.Count; }
135  }
136 
140  public static string Name { get; private set; }
141 
142  // TJ: Since there is only one isntance of the
143  // game class in practice, its useful to have it available as
144  // a static member. This way, we avoid passing a reference to the
145  // game in lots of places.
146  //
147  // In addition, some often-used things, such as Time or GraphicsDevice,
148  // are available as static properties (public or internal) as well.
149  public static Game Instance { get; private set; }
150 
154  public static event Action InstanceInitialized;
155 
159  public static new event Action Exiting;
160 
165  [Save]
166  public Camera Camera { get; set; }
167 
172  public bool DrawPerimeter { get; set; }
173 
177  public Color PerimeterColor { get; set; }
178 
182  public static bool SmoothTextures { get; set; }
183 
188  internal static ResourceContentManager ResourceContent { get; private set; }
189 
193  public static ScreenView Screen
194  {
195  get { return Instance.screen; }
196  }
197 
201  public static new JypeliWindow Window { get; private set; }
202 
206  public static Jypeli.Controls.Controls Controls
207  {
208  get { return Instance.controls; }
209  }
210 
211  private ListenContext _context = new ListenContext() { Active = true };
212 
217  {
218  get { return Instance._context; }
219  }
220 
221  public bool IsModal
222  {
223  get { return false; }
224  }
225 
230  public MessageDisplay MessageDisplay { get; set; }
231 
236  public static FileManager DataStorage { get { return Instance.dataStorage; } }
237 
243  public bool AcceptsFocus { get { return true; } }
244 
248  public Keyboard Keyboard { get { return controls.Keyboard; } }
249 
253  public Mouse Mouse { get { return controls.Mouse; } }
254 
258  public TouchPanel TouchPanel { get { return controls.TouchPanel; } }
259 
260  public PhoneBackButton PhoneBackButton { get { return controls.PhoneBackButton; } }
261 
265  public GamePad ControllerOne { get { return controls.GameControllers[0]; } }
266 
270  public GamePad ControllerTwo { get { return controls.GameControllers[1]; } }
271 
275  public GamePad ControllerThree { get { return controls.GameControllers[2]; } }
276 
280  public GamePad ControllerFour { get { return controls.GameControllers[3]; } }
281 
285  public Accelerometer Accelerometer { get { return controls.Accelerometer; } }
286 
287  private Phone phone;
288 
292  public Phone Phone { get { return phone; } }
293 
294 
298  public Level Level
299  {
300  get { return theLevel; }
301  }
302 
308  public static Time Time
309  {
310  get { return currentTime; }
311  }
312 
318  public static Time RealTime
319  {
320  get { return currentTime; }
321  }
322 
326  public static Vector Wind { get; set; }
327 
331  public string Title
332  {
333  get { return Window.Title; }
334  set { Window.Title = value; }
335  }
336 
340  internal int ObjectCount
341  {
342  get
343  {
344  return Layers.Sum<Layer>( l => l.Objects.Count );
345  }
346  }
347 
351  public bool IsFullScreen
352  {
353  get { return Window.Fullscreen; }
354  set { Window.Fullscreen = value; }
355  }
356 
360  public MediaPlayer MediaPlayer { get; private set; }
361 
362  private Jypeli.Controls.Controls controls;
363  private FileManager dataStorage;
364  private ScreenView screen;
365 
366  [EditorBrowsable( EditorBrowsableState.Never )]
367  public static new GraphicsDevice GraphicsDevice
368  {
369  get { return ( (Microsoft.Xna.Framework.Game)Instance ).GraphicsDevice; }
370  }
371 
372  internal static GraphicsDeviceManager GraphicsDeviceManager { get; private set; }
373 
374 #if !WINDOWS_PHONE
375  internal static List<Light> Lights { get { return lights; } }
376 #endif
377 
378 #if !WINDOWS_PHONE
379  private static List<Light> lights = new List<Light>();
380 #endif
381 
382  private Level theLevel;
383 
384  private bool loadContentHasBeenCalled = false;
385  private bool beginHasBeenCalled = false;
386 
387  // Real time passed, including paused time
388  private static Time currentRealTime = new Time();
389 
390  // Game time passed
391  private static Time currentTime = new Time();
392 
393 
397  public Game()
398  : this( 1 )
399  {
400  }
401 
406  public Game( int device )
407  {
408  if ( Instance != null )
409  throw new Exception( "Only one instance of the Game class can be created." );
410 
411  Instance = this;
412  Name = this.GetType().Assembly.FullName.Split( ',' )[0];
413 
414  InitializeLayers();
415  InitializeContent();
416 
417  Camera = new Camera();
418  controls = new Jypeli.Controls.Controls();
419 
420  InitializeGraphics( device );
421  Window = new JypeliWindow( base.Window, Game.GraphicsDeviceManager );
422  Window.Resizing += new JypeliWindow.ResizeEvent( WindowResized );
423  Window.Resized += new JypeliWindow.ResizeEvent( WindowResized );
424 
425 #if WINDOWS
427  SetProcessDPIAware();
428 #elif WINDOWS_PHONE
429  dataStorage = new IsolatedStorageManager();
430 #elif XBOX
431  Components.Add( new GamerServicesComponent( this ) );
432  dataStorage = new XboxFileManager();
433 #endif
434 
435  dataStorage.ReadAccessDenied += delegate (Exception ex)
436  {
437  ShowErrorMessage("Could not read from data directory. " + ex.Message);
438  };
439  dataStorage.WriteAccessDenied += delegate (Exception ex)
440  {
441  ShowErrorMessage("Could not write to data directory. " + ex.Message);
442  };
443 
444  DrawPerimeter = false;
446 
447  phone = new Phone();
448  Phone.Tombstoning = true;
449  }
450 
451  private void WindowResized( int oldWidth, int oldHeight, int newWidth, int newHeight )
452  {
453  if ( GraphicsDevice == null )
454  return;
455 
456  Viewport view = new Viewport( 0, 0, newWidth, newHeight );
457 
458  if ( Mouse != null )
459  Mouse.Viewport = view;
460 
461  if ( screen != null )
462  screen.viewPort = view;
463  }
464 
465  private void ShowErrorMessage(string message)
466  {
467  MessageDisplay.Add( "ERROR: " + message, Color.Red );
468 
469  /*bool mouseVisible = IsMouseVisible;
470  IsMouseVisible = true;
471 
472  MessageWindow errWindow = new MessageWindow( message );
473  errWindow.Color = Color.Red;
474  errWindow.Message.TextColor = Color.White;
475  errWindow.Closed += delegate { IsMouseVisible = mouseVisible; };
476  Add( errWindow );*/
477  }
478 
483  public void ShowMessageWindow( string message )
484  {
485  MessageWindow w = new MessageWindow( message );
486  Add( w );
487  }
488 
489  private void InitializeLayers()
490  {
491  Layers = new SynchronousList<Layer>( -3 );
492  Layers.ItemAdded += OnLayerAdded;
493  Layers.ItemRemoved += OnLayerRemoved;
494 
495  for ( int i = 0; i < 7; i++ )
496  {
497  Layers.Add( new Layer() );
498  }
499 
500  // This is the widget layer
501  Layers.Add( Layer.CreateStaticLayer() );
502 
503  Layers.UpdateChanges();
504  }
505 
506  private void InitializeContent()
507  {
508 #if WINDOWS_PHONE
509 
510  ResourceContent = new ResourceContentManager( this.Services, WindowsPhoneResources.ResourceManager );
511 #elif XBOX
512  ResourceContent = new ResourceContentManager( this.Services, XBox360Resources.ResourceManager );
513 #else
514  ResourceContent = new ResourceContentManager( this.Services, Resources.ResourceManager );
515 #endif
516 
517  Content.RootDirectory = "Content";
518  }
519 
520  private void InitializeGraphics( int device )
521  {
522 #if WINDOWS
523  if ( device == 1 )
524  GraphicsDeviceManager = new GraphicsDeviceManager( this );
525  else
526  GraphicsDeviceManager = new TargetedGraphicsDeviceManager( this, device );
527 #else
528  GraphicsDeviceManager = new GraphicsDeviceManager( this );
529 #endif
530  GraphicsDeviceManager.PreferredDepthStencilFormat = Jypeli.Graphics.SelectStencilMode();
531  SmoothTextures = true;
532  }
533 
534  private void ActivateObject( ControlContexted obj )
535  {
536  obj.ControlContext.Active = true;
537 
538  if ( obj.IsModal )
539  {
540  Game.Instance.ControlContext.SaveFocus();
542 
543  foreach ( Layer l in Layers )
544  {
545  foreach ( IGameObject lo in l.Objects )
546  {
548  if ( lo == obj || co == null )
549  continue;
550 
551  co.ControlContext.SaveFocus();
552  co.ControlContext.Active = false;
553  }
554  }
555  }
556  }
557 
558  private void DeactivateObject( ControlContexted obj )
559  {
560  obj.ControlContext.Active = false;
561 
562  if ( obj.IsModal )
563  {
564  Game.Instance.ControlContext.RestoreFocus();
565 
566  foreach ( Layer l in Layers )
567  {
568  foreach ( IGameObject lo in l.Objects )
569  {
571  if ( lo == obj || co == null )
572  continue;
573 
574  co.ControlContext.RestoreFocus();
575  }
576  }
577  }
578  }
579 
580  protected virtual void OnObjectAdded( IGameObject obj )
581  {
583  if ( iObj == null ) return;
584  iObj.IsAddedToGame = true;
585  iObj.OnAddedToGame();
586 
587  ControlContexted cObj = obj as ControlContexted;
588  if ( cObj != null ) ActivateObject( cObj );
589  }
590 
591  protected virtual void OnObjectRemoved( IGameObject obj )
592  {
594  if ( iObj == null ) return;
595  iObj.IsAddedToGame = false;
596  iObj.OnRemoved();
597 
598  ControlContexted cObj = obj as ControlContexted;
599  if ( cObj != null ) DeactivateObject( cObj );
600  }
601 
602  internal static void OnAddObject( IGameObject obj )
603  {
604  Debug.Assert( Instance != null );
605  Instance.OnObjectAdded( obj );
606  }
607 
608  internal static void OnRemoveObject( IGameObject obj )
609  {
610  Debug.Assert( Instance != null );
611  Instance.OnObjectRemoved( obj );
612  }
613 
614  private void OnLayerAdded( Layer l )
615  {
616  l.Objects.ItemAdded += this.OnObjectAdded;
617  l.Objects.ItemRemoved += this.OnObjectRemoved;
618  }
619 
620  private void OnLayerRemoved( Layer l )
621  {
622  l.Objects.ItemAdded -= this.OnObjectAdded;
623  l.Objects.ItemRemoved -= this.OnObjectRemoved;
624  }
625 
630  public static void AssertInitialized( Action actionMethod )
631  {
632  if ( Instance != null )
633  actionMethod();
634  else
635  InstanceInitialized += actionMethod;
636  }
637 
642  public static void DoNextUpdate( Action action )
643  {
644  if ( Instance != null )
645  Instance.PendingActions.Enqueue( action );
646  else
647  InstanceInitialized += action;
648  }
649 
656  public static void DoNextUpdate<T1>( Action<T1> action, T1 p1 )
657  {
658  DoNextUpdate( delegate { action( p1 ); } );
659  }
660 
669  public static void DoNextUpdate<T1, T2>( Action<T1, T2> action, T1 p1, T2 p2 )
670  {
671  DoNextUpdate( delegate { action( p1, p2 ); } );
672  }
673 
678  public static void AssertInitialized<T1>( Action<T1> actionMethod, T1 o1 )
679  {
680  if ( Instance != null )
681  actionMethod( o1 );
682  else
683  InstanceInitialized += delegate { actionMethod( o1 ); };
684  }
685 
691  public void Add( IGameObject o )
692  {
693  if ( o.Layer != null && o.Layer.Objects.WillContain( o ) )
694  {
695  if ( o.Layer == Layers[0] )
696  {
697  throw new NotSupportedException( "Object cannot be added twice" );
698  }
699  else
700  throw new NotSupportedException( "Object cannot be added to multiple layers" );
701  }
702 
703  if ( o is Widget ) Add( o, MaxLayer );
704  else Add( o, 0 );
705  }
706 
707 #if !WINDOWS_PHONE
708  public void Add( Light light )
713  {
714  if ( light == null ) throw new NullReferenceException( "Tried to add a null light to game" );
715 
716  if ( lights.Count >= 1 )
717  throw new NotSupportedException( "Only one light is supported" );
718 
719  lights.Add( light );
720  }
721 #endif
722 
728  public virtual void Add( IGameObject o, int layer )
729  {
730  if ( o == null ) throw new NullReferenceException( "Tried to add a null object to game" );
731  Layers[layer].Add( o );
732  }
733 
734  internal static IList<IGameObject> GetObjectsAboutToBeAdded()
735  {
736  List<IGameObject> result = new List<IGameObject>();
737 
738  foreach ( Layer layer in Game.Instance.Layers )
739  {
740  layer.GetObjectsAboutToBeAdded( result );
741  }
742 
743  return result;
744  }
745 
750  public void Add( Layer l )
751  {
752  Layers.Add( l );
753  Layers.UpdateChanges();
754  }
755 
764  public void Remove( IGameObject o )
765  {
766  if ( !o.IsAddedToGame )
767  return;
768 
769  foreach ( Layer l in Layers )
770  l.Remove( o );
771  }
772 
777  public void Remove( Layer l )
778  {
779  Layers.Remove( l );
780  Layers.UpdateChanges();
781  }
782 
789  public List<GameObject> GetObjects( Predicate<GameObject> condition )
790  {
791  List<GameObject> objs = new List<GameObject>();
792 
793  for ( int i = MaxLayer; i >= MinLayer; i-- )
794  {
795  foreach ( var obj in Layers[i].Objects )
796  {
797  GameObject gobj = obj as GameObject;
798 
799  if ( gobj != null && condition( gobj ) )
800  objs.Add( gobj );
801  }
802  }
803 
804  return objs;
805  }
806 
813  public List<GameObject> GetObjectsWithTag( params string[] tags )
814  {
815  return GetObjects( o => tags.Contains<string>( o.Tag as string ) );
816  }
817 
823  public GameObject GetFirstObject( Predicate<GameObject> condition )
824  {
825  for ( int i = MaxLayer; i >= MinLayer; i-- )
826  {
827  foreach ( var obj in Layers[i].Objects )
828  {
829  GameObject gobj = obj as GameObject;
830 
831  if ( gobj != null && condition( gobj ) )
832  return gobj;
833  }
834  }
835 
836  return null;
837  }
838 
844  public Widget GetFirstWidget( Predicate<Widget> condition )
845  {
846  return (Widget)GetFirstObject( obj => obj is Widget && condition( (Widget)obj ) );
847  }
848 
856  public List<GameObject> GetObjectsAt( Vector position )
857  {
858  return GetObjects( obj => obj.IsInside( position ) );
859  }
860 
868  public GameObject GetObjectAt( Vector position )
869  {
870  return GetFirstObject( obj => obj.IsInside( position ) && !(obj is MessageDisplay) );
871  }
872 
880  public Widget GetWidgetAt( Vector position )
881  {
882  return (Widget)GetFirstObject( obj => obj is Widget && obj.IsInside( position ) && !( obj is MessageDisplay ) );
883  }
884 
893  public List<GameObject> GetObjectsAt( Vector position, double radius )
894  {
895  Predicate<GameObject> isInsideRadius = delegate ( GameObject obj )
896  {
897  if ( obj is MessageDisplay ) return false;
898 
899  Vector positionUp = new Vector( position.X, position.Y + radius );
900  Vector positionDown = new Vector( position.X, position.Y - radius );
901  Vector positionLeft = new Vector( position.X - radius, position.Y );
902  Vector positionRight = new Vector( position.X + radius, position.Y );
903 
904  if ( obj.IsInside( position ) ) return true;
905  if ( obj.IsInside( positionUp ) ) return true;
906  if ( obj.IsInside( positionDown ) ) return true;
907  if ( obj.IsInside( positionLeft ) ) return true;
908  if ( obj.IsInside( positionRight ) ) return true;
909 
910  return false;
911  };
912 
913  return GetObjects( isInsideRadius );
914  }
915 
924  public GameObject GetObjectAt( Vector position, double radius )
925  {
926  var objs = GetObjectsAt( position, radius );
927  return objs.Count > 0 ? objs[0] : null;
928  }
929 
939  public List<GameObject> GetObjectsAt( Vector position, object tag )
940  {
941  return GetObjectsAt( position ).FindAll( obj => obj.Tag == tag );
942  }
943 
953  public GameObject GetObjectAt( Vector position, object tag )
954  {
955  return GetObjectsAt( position ).Find( obj => obj.Tag == tag );
956  }
957 
968  public List<GameObject> GetObjectsAt( Vector position, object tag, double radius )
969  {
970  return GetObjectsAt( position, radius ).FindAll<GameObject>( obj => obj.Tag == tag );
971  }
972 
983  public GameObject GetObjectAt( Vector position, object tag, double radius )
984  {
985  return GetObjectsAt( position, radius ).Find( obj => obj.Tag == tag );
986  }
987 
994  public List<GameObject> GetObjectsBetween( Vector pos1, Vector pos2 )
995  {
996  return GetObjects( obstacle => !( obstacle is Widget ) && obstacle.IsBlocking( pos1, pos2 ) );
997  }
998 
1004  public static Animation LoadAnimation( string name )
1005  {
1006  return Instance.Content.Load<Animation>( name );
1007  }
1008 
1014  public static Image LoadImage( string name )
1015  {
1016  return new Image( name );
1017  }
1018 
1024  public static Image[] LoadImages( params string[] names )
1025  {
1026  Image[] result = new Image[names.Length];
1027  for ( int i = 0; i < names.Length; i++ )
1028  result[i] = LoadImage( names[i] );
1029  return result;
1030  }
1031 
1040  public static Image[] LoadImages( string baseName, int startIndex, int endIndex, bool zeroPad = false )
1041  {
1042  if ( startIndex > endIndex ) throw new ArgumentException("Starting index must be smaller than ending index.");
1043 
1044  Image[] result = new Image[endIndex - startIndex];
1045  string format;
1046 
1047  if ( zeroPad )
1048  {
1049  int digits = endIndex.ToString().Length;
1050  format = "{0}{1:" + "0".Repeat( digits ) + "}";
1051  }
1052  else
1053  {
1054  format = "{0}{1}";
1055  }
1056 
1057  for ( int i = startIndex; i < endIndex; i++ )
1058  {
1059  string imgName = String.Format( format, baseName, i );
1060  result[i - startIndex] = LoadImage( imgName );
1061  }
1062 
1063  return result;
1064  }
1065 
1070  public static void PlaySound( string name )
1071  {
1072  LoadSoundEffect( name ).Play();
1073  }
1074 
1080  public static SoundEffect LoadSoundEffect( string name )
1081  {
1082  return new SoundEffect( name );
1083  }
1084 
1090  public static SoundEffect[] LoadSoundEffects( params string[] names )
1091  {
1092  SoundEffect[] result = new SoundEffect[names.Length];
1093  for ( int i = 0; i < names.Length; i++ )
1094  result[i] = LoadSoundEffect( names[i] );
1095  return result;
1096  }
1097 
1101  public void ClearTimers()
1102  {
1103  Timer.ClearAll();
1104  }
1105 
1109  public virtual void ClearAll()
1110  {
1111  Level.Clear();
1112  ResetLayers();
1113  ClearTimers();
1114 #if !WINDOWS_PHONE
1115  ClearLights();
1116 #endif
1117  ClearControls();
1118  GC.Collect();
1119  addMessageDisplay();
1121  Camera.Reset();
1122  }
1123 
1128  public void ResetLayers()
1129  {
1130  ClearGameObjects();
1131  InitializeLayers();
1132  }
1133 
1138  public void RemoveAllLayers()
1139  {
1140  ClearGameObjects();
1141  Layers.Clear();
1142  }
1143 
1147  public void ClearControls()
1148  {
1149  controls.Clear();
1150  TouchPanel.Clear();
1151  }
1152 
1156  public void ClearGameObjects()
1157  {
1158  foreach ( var layer in Layers )
1159  layer.Clear();
1160 
1161  addMessageDisplay();
1162  }
1163 
1164 #if !WINDOWS_PHONE
1165  public void ClearLights()
1166  {
1167  lights.Clear();
1168  }
1169 #endif
1170 
1174  protected virtual void PausedUpdate( Time time )
1175  {
1176  foreach ( var layer in Layers )
1177  {
1178  // Update the UI components only
1179  layer.Objects.Update( time, o => o is Widget );
1180  }
1181 
1182  Timer.UpdateAll( time, t => t.IgnorePause );
1183  }
1184 
1189  protected virtual void Update( Time time )
1190  {
1191  this.Camera.Update( time );
1192  Layers.Update( time );
1193  Timer.UpdateAll( time );
1194  UpdateHandlers( time );
1195 
1196  while (PendingActions.Count > 0)
1197  {
1198  PendingActions.Dequeue()();
1199  }
1200  }
1201 
1207  [EditorBrowsable( EditorBrowsableState.Never )]
1208  protected override void Initialize()
1209  {
1210  Jypeli.Graphics.Initialize();
1211  screen = new ScreenView( GraphicsDevice.Viewport );
1212 
1213 #if WINDOWS_PHONE
1214  Phone.ResetScreen();
1215 #else
1216  Point defaultSize = GetDefaultWindowSize();
1217  Window.Width = defaultSize.X;
1218  Window.Height = defaultSize.Y;
1219  Window.Update();
1220 #endif
1221 
1222  theLevel = new Level( this );
1223 
1224  MediaPlayer = new MediaPlayer( Content );
1225 
1226  addMessageDisplay();
1227  InitDebugScreen();
1228 
1229  base.Initialize();
1230  }
1231 
1236  [EditorBrowsable( EditorBrowsableState.Never )]
1237  protected override void LoadContent()
1238  {
1239  if ( !loadContentHasBeenCalled )
1240  {
1241  if ( InstanceInitialized != null )
1243 
1244 #if !WINDOWS_PHONE
1245  CallBegin();
1246 #endif
1247  loadContentHasBeenCalled = true;
1248  }
1249 
1250 #if DEBUG && !WINDOWS_PHONE
1251  MessageDisplay.Add( "F12 - Debug view" );
1252 #endif
1253  base.LoadContent();
1254 
1255  GC.Collect();
1256  }
1257 
1262  internal void CallBegin()
1263  {
1264  Begin();
1265  beginHasBeenCalled = true;
1266  }
1267 
1271  public virtual void Begin()
1272  {
1273  }
1274 
1279  public virtual void Continue()
1280  {
1281  }
1282 
1283  protected override void OnExiting( object sender, EventArgs args )
1284  {
1285  if ( Exiting != null )
1286  Exiting();
1287 
1288  base.OnExiting( sender, args );
1289  }
1290 
1291  private void addMessageDisplay()
1292  {
1295  Add( MessageDisplay );
1296  }
1297 
1298  [EditorBrowsable( EditorBrowsableState.Never )]
1299  protected override void Update( GameTime gameTime )
1300  {
1301  if ( !loadContentHasBeenCalled || !beginHasBeenCalled )
1302  {
1303  // No updates until both LoadContent and Begin have been called
1304  base.Update( gameTime );
1305  return;
1306  }
1307 
1308  Window.Update();
1309  currentRealTime.Advance( gameTime );
1310 
1311  if ( this.IsActive ) controls.Update();
1312  if ( DataStorage.IsUpdated )
1313  DataStorage.Update( currentRealTime );
1314 
1315  // The update in derived classes.
1316  if ( !IsPaused )
1317  {
1318  currentTime.Advance( gameTime );
1319  this.Update( currentTime );
1320  }
1321  else
1322  {
1323  this.PausedUpdate( currentRealTime );
1324  }
1325 
1326  UpdateDebugScreen( currentRealTime );
1327 
1328  base.Update( gameTime );
1329  }
1330 
1331  protected virtual void Paint( Canvas canvas )
1332  {
1333  }
1334 
1335  [EditorBrowsable( EditorBrowsableState.Never )]
1336  protected override void Draw( GameTime gameTime )
1337  {
1338  Time time = new Time( gameTime );
1339 
1340  GraphicsDevice.Clear( ClearOptions.Target, Level.Background.Color.AsXnaColor(), 1.0f, 0 );
1341 
1343  {
1344  SpriteBatch spriteBatch = Jypeli.Graphics.SpriteBatch;
1345  spriteBatch.Begin( SpriteSortMode.Deferred, BlendState.AlphaBlend );
1346  spriteBatch.Draw( Level.Background.Image.XNATexture, new XnaRectangle( 0, 0, (int)screen.Width, (int)screen.Height ), XnaColor.White );
1347  spriteBatch.End();
1348  }
1349 
1350  // The world matrix adjusts the position and size of objects according to the camera angle.
1351  var worldMatrix =
1352  Matrix.CreateTranslation( (float)-Camera.Position.X, (float)-Camera.Position.Y, 0 )
1353  * Matrix.CreateScale( (float)Camera.ZoomFactor, (float)Camera.ZoomFactor, 1f );
1354 
1355  // If the background should move with camera, draw it here.
1356  Level.Background.Draw( worldMatrix, Matrix.Identity );
1357 
1358  if ( DrawPerimeter )
1359  {
1360  Matrix m = Matrix.CreateScale( (float)Level.Width, (float)Level.Height, 1 ) * worldMatrix;
1361  Renderer.DrawRectangle( ref m, PerimeterColor );
1362  }
1363 
1364  foreach ( var layer in Layers )
1365  {
1366  layer.Draw( Camera );
1367  }
1368 
1369  Graphics.LineBatch.Begin( ref worldMatrix );
1370  Graphics.Canvas.Reset( Level );
1371  Paint( Graphics.Canvas );
1372  Graphics.LineBatch.End();
1373 
1374  DrawDebugScreen();
1375 
1376  base.Draw( gameTime );
1377  }
1378 
1385  [Obsolete( "Please set Window.Width, Window.Height and Window.Fullscreen instead." )]
1386  public bool SetWindowSize( int width, int height, bool fullscreen )
1387  {
1388  Window.Width = width;
1389  Window.Height = height;
1390  Window.Fullscreen = fullscreen;
1391  return true;
1392  }
1393 
1399  public bool SetWindowSize( int width, int height )
1400  {
1401  Window.Width = width;
1402  Window.Height = height;
1403  return true;
1404  }
1405 
1406  private Point GetDefaultWindowSize()
1407  {
1408  int xres = GraphicsDevice.DisplayMode.Width;
1409  int yres = GraphicsDevice.DisplayMode.Height;
1410 
1411 #if WINDOWS
1412  System.Drawing.Graphics graphics = System.Drawing.Graphics.FromHwnd(IntPtr.Zero);
1413  IntPtr hdc = graphics.GetHdc();
1414  int logicalScreenHeight = GetDeviceCaps(hdc, (int)DeviceCap.VERTRES);
1415  int physicalScreenHeight = GetDeviceCaps(hdc, (int)DeviceCap.DESKTOPVERTRES);
1416  graphics.ReleaseHdc(hdc);
1417  graphics.Dispose();
1418 
1419  float scaleFactor = (float)logicalScreenHeight / (float)physicalScreenHeight;
1420 
1421  xres = (int)(xres * scaleFactor);
1422  yres = (int)(yres * scaleFactor);
1423 
1424  int borderwidth = GetSystemMetrics( 32 ); // SM_CXFRAME
1425  int titleheight = GetSystemMetrics( 30 ); // SM_CXSIZE
1426  yres -= borderwidth + titleheight;
1427 #endif
1428 
1429  /*if ( xres > 1024 && yres > 768 ) return new Point( 1024, 768 );
1430  if ( xres > 800 && yres > 600 ) return new Point( 800, 600 );
1431 
1432  return new Point( 640, 480 );*/
1433 
1434  return new Point( xres, yres );
1435  }
1436 
1440  public void Pause()
1441  {
1442  IsPaused = !IsPaused;
1443  }
1444 
1448  public void Exit()
1449  {
1450  Phone.StopVibrating();
1451  base.Exit();
1452  }
1453 
1457  public void ConfirmExit()
1458  {
1459  bool cursorVisible = IsMouseVisible;
1460  IsMouseVisible = true;
1461 
1462  YesNoWindow kyselyIkkuna = new YesNoWindow( "Do you want to quit?" );
1463  kyselyIkkuna.Yes += Exit;
1464  kyselyIkkuna.Closed += delegate { IsMouseVisible = cursorVisible; IsPaused = false; };
1465  Add( kyselyIkkuna );
1466 
1467  IsPaused = true;
1468  }
1469 
1474  public void SaveGame( string tagName )
1475  {
1476  Type gameType = this.GetType();
1477  SaveState state = DataStorage.BeginSave( tagName );
1478 
1479  foreach ( PropertyInfo property in gameType.GetProperties( BindingFlags.GetProperty | StorageFile.AllOfInstance ) )
1480  {
1481  if ( property.GetCustomAttributes( typeof( SaveAttribute ), true ).Length == 0 )
1482  continue;
1483 
1484  object propValue = property.GetValue( this, null );
1485  Type propType = property.PropertyType;
1486  //DataStorage.Save( propValue, propType, tagName + FileManager.SanitizeFileName( property.Name ) );
1487  state.Save( propValue, propType, FileManager.SanitizeFileName( property.Name ) + "Property" );
1488  }
1489 
1490  foreach ( FieldInfo field in gameType.GetFields( BindingFlags.GetField | StorageFile.AllOfInstance ) )
1491  {
1492  if ( field.GetCustomAttributes( typeof( SaveAttribute ), true ).Length == 0 )
1493  continue;
1494 
1495  object fieldValue = field.GetValue( this );
1496  Type fieldType = field.FieldType;
1497  //DataStorage.Save( fieldValue, fieldType, tagName + FileManager.SanitizeFileName( field.Name ) );
1498  state.Save( fieldValue, fieldType, FileManager.SanitizeFileName( field.Name ) + "Field" );
1499  }
1500 
1501  state.EndSave();
1502  }
1503 
1508  public void LoadGame( string tagName )
1509  {
1510  if ( !DataStorage.Exists( tagName ) )
1511  return;
1512 
1513  Type gameType = this.GetType();
1514 
1515  LoadState state = DataStorage.BeginLoad( tagName );
1516 
1517  foreach ( PropertyInfo property in gameType.GetProperties( BindingFlags.GetProperty | StorageFile.AllOfInstance ) )
1518  {
1519  if ( property.GetCustomAttributes( typeof( SaveAttribute ), true ).Length == 0 )
1520  continue;
1521 
1522  object oldValue = property.GetValue( this, null );
1523  Type propType = property.PropertyType;
1524  //object newValue = DataStorage.Load( oldValue, propType, tagName + FileManager.SanitizeFileName( property.Name ) );
1525  object newValue = state.Load( oldValue, propType, FileManager.SanitizeFileName( property.Name ) + "Property" );
1526  property.SetValue( this, newValue, null );
1527  }
1528 
1529  foreach ( FieldInfo field in gameType.GetFields( BindingFlags.GetField | StorageFile.AllOfInstance ) )
1530  {
1531  if ( field.GetCustomAttributes( typeof( SaveAttribute ), true ).Length == 0 )
1532  continue;
1533 
1534  object oldValue = field.GetValue( this );
1535  Type fieldType = field.FieldType;
1536  //object newValue = DataStorage.Load( oldValue, fieldType, tagName + FileManager.SanitizeFileName( field.Name ) );
1537  object newValue = state.Load( oldValue, fieldType, FileManager.SanitizeFileName( field.Name ) + "Field" );
1538  field.SetValue( this, newValue );
1539  }
1540 
1541  state.EndLoad();
1542  }
1543 
1544  public void AddFactory<T>( string tag, Factory.FactoryMethod method )
1545  {
1546  Factory.AddFactory<T>( tag, method );
1547  }
1548 
1549  public void RemoveFactory<T>( string tag, Factory.FactoryMethod method )
1550  {
1551  Factory.RemoveFactory<T>( tag, method );
1552  }
1553 
1554  public T FactoryCreate<T>( string tag )
1555  {
1556  return Factory.FactoryCreate<T>( tag );
1557  }
1558 
1562  public void ShowControlHelp()
1563  {
1564  MessageDisplay.Add( "Ohjeet:" );
1565 
1566  foreach ( String message in controls.GetHelpTexts() )
1567  {
1568  MessageDisplay.Add( message );
1569  }
1570  }
1571 
1572  [EditorBrowsable( EditorBrowsableState.Never )]
1573  public void Dispose()
1574  {
1575  }
1576 
1582  private void BindControlHelp( params object[] keysOrButtons )
1583  {
1584  String nappaimet = "";
1585 
1586  foreach ( object o in keysOrButtons )
1587  {
1588  if ( o is Key )
1589  {
1590  Key k = (Key)o;
1591  controls.Keyboard.Listen( k, ButtonState.Pressed, ShowControlHelp, null );
1592 
1593  nappaimet += k.ToString();
1594  }
1595 
1596  if ( o is Button )
1597  {
1598  Button b = (Button)o;
1599  for ( int i = 0; i < controls.GameControllers.Length; i++ )
1600  {
1601  controls.GameControllers[i].Listen( b, ButtonState.Pressed, ShowControlHelp, null );
1602  }
1603 
1604  nappaimet += b.ToString();
1605  }
1606 
1607  nappaimet += " / ";
1608  }
1609 
1610  MessageDisplay.Add( "Katso näppäinohje painamalla " + nappaimet.Substring( 0, nappaimet.Length - 3 ) );
1611  }
1612 
1613  public static Image LoadImageFromResources( string name )
1614  {
1615  return new Image( ResourceContent.Load<Texture2D>( name ) );
1616  }
1617 
1618  public static SoundEffect LoadSoundEffectFromResources( string name )
1619  {
1620  return new SoundEffect( ResourceContent.Load<XnaSoundEffect>( name ) );
1621  }
1622 
1627  public static Font LoadFont( string name )
1628  {
1629  return new Font( name, ContentSource.GameContent );
1630  }
1631  }
1632 }
1633 
static void AssertInitialized< T1 >(Action< T1 > actionMethod, T1 o1)
Suorittaa aliohjelman kun peli on varmasti alustettu.
Definition: Game.cs:678
static Image LoadImage(string name)
Lataa kuvan contentista.
Definition: Game.cs:1014
Action< Exception > ReadAccessDenied
Definition: Assert.cs:11
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tähän luokkaan...
Definition: IGameObject.cs:84
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
PhoneBackButton PhoneBackButton
Back-nappi (Windows Phone 7)
Definition: Controls.cs:173
static bool SmoothTextures
Tekstuurien (kuvien) reunanpehmennys skaalattaessa (oletus päällä).
Definition: Game.cs:182
static Action InstanceInitialized
Tapahtuu kun Game.Instance on alustettu.
Definition: Game.cs:154
static Image LoadImageFromResources(string name)
Definition: Game.cs:1613
static void DoNextUpdate(Action action)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: Game.cs:642
GameObject GetFirstObject(Predicate< GameObject > condition)
Palauttaa ensimmäisen peliolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Game.cs:823
bool IsModal
Definition: Game.cs:222
virtual void Paint(Canvas canvas)
Definition: Game.cs:1331
void LoadGame(string tagName)
Lataa pelin.
Definition: Game.cs:1508
List< GameObject > GetObjectsBetween(Vector pos1, Vector pos2)
Palauttaa pelioliot kahden pisteen välillä.
Definition: Game.cs:994
GamePad ControllerFour
Peliohjain neljä.
Definition: Game.cs:280
static readonly string MyDocuments
Omat tiedostot.
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
Definition: Layer.cs:138
static readonly Color LightGray
Vaalea harmaa.
Definition: Color.cs:694
void ClearTimers()
Poistaa kaikki ajastimet.
Definition: Game.cs:1101
static readonly Color Red
Punainen.
Definition: Color.cs:804
void SaveGame(string tagName)
Tallentaa pelin.
Definition: Game.cs:1474
int MaxLayer
Suurin mahdollinen kerros.
Definition: Game.cs:125
Widget GetFirstWidget(Predicate< Widget > condition)
Palauttaa ensimmäisen ruutuolion joka toteuttaa ehdon (null jos mikään ei toteuta).
Definition: Game.cs:844
static readonly string DataPath
Ohjelman data-alihakemisto.
bool AcceptsFocus
Onko olio valittavissa. Vain valittu (fokusoitu) olio voii kuunnella näppäimistöä ja muita ohjainlait...
Definition: Game.cs:243
string Title
Teksti, joka näkyy pelin ikkunassa (jos peli ei ole koko ruudun tilassa).
Definition: Game.cs:332
bool IsPaused
Onko peli pysähdyksissä.
Definition: Game.cs:90
Fontti.
Definition: Font.cs:22
Sisältää ohjaimet.
Definition: Controls.cs:146
Action< Exception > WriteAccessDenied
Definition: Assert.cs:12
int MinLayer
Pienin mahdollinen kerros.
Definition: Game.cs:117
Sisältää näytön leveyden ja korkeuden sekä reunojen koordinaatit. Y-koordinaatti kasvaa ylöspäin...
Definition: View.cs:41
GameObject GetObjectAt(Vector position)
Palauttaa peliolion, joka on annetussa paikassa. Jos paikassa ei ole mitään pelioliota, palautetaan null. Jos olioita on useampia, palautetaan päällimmäinen.
Definition: Game.cs:868
void Reset()
Resetoi kameran (keskittää, laittaa zoomin oletusarvoon ja lopettaa seuraamisen). ...
Definition: Camera.cs:233
bool IsInside(Vector point)
Onko piste p tämän olion sisäpuolella.
List< GameObject > GetObjectsAt(Vector position)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa. Jos paikassa ei ole mitään pelioliota...
Definition: Game.cs:856
Listener Listen(Button button, ButtonState state, Handler handler, string helpText)
Definition: GamePad.cs:415
override void Initialize()
This gets called after the GraphicsDevice has been created. So, this is the place to initialize the r...
Definition: Game.cs:1208
double ZoomFactor
Kameran zoomauskerroin. Oletuksena 1.0. Mitä suurempi zoomauskerroin, sitä lähempänä kamera on (esim ...
Definition: Camera.cs:99
IList< Layer > StaticLayers
Kerrokset, joilla olevat pelioliot eivät liiku kameran mukana.
Definition: Game.cs:101
void Clear()
Palauttaa oletustaustan.
Definition: Level.cs:191
GameObject GetObjectAt(Vector position, object tag, double radius)
Palauttaa peliolion, joka on annetussa paikassa tietyllä säteellä. Vain annetulla tagilla varustetut ...
Definition: Game.cs:983
Game(int device)
Alustaa uuden peliluokan.
Definition: Game.cs:406
Mediasoitin, jolla voi soittaa musiikkikappaleita.
Definition: MediaPlayer.cs:13
object Tag
Definition: Tagged.cs:8
Ikkuna, joka kysyy käyttäjältä kyllä tai ei -kysymyksen.
Definition: YesNoWindow.cs:40
bool IsFullScreen
Onko peli kokoruututilassa.
Definition: Game.cs:352
void Remove(Layer l)
Poistaa oliokerroksen pelistä.
Definition: Game.cs:777
Ääniefekti. Yhdestä efektistä voi luoda CreateSound-metodilla monta ääntä (Sound), jotka voivat soida yhtäaikaa. Ääntä ei tarvitse kuitenkaan luoda itse, jos vain kutsuu Play-metodia.
Definition: SoundEffect.cs:15
virtual void Continue()
Tässä alustetaan peli tombstoning-tilasta. Jos metodia ei ole määritelty, kutsutaan Begin...
Definition: Game.cs:1279
List< String > GetHelpTexts()
Palauttaa kaikki ohjaimien ohjetekstit listana.
Definition: Controls.cs:259
virtual void PausedUpdate(Time time)
Ajetaan Updaten sijaan kun peli on pysähdyksissä.
Definition: Game.cs:1174
bool Play()
Soittaa äänen.
Definition: SoundEffect.cs:101
Accelerometer Accelerometer
Kiihtyvyysanturi (Windows Phone 7)
Definition: Controls.cs:163
delegate object FactoryMethod()
void UpdateHandlers(Time time)
Kutsuu tapahtumankäsittelijöitä.
Definition: Events.cs:130
TouchPanel TouchPanel
Kosketusnäyttö (Windows Phone 7)
Definition: Controls.cs:168
Kosketuspaneeli.
Definition: TouchPanel.cs:48
Image Image
Olion kuva. Voi olla null, jolloin piirretään vain väri.
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
void ClearControls()
Palauttaa kontrollit alkutilaansa.
Definition: Game.cs:1147
static Game Instance
Definition: Game.cs:149
virtual void Add(IGameObject o, int layer)
Lisää peliolion peliin, tiettyyn kerrokseen.
Definition: Game.cs:728
Käyttöliittymän komponentti.
Definition: Appearance.cs:9
WindowHandler Closed
Tapahtuu kun ikkuna suljetaan.
Definition: Window.cs:96
delegate void ResizeEvent(int oldWidth, int oldHeight, int newWidth, int newHeight)
Tapahtumatyyppi ikkunan koon muutokselle.
GamePad ControllerOne
Peliohjain yksi.
Definition: Game.cs:265
List< GameObject > GetObjects(Predicate< GameObject > condition)
Palauttaa listan kaikista peliolioista jotka toteuttavat ehdon. Lista on järjestetty päällimmäisestä ...
Definition: Game.cs:789
static readonly Vector Zero
Nollavektori.
Definition: Vector.cs:61
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
Kamera. Määrittää mikä osa pelitasosta on kerralla näkyvissä.
Definition: Camera.cs:42
void Draw(Matrix parentTransformation, Matrix transformation)
Definition: Background.cs:224
void Add(string message)
Lisää uuden viestin näkymään.
Kuva.
Definition: Image.cs:24
bool MovesWithCamera
Liikkuuko taustakuva kameran mukana vai ei.
Definition: Background.cs:62
Aliohjelmia ja ominaisuuksia, jotka toimivat vain puhelimessa. Voidaan kutsua myös PC:lle käännettäessä, ...
Definition: Phone.cs:60
static SoundEffect LoadSoundEffectFromResources(string name)
Definition: Game.cs:1618
void ShowMessageWindow(string message)
Näyttää viesti-ikkunan.
Definition: Game.cs:483
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
virtual void Begin()
Tässä alustetaan peli.
Definition: Game.cs:1271
Puhelimen kiihtyvyysanturi.
double Height
Näytön korkeus y-suunnassa.
Definition: View.cs:74
Action Yes
Tapahtuu kun käyttäjä valitsee "kyllä"-vaihtoehdon.
Definition: YesNoWindow.cs:45
static Time RealTime
Todellinen peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja ...
Definition: Game.cs:319
void Clear()
Tyhjentää kaikki kontrollit.
Definition: Controls.cs:280
static Image [] LoadImages(string baseName, int startIndex, int endIndex, bool zeroPad=false)
Lataa taulukon kuvia contentista.
Definition: Game.cs:1040
List< GameObject > GetObjectsWithTag(params string[] tags)
Palauttaa listan kaikista peliolioista joilla on tietty tagi. Lista on järjestetty päällimmäisestä al...
Definition: Game.cs:813
Contains graphics resources.
Definition: Graphics.cs:36
IList< Layer > DynamicLayers
Kerrokset, joilla olevat pelioliot liikkuvat kameran mukana.
Definition: Game.cs:109
Näppäimistö peliohjaimena.
Definition: Keyboard.cs:41
void ClearGameObjects()
Tuhoaa ja poistaa pelistä kaikki pelioliot (ml. fysiikkaoliot).
Definition: Game.cs:1156
void AddFactory< T >(string tag, Factory.FactoryMethod method)
Definition: Game.cs:1544
Game()
Alustaa uuden peliluokan.
Definition: Game.cs:397
Pelikenttä, johon voi lisätä olioita. Kentällä voi myös olla reunat ja taustaväri tai taustakuva...
Definition: Level.cs:78
override void Draw(GameTime gameTime)
Definition: Game.cs:1336
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Game.cs:95
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Game.cs:194
Vector Position
Kameran sijainti.
Definition: Camera.cs:56
double Y
Definition: Vector.cs:275
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
void ConfirmExit()
Kysyy haluaako lopettaa pelin ja lopettaa jos vastataan kyllä.
Definition: Game.cs:1457
GamePad [] GameControllers
Peliohjaimet 1-4.
Definition: Controls.cs:180
Button
Definition: Button.cs:34
static Font LoadFont(string name)
Lataa fontin. Fontin tulee olla lisätty content-hakemistoon.
Definition: Game.cs:1627
Color PerimeterColor
Väri, jolla kentän reunat piirretään.
Definition: Game.cs:177
static Vector Wind
Tuuli. Vaikuttaa vain efekteihin
Definition: Game.cs:326
Pistemäinen valonlähde.
Definition: Light.cs:34
MediaPlayer MediaPlayer
Mediasoitin.
Definition: Game.cs:360
override void Update(GameTime gameTime)
Definition: Game.cs:1299
Background Background
Kentän taustakuva.
Definition: Level.cs:111
Hiiri peliohjaimena.
Definition: Mouse.cs:46
ListenContext ControlContext
Pelin pääohjainkonteksti.
Definition: Game.cs:217
Phone Phone
Phone-olio esim. puhelimen tärisyttämiseen.
Definition: Game.cs:292
static void DoNextUpdate< T1, T2 >(Action< T1, T2 > action, T1 p1, T2 p2)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: Game.cs:669
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:36
double X
Definition: Vector.cs:274
double Height
Kentän korkeus.
Definition: Level.cs:126
void Pause()
Pysäyttää pelin tai jatkaa sitä, jos se on jo pysäytetty.
Definition: Game.cs:1440
void Add(Layer l)
Lisää oliokerroksen peliin.
Definition: Game.cs:750
T FactoryCreate< T >(string tag)
Definition: Game.cs:1554
static new GraphicsDevice GraphicsDevice
Definition: Game.cs:368
Level Level
Aktiivinen kenttä.
Definition: Game.cs:299
void RemoveFactory< T >(string tag, Factory.FactoryMethod method)
Definition: Game.cs:1549
override void OnExiting(object sender, EventArgs args)
Definition: Game.cs:1283
Xbox-peliohjain.
Definition: GamePad.cs:43
void ResetLayers()
Nollaa oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Game.cs:1128
static new Action Exiting
Tapahtuu kun peli lopetetaan.
Definition: Game.cs:159
List< GameObject > GetObjectsAt(Vector position, object tag, double radius)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Game.cs:968
bool DrawPerimeter
Kentän reunat näkyvissä tai pois näkyvistä. Huomaa, että tämä ominaisuus ei vaikuta reunojen törmäysk...
Definition: Game.cs:172
Listener Listen(Key k, ButtonState state, Handler handler, String helpText)
Definition: Keyboard.cs:292
Ajastin, joka voidaan asettaa laukaisemaan tapahtumia tietyin väliajoin.
Definition: Timer.cs:39
Väri.
Definition: Color.cs:13
static void PlaySound(string name)
Soittaa ääniefektin.
Definition: Game.cs:1070
static string Name
Pelin nimi.
Definition: Game.cs:140
static SoundEffect LoadSoundEffect(string name)
Lataa ääniefektin contentista.
Definition: Game.cs:1080
double Width
Kentän leveys.
Definition: Level.cs:117
int LayerCount
Kerrosten määrä.
Definition: Game.cs:133
virtual void OnObjectAdded(IGameObject obj)
Definition: Game.cs:580
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:14
GamePad ControllerThree
Peliohjain kolme.
Definition: Game.cs:275
void Remove(IGameObject o)
Poistaa olion pelistä. Jos haluat tuhota olion, kutsu mielummin olion Destroy-metodia.
Definition: Game.cs:764
Sarja kuvia, jotka vaihtuvat halutulla nopeudella. Yksi animaatio koostuu yhdestä tai useammasta kuva...
Definition: Animation.cs:56
GamePad ControllerTwo
Peliohjain kaksi.
Definition: Game.cs:270
List< GameObject > GetObjectsAt(Vector position, double radius)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Game.cs:893
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana, ja sen paikka ja koko ilmaistaan suhteessa tähän olioon.
bool IsInside(Vector point)
Luokka, joka sisältää metodeita kuvioiden ja tekstuurien piirtämiseen 2D-tasossa. ...
Definition: Renderer.cs:51
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan. Jos listalle lisätään IUpdatable-rajapinnan toteuttavia olioita, kutsutaan myös niiden Update-metodeja samalla.
Piirtoalusta.
Definition: Canvas.cs:38
static Time Time
Peliaika. Sisältää tiedon siitä, kuinka kauan peliä on pelattu (Time.SinceStartOfGame) ja kuinka kaua...
Definition: Game.cs:309
Camera Camera
Kamera, joka näyttää ruudulla näkyvän osan kentästä. Kameraa voidaan siirtää, zoomata tai asettaa seu...
Definition: Game.cs:166
static void DoNextUpdate< T1 >(Action< T1 > action, T1 p1)
Suorittaa aliohjelman seuraavalla päivityksellä.
Definition: Game.cs:656
virtual void ClearAll()
Nollaa kaiken.
Definition: Game.cs:1109
bool Tombstoning
Tallennetaanko pelin tilanne jos ruutu sammutetaan, vaihdetaan ohjelmaa tms.
Definition: Phone.cs:164
override void LoadContent()
XNA calls this when graphics resources need to be loaded. Note that this can be called multiple times...
Definition: Game.cs:1237
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
virtual void Update(Time time)
Peliolion päivitys. Tätä kutsutaan, kun IsUpdated-ominaisuuden arvoksi on asetettu true ja olio on li...
virtual void Update(Time time)
Ajetaan kun pelin tilannetta päivitetään. Päivittämisen voi toteuttaa perityssä luokassa toteuttamall...
Definition: Game.cs:1189
static readonly Color DarkGray
Tumma harmaa.
Definition: Color.cs:569
Ikkuna, joka sisältää käyttäjän määrittelemän viestin ja OK-painikkeen. Ikkunan koko määräytyy automa...
Key
Näppäimistön näppäin.
Definition: Key.cs:37
Color BackgroundColor
Tekstin taustaväri.
List< GameObject > GetObjectsAt(Vector position, object tag)
Palauttaa listan peliolioista, jotka ovat annetussa paikassa tietyllä säteellä. Jos paikassa ei ole m...
Definition: Game.cs:939
void ShowControlHelp()
Näyttää kontrollien ohjetekstit.
Definition: Game.cs:1562
void Dispose()
Definition: Game.cs:1573
void ClearLights()
Definition: Game.cs:1165
GameObject GetObjectAt(Vector position, object tag)
Palauttaa peliolion, joka on annetussa paikassa. Vain annetulla tagilla varustetut oliot huomioidaan...
Definition: Game.cs:953
2D-vektori.
Definition: Vector.cs:56
MessageDisplay MessageDisplay
Viestinäyttö, johon voi laittaa viestejä.
Definition: Game.cs:230
void StopVibrating()
Lopettaa puhelimen värinän.
Definition: Phone.cs:103
Windows Phonen Back-nappi
bool SetWindowSize(int width, int height, bool fullscreen)
Asettaa ikkunan koon.
Definition: Game.cs:1386
void Exit()
Lopettaa pelin.
Definition: Game.cs:1448
double Width
Näytön leveys x-suunnassa.
Definition: View.cs:66
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
static Image [] LoadImages(params string[] names)
Lataa taulukon kuvia contentista.
Definition: Game.cs:1024
static void AssertInitialized(Action actionMethod)
Suorittaa aliohjelman kun peli on varmasti alustettu.
Definition: Game.cs:630
virtual void OnObjectRemoved(IGameObject obj)
Definition: Game.cs:591
void RemoveAllLayers()
Poistaa kaikki oliokerrokset. Huom. tuhoaa kaikki pelioliot!
Definition: Game.cs:1138
override void Clear()
Definition: TouchPanel.cs:147
static SoundEffect [] LoadSoundEffects(params string[] names)
Lataa taulukon ääniefektejä contentista.
Definition: Game.cs:1090
Keyboard Keyboard
Näppäimistö.
Definition: Controls.cs:153
Widget GetWidgetAt(Vector position)
Palauttaa ruutuolion, joka on annetussa paikassa. Jos paikassa ei ole mitään oliota, palautetaan null. Jos olioita on useampia, palautetaan päällimmäinen.
Definition: Game.cs:880
Usein käytettyjä polkuja Windowsissa.
static Animation LoadAnimation(string name)
Lataa animaation contentista.
Definition: Game.cs:1004
object Tag
Vapaasti asetettava muuttuja.
bool SetWindowSize(int width, int height)
Asettaa ikkunan koon.
Definition: Game.cs:1399
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).
GameObject GetObjectAt(Vector position, double radius)
Palauttaa peliolion, joka on annetussa paikassa tietyllä säteellä. Jos paikassa ei ole mitään pelioli...
Definition: Game.cs:924
Mouse Mouse
Hiiri.
Definition: Controls.cs:158