Skip to content

他のアプリとの連係

Reputeless edited this page Aug 30, 2016 · 1 revision

他の Siv3D アプリとの連係

サーバー (Siv3D)

# include <Siv3D.hpp>

void Main()
{
    TCPServer server;
    server.startAccept(50000);
    Point friendPos(0, 0);

    Window::SetTitle(L"TCPServer: 接続待機中...");

    while (System::Update())
    {
        if (server.isConnected())
        {
            Window::SetTitle(L"TCPServer: 接続完了!");

            server.send(Mouse::Pos());

            while (server.read(friendPos));
        }

        if (server.hasError())
        {
            server.disconnect();

            Window::SetTitle(L"TCPServer: 再接続待機中...");

            server.startAccept(50000);
        }

        Circle(Mouse::Pos(), 30).draw(Palette::Skyblue);

        Circle(friendPos, 10).draw(Palette::Orange);
    }
}

クライアント (Siv3D)

# include <Siv3D.hpp>

void Main()
{
    TCPClient client;
    client.connect(IPv4::localhost(), 50000);
    Point friendPos(0, 0);

    Window::SetTitle(L"TCPClient: 接続待機中...");

    while (System::Update())
    {
        if (client.isConnected())
        {
            Window::SetTitle(L"TCPClient: 接続完了!");

            client.send(Mouse::Pos());

            while (client.read(friendPos));
        }

        if (client.hasError())
        {
            client.disconnect();

            Window::SetTitle(L"TCPClient: 再接続待機中...");

            client.connect(IPv4::localhost(), 50000);
        }

        Circle(Mouse::Pos(), 30).draw(Palette::Skyblue);

        Circle(friendPos, 10).draw(Palette::Orange);
    }
}

Processing アプリとの連係

サーバー (Siv3D)

# include <Siv3D.hpp>

void Main()
{
	TCPServer server;

	server.startAccept(50000);
	
	Window::SetTitle(L"TCPServer: 接続待機中...");

	Point p5Pos(0, 0);

	while (System::Update())
	{
		if (server.isConnected())
		{
			Window::SetTitle(L"TCPServer: 接続完了!");

			server.send(Mouse::Pos());

			while (server.read(p5Pos));
		}

		if (server.hasError())
		{
			server.disconnect();

			Window::SetTitle(L"TCPServer: 再接続待機中...");

			server.startAccept(5500);
		}

		Circle(Mouse::Pos(), 30).draw(Palette::Skyblue);

		Circle(p5Pos, 10).draw(Palette::Orange);
	}
}

クライアント (Processing)

import processing.net.*;
import java.nio.ByteBuffer;

Client client;
int x = 0, y = 0;

void WriteInt8(char value)
{
	client.write(value);
}

void WriteInt16(short value)
{
	client.write(ByteBuffer.allocate(2).putShort(Short.reverseBytes(value)).array());
}

void WriteInt32(int value)
{
	client.write(ByteBuffer.allocate(4).putInt(Integer.reverseBytes(value)).array());
}

void WriteInt64(long value)
{
	client.write(ByteBuffer.allocate(8).putLong(Long.reverseBytes(value)).array());
}

void WriteFloat(float value)
{
	WriteInt32(Float.floatToRawIntBits(value));
}

void WriteDouble(double value)
{
	WriteInt64(Double.doubleToRawLongBits(value));
}

char ReadInt8()
{
	return client.readChar();
}

short ReadInt16()
{
	return Short.reverseBytes(ByteBuffer.wrap(client.readBytes(2)).getShort());
}

int ReadInt32()
{
	return Integer.reverseBytes(ByteBuffer.wrap(client.readBytes(4)).getInt());
}

long ReadInt64()
{
	return Long.reverseBytes(ByteBuffer.wrap(client.readBytes(8)).getLong());
}

float ReadFloat()
{
	return Float.intBitsToFloat(ReadInt32());
}

double ReadDouble()
{
	return Double.longBitsToDouble(ReadInt64());
}

void setup()
{
	size(640, 480);

	noStroke();

	client = new Client(this, "127.0.0.1", 50000); 
}

void draw()
{
	background(0);

	WriteInt32((int)mouseX); 

	WriteInt32((int)mouseY);

	if(client.available() >= 8)
	{
		x = ReadInt32();
		y = ReadInt32();
	}

	ellipse(mouseX, mouseY, 40, 40);

	ellipse(x, y, 40, 40);
}

パイプによる通信

標準入出力を行うコンソールアプリケーションと通信ができます。PipeServer から起動したアプリケーションは通常は非表示で実行されます。

# include <Siv3D.hpp>

/* [クライアント]
# include <iostream>
# include <string>
# include <sstream>

int main()
{
	std::string input;

	while (std::getline(std::cin, input))
	{
		if (input == "quit")
		{
			return 0;
		}

		int a, b;

		std::stringstream{ input } >> a >> b;

		std::cout << a * b << '\n';
	}

	std::cout << "error\n";
}
*/

void Main()
{
	// クライアントのコンソールアプリケーションを選択
	const auto path = Dialog::GetOpen({ { L"実行ファイル (*.exe)", L"*.exe" } });

	if (!path)
	{
		return;
	}

	// クライアントを起動
	PipeServer server(path.value());

	if (!server)
	{
		return;
	}
	//
	///////////////////////////////////

	while (System::Update())
	{
		if (Input::KeyA.clicked)
		{
			Print(L"10*2=");

			server.write("10 2\n");
		}

		if (Input::KeyB.clicked)
		{
			Print(L"3*4=");

			server.write("3 4\n");
		}

		if (server.available())
		{
			std::string str;

			server.read(str);

			Print(Widen(str));
		}
	}

	server.write("quit\n");
}

Siv3D について

  1. Siv3D の基本
  2. 図形を描く
  3. テクスチャを描く
  4. テキストを描く
  5. 文字列と数値の変換
  6. キーボード入力
  7. マウス入力
  8. サウンドの再生
  9. MIDI の再生
  10. ウィンドウと背景
  11. 図形のあたり判定
  12. 乱数
  13. ダイアログ
  14. ドラッグ & ドロップ
  15. アプリの状態
  16. テキストファイル
  17. INI, CSV, JSON
  18. バイナリファイル
  19. GUI
  20. アセット管理
  21. 画像編集
  22. Web カメラ
  23. マイク入力
  24. 経過時間の測定
  25. HSV カラー
  26. ファイルダウンロード
  27. 3D 描画
  28. 2D のレンダーステート
  29. 3D のレンダーステート
  30. パーティクル
  31. スクリーンショット
  32. アプリケーションの公開
  33. さらに学ぶには

表現テクニック集

入出力デバイス

開発のヒント

Clone this wiki locally