Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308

    [C#] Xna 4.0 come uscire dal Game in una classe che eredita

    Ciao. Ho fatto un esperimento con due oggetti, uno che si muove con la tastiera e uno no.
    Ho voluto provare la programmazione OOP con l'ereditarietà e tutto va bene. Lavoro sempre in VB, ma per abbracciare un pubblico più vasto (ed aumentare la probabilità di ricevere aiuti) posto il codice in C#
    L'oggetto 'y' che NON si muove con la tastiera l'ho creato con una classe "generica" GameObject (allego il file GameObject.cs)


    codice:
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    
    namespace oop
    {
        class GameObject
        {
            public Vector2 pos { get; set; }
            public Texture2D spr { get; set; }
    
    
            public GameObject()
            {
               this.pos = Vector2.Zero;
            }
     
            public GameObject(Vector2 val )
            {
               this.pos = val;
            }
    
    
            public void Draw(SpriteBatch s ) 
            {
                s.Draw (this.spr, this.pos, Color.White);
            }
        }
    
    }
    L'oggetto 'x' che si muove con la tastiera lo creo con una classe GameMoveableObject che faccio ereditare da GameObject e che in più contiene l'input da tastiera. Questo è il file:

    codice:
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    
    namespace oop
    {
        class GameMoveableObject : GameObject
        {
    
            public void KeybInput()
            {
                KeyboardState k = Keyboard.GetState();
                if (k.IsKeyDown(Keys.Escape))
                {
                    /* VOGLIO USCIRE!  
                       this.Exit? 
                       base.Exit? 
                       Game1.Exit? 
                       Game.Exit? 
                       Program.Exit? */  
                }
                else if (k.IsKeyDown(Keys.Right))
                    this.pos += new Vector2(1, 0);
                else if (k.IsKeyDown(Keys.Left))
                    this.pos += new Vector2(-1, 0);
                else if (k.IsKeyDown(Keys.Up))
                    this.pos += new Vector2(0, -1);
                else if (k.IsKeyDown(Keys.Down))
                    this.pos += new Vector2(0, 1);
            }
    
            public GameMoveableObject()
            {
                base.pos = Vector2.Zero;
            }
     
            public GameMoveableObject(Vector2 val )
            {
                base.pos = val;
            }
        }
    }
    e questa è la classe Game1:

    codice:
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    
    namespace oop
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            private GraphicsDeviceManager g;
            private SpriteBatch s; 
            private GameMoveableObject x ;
            private GameObject y ;
    
            public Game1()
            {
                g = new GraphicsDeviceManager(this);
                g.PreferredBackBufferWidth = 1000;
                g.PreferredBackBufferHeight = 500;
                Content.RootDirectory = "Content";
            }
    
            protected override void Initialize()
            {
                x = new GameMoveableObject(new Vector2(450, 450));
                y = new GameObject(new Vector2(450, 350));
                base.Initialize();
            }
    
            protected override void LoadContent()
            {
                s = new SpriteBatch(GraphicsDevice);
                x.spr = Content.Load<Texture2D>("x");
                y.spr = Content.Load<Texture2D>("y");
    
            }
    
            protected override void UnloadContent()
            {
            }
    
            protected override void Update(GameTime t)
            {
                x.KeybInput(); 
                base.Update(t);
            }
    
            protected override void Draw(GameTime t)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);
                s.Begin();
                x.Draw(s);
                y.Draw(s);
                s.End();
    
                base.Draw(t);
            }
        }
    }
    Il problema è che premendo ESC vorrei uscire dal gioco, e questo lo vorrei scrivere dentro la classe GameMoveableObject.
    Come si fa? Ma si può fa?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Avrei risolto in un modo OSCENO
    Se premo il tasto ESC dentro la classe GameMoveableObject gli faccio fare una divisione per 0
    Di sicuro esce.......

  3. #3
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    L'errore è di concetto..

    l'input di un gioco deve essere gestito dal gioco stesso che poi si proccuperà di inviarlo ai vari oggetti.

    ti faccio un esempio: se nel tuo gioco vuoi inserire una funzionalità che alla pressione di "F1" cambia lo sfondo del gioco? dove gestisci la cosa? nell'oggetto che si muove?

    Vedi che è il concetto che è sbagliato?

    Comunque, se non vuoi cambiare il tuo codice, se dichiari un evento nell'oggetto che si muove e lo scateni alla pressione di "esc", se la classe Game1 è in ascolto pui chiudere tutto da li.

    Lascia stare le eccezioni non gestite per carità

  4. #4
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Si sono d'accordo su quello che dici, i miei sono solo esperimenti perchè sto imparando Xna (e pure C#, che comincia a piacermi più di VB!)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.