Forum www.warsztatgames.fora.pl Strona Główna www.warsztatgames.fora.pl
WarsztatGames
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Połączenie edytora z slinikiem.

 
Napisz nowy temat   Odpowiedz do tematu    Forum www.warsztatgames.fora.pl Strona Główna -> Edytor
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Will
Administrator



Dołączył: 20 Sty 2012
Posty: 83
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Sob 19:16, 25 Lut 2012    Temat postu: Połączenie edytora z slinikiem.

Prosty kod dla połączenia edytora z silnikiem. Na svn wrzuciłem low level kod tego rozwiązania.

Ogólnie na wyższej warstwie abstrakcji mamy:

Kod:
   void processMessage( WPackage& package )
   {
      switch (package.msgType)
      {
      case 2:
         {

      //ustawiamy okno
         }break;


      case MT_RENDERVIEWRESIZED:
         {
         //w edytorze zmieniono rozmiar okna widoku
         }break;


      case MT_VISIBLECHANGED:
         {
            //analogicznie

         }break;

      case MT_MOUSEBUTTONUP:
         {
            //…

         }break;

      case MT_MOUSEBUTTONDOWN:
         {
            //..
            

         }break;


      case MT_MOUSEMOVE:
         {
            //..

         }break;


      case MT_KEYDOWN:
         {
            //..
         }break;

      case MT_KEYUP:
         {
            //..
         }break;



      case MT_WNDACTIVESTATE:
         {
            //..
            
         }break;

   



      }

      SAFE_DELETE_ARRAY(package.pData)
   }



Np: taka funkcja w silniku przyjmuje wiadomości od edytora.

A tak to może wyglądać od strony c#:

Kod:
 public enum MsgType
    {
        MT_CLIENTID=0,
        MT_CONSOLEMSG=5,
        MT_RENDERVIEWRESIZED=4,
        MT_VISIBLECHANGED=6,
        MT_MOUSEMOVE=7,
        MT_KEYDOWN=8,
        MT_KEYUP=9,
        MT_WNDACTIVESTATE=10,
        MT_MOUSEINSIDE=11,
        MT_MOUSEBUTTONDOWN = 12,
        MT_MOUSEBUTTONUP=13
    }

 
    public class WindowEvents
    {
        public NetworkHandling handler;
        private WPackage package = new WixPackage();
        private mouseInfo mousePos = new mouseInfo();
        private InegerData intData = new InegerData();
 

        public WindowEvents()
        {
            package.length = 1;
        }

        public void sizeChanged()
        {
            package.msgType = (UInt32)MsgType.MT_RENDERVIEWRESIZED;
            package.length = 1;
           
            handler.sendPackage(package);
        }

        public void visibleChanged(Boolean visible)
        {
            package.msgType = (UInt32)MsgType.MT_VISIBLECHANGED;
            package.pData =(UInt32)(visible==true?1:0);
            package.length = 1;

            handler.sendPackage(package);
        }

   

        public void renderWndActive(bool active)
        {
            package.msgType = (UInt32)MsgType.MT_WNDACTIVESTATE;
            package.sender = (UInt32)(active == true ? 1 : 0);
            package.length = 1;
            handler.sendPackage(package);
        }

        public void mouseMove(Position pos)
        {
            package.msgType = (UInt32)MsgType.MT_MOUSEMOVE;
            package.length = sizeof(Int32) * 2;
            package.sender = 1;

            mousePos.mousePos = pos;
            handler.sendPackage(package, mousePos);

        }


        public void keyDown(Keys key)
        {
            package.msgType = (UInt32)MsgType.MT_KEYDOWN;
            package.length = 4;
            package.sender = 1;


            package.pData = 0;
            intData.integer=(Int32)key;
           
            handler.sendPackage(package,intData);
        }


        public void keyUp(Keys key)
        {
            package.msgType = (UInt32)MsgType.MT_KEYUP;
            package.length = 4;
            package.sender = 1;


            package.pData = 0;
            intData.integer = (Int32)key;

            handler.sendPackage(package, intData);
        }



        /*
         *
         * */
        public void mouseDown(MouseEventArgs e)
        {
            package.msgType = (UInt32)MsgType.MT_MOUSEBUTTONDOWN;
            package.length = 1;

            if(e.Button==MouseButtons.Left)
            {
                package.sender = 0;
            }
            else if (e.Button==MouseButtons.Right)
            {
                package.sender = 1;
            }
           

            handler.sendPackage(package);
        }



        /*
        *
        * */
        public void mouseUp(MouseEventArgs e)
        {
            package.msgType = (UInt32)MsgType.MT_MOUSEBUTTONUP;
            package.length = 1;

            if (e.Button == MouseButtons.Left)
            {
                package.sender = 1;
            }
            else if (e.Button == MouseButtons.Right)
            {
                package.sender =2;
            }


            handler.sendPackage(package);
        }

    }


gdzie samo połączenie:

Kod:
public class NetworkHandling
    {
        private UInt32 id = 1;
        private byte[] m_pBuffer = new byte[64000];
        private Socket m_SocketObject = null;
        private const Int32 maxSize = 64000;

        public Boolean connectToRenderer()
        {
            m_SocketObject = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

            System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse("10.1.1.35");
            System.Net.IPEndPoint remoteEP = new System.Net.IPEndPoint(ipAdd, 6000);

            try
            {
                m_SocketObject.Connect(remoteEP);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
            m_SocketObject.Blocking = false;
            return true;
        }

        public WPackageHolder getPackageBase(UInt32 readhead)
        {
            unsafe
            {


                WPackageHolder p = new WpackageHolder();
                using (MemoryStream m = new MemoryStream(m_pBuffer, (int)readhead, (int)sizeof(WPackage)))
                {
                    using (BinaryReader read = new BinaryReader(m))
                    {
                        p.msgType = read.ReadUInt32();
                        p.sender = read.ReadUInt32();
                        p.length = read.ReadUInt32();
                        p.pData = (void*)read.ReadUInt32();
                    }
                }

                return p;
            }
        }

        public Boolean receivePackage(ArrayList package)
        {
            unsafe
            {

                int index = 0;
                int startTickCount = Environment.TickCount;
                int n = 0; 
                int bytesRead = 0;
                bool done = false;
                while (done == false)
                {

                    try
                    {
                        bytesRead += m_SocketObject.Receive(m_pBuffer, n, (maxSize - n), SocketFlags.Partial);
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.WouldBlock ||
                            ex.SocketErrorCode == SocketError.IOPending ||
                            ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                        {
                           
                            done = true;
                        }
                        else
                            return false; 
                    }

                    if (bytesRead <= 0) done = true;
                    else
                    {
                        bytesRead += n;
                        UInt32 readHead = 0;

                        while ((bytesRead - readHead) > sizeof(WPackage))
                        {
                            WPackageHolder h = getPackageBase(readHead);



                            UInt32 pckSizeTotal = (uint)sizeof(WPackage) + h.length;

                            if ((bytesRead - readHead) >= pckSizeTotal)
                            {

                                index++;
                                h.data = new byte[h.length];
                                Array.Copy(m_pBuffer, readHead + sizeof(WPackage), h.data, 0, h.length);
                                package.Add(h);


                                readHead += pckSizeTotal;
                            }
                            else
                            {
                                Array.Copy(m_pBuffer, readHead, m_pBuffer, 0, bytesRead - readHead);
                                n = (int)(bytesRead - readHead);
                                break;
                            }

                        }

                        if (bytesRead < maxSize) done = true;
                    }

                }
            }
            return true;
        }

        public Boolean sendPackage(WPackage package, SendObject sendObject=null)
        {
            unsafe
            {


                Int32 size = (Int32)(sizeof(WPackage) + package.length);
                if (size > maxSize) return false;

                using (MemoryStream m = new MemoryStream())
                {
                    using (BinaryWriter writer = new BinaryWriter(m))
                    {
                        writer.Write(package.msgType);
                        writer.Write(package.sender);
                        writer.Write(package.length);
                        writer.Write((UInt32)package.pData);

                        Array.Copy(m.ToArray(), m_pBuffer, sizeof(WPackage));
                        if(sendObject!=null)sendObject.convertToBytes(m_pBuffer);
                    }
                }

                try
                {

                    Int32 sent = 0;
                    Int32 totalSize = (int)(sizeof(WixPackage) + package.length);
                    sent = m_SocketObject.Send(m_pBuffer, totalSize, SocketFlags.None);

                    while (sent < totalSize)
                    {
                        sent += m_SocketObject.Send(m_pBuffer, sent, totalSize - sent, SocketFlags.None);
                    }

                }
                catch (System.Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }



            }
            return true;

        }


    }


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.warsztatgames.fora.pl Strona Główna -> Edytor Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin