Will
Administrator
Dołączył: 20 Sty 2012
Posty: 83
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysł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
|
|