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

    [C#] Xna: stop and run di un Game via Windows.Form

    Si lo so il titolo non è dei più intuitivi ma non ho saputo fare di meglio...
    Il problema è semplice (sulla carta) ma nn mi riesce: ho un Game Xna che all'inizio presenta un form da gestire; alla chiusura del form parte il Game che deve mostrare insieme al suo output anche il form che mostra in una label il valore di una grandezza che si aggiorna nell'Update() del Game.
    E fin qui ci siamo.
    Sul form c'è un button che se premuto (mentre il Game corre) deve fare ripartire il Game dall'inizio (un nuovo "run") e qui nn ci siamo, perchè mi spuntano due "form1" uno fermo e l'altro che continua fregandosene altamente e se chiudo il secondo form1 il programma mi va in errore ("Impossibile avviare un secondo ciclo di messaggi su un thread singolo. Utilizzare Form.ShowDialog.").
    Come posso fare?


    codice:
    using System;
    using System.Windows.Forms;
    
    namespace WindowsGame
    {
     
        static class Program
        {
            public static Form1 form1;
            public static void Main(string[] args)
            {
                form1 = new Form1();
                form1.ShowDialog();
                using (Game1 game = new Game1())
                {
                    game.Run();
                }
            }
        }
     
    }
    codice:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;
    using System.Windows.Forms;
    
    namespace WindowsGame
    {
     
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            public int x = 0;
            public static Form1 form1;
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }
     
            protected override void Initialize()
            {
                form1 = new Form1();
                form1.Show();
                base.Initialize();
            }
     
            protected override void Update(GameTime gameTime)
            {
                x++;
                form1.label1.Text = x.ToString();
                
                base.Update(gameTime);
            }
     
            protected override void Draw(GameTime gameTime)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);
                 
                base.Draw(gameTime);
            }
        }
    }
    Ah dentro il button1_Click ho messo questa riga:

    Program.Main(null);
    Ultima modifica di escocat; 01-03-2015 a 23:34

  2. #2
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Ho risolto utilizzando solo il form1 in Game. A quanto mi è dato di capire non si può "runnare" un Game dal suo codice interno, quindi ho creato una specie di metodo "relay" all'inizio di Update(). Questo metodo legge una variabile bool (una sorta di "allarme") che se false va avanti senza fare nulla e se true rievoca tutti i metodi in Initialize() e LoadContent() che "potrebbero" aver subìto variazioni (presumendo che nel costruttore Game sia stato scritto solo codice altamente immutabile). Funziona alla grande.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.