FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「SDL」 文字描画

using System;
using SDL2;

namespace Project1
{
internal static class Program
{
private static void Main()
{
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG);
SDL_ttf.TTF_Init();

Program.Start();

SDL.SDL_Quit();
SDL_image.IMG_Quit();
SDL_ttf.TTF_Quit();
}

private static void Start()
{
IntPtr window = SDL.SDL_CreateWindow("表示テスト", 100, 100, 600, 600, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);
//描画に必要
IntPtr renderer = SDL.SDL_CreateRenderer(window, 0, 0);

//SDL_ttf.TTF_OpenFont 関数
//第一引数 読み込むフォントを指定
//第二引数 フォントサイズを指定
IntPtr font = SDL_ttf.TTF_OpenFont("test.ttf", 30);

//フォントと表示する文字列と色を指定しSurfaceを作成
//(Texureではないのでこれだけでは描画されません)
IntPtr surface = SDL_ttf.TTF_RenderText_Solid(font, "表示テスト", new SDL.SDL_Color());
//SurfaceをTexureに変換(これで文字列の描画の準備ができました)
IntPtr image = SDL.SDL_CreateTextureFromSurface(renderer, surface);

//画像描画に必要
SDL.SDL_Rect rect0 = new SDL.SDL_Rect();
SDL.SDL_Rect rect1 = new SDL.SDL_Rect();
//画像サイズを調べるのに必要
SDL.SDL_Surface imageData=new SDL.SDL_Surface();


SDL.SDL_Event e = new SDL.SDL_Event();

while (true)
{
SDL.SDL_PollEvent(out e);

switch (e.type)
{
case SDL.SDL_EventType.SDL_QUIT:
return;
}

//描画色の指定(今回は黒を指定)
//第二引数はR値
//第三引数はG値
//第四引数はB値
SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
//↑で指定した色で塗りつぶし
SDL.SDL_RenderClear(renderer);

uint format = 0;
int access = 0;

//画像サイズを調べる
//第一引数に調べたい画像のポインタを指定
SDL.SDL_QueryTexture(image, out format, out access, out imageData.w, out imageData.h);

//画像をどこから描画するかを指定
rect0.x = 20;
rect0.y = 20;
//画像をどこまで描画するかを指定
rect0.w = imageData.w;
rect0.h = imageData.h;

//描画する場所
rect1.x = 30;
rect1.y = 30;
//描画サイズ
rect1.w = imageData.w;
rect1.h = imageData.h;

//文字列を画像として描画
SDL.SDL_RenderCopy(renderer, image, ref rect0, ref rect1);

//描画したものを表示
SDL.SDL_RenderPresent(renderer);


SDL.SDL_Delay(100);
}

//使用したオブジェクトの破棄
SDL_ttf.TTF_CloseFont(font); //使用したフォント
SDL.SDL_FreeSurface(surface); //使用したSurface
SDL.SDL_DestroyTexture(image); //使用した画像

SDL.SDL_DestroyRenderer(renderer);
SDL.SDL_DestroyWindow(window);

font = IntPtr.Zero;
surface = IntPtr.Zero;
image = IntPtr.Zero;
window = IntPtr.Zero;
renderer = IntPtr.Zero;

}
}
}
スポンサーサイト

「SDL」 画像の描画

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SDL2;

namespace Project1
{
class Program
{
static void Main()
{
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG);
SDL_ttf.TTF_Init();

Program.Start();

SDL.SDL_Quit();
SDL_image.IMG_Quit();
SDL_ttf.TTF_Quit();
}

static void Start()
{
IntPtr window = SDL.SDL_CreateWindow("表示テスト", 100, 100, 600, 600, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);
//描画に必要
IntPtr renderer = SDL.SDL_CreateRenderer(window, 0, 0);

//画像の読込(今回はtest.pngを読込)
IntPtr image = SDL_image.IMG_LoadTexture(renderer, "test.png");
//画像描画に必要
SDL.SDL_Rect rect0 = new SDL.SDL_Rect();
SDL.SDL_Rect rect1 = new SDL.SDL_Rect();
//画像サイズを調べるのに必要
SDL.SDL_Surface imageData=new SDL.SDL_Surface();


SDL.SDL_Event e = new SDL.SDL_Event();

while (true)
{
SDL.SDL_PollEvent(out e);

switch (e.type)
{
case SDL.SDL_EventType.SDL_QUIT:
return;
}

//描画色の指定(今回は黒を指定)
//第二引数はR値
//第三引数はG値
//第四引数はB値
SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
//↑で指定した色で塗りつぶし
SDL.SDL_RenderClear(renderer);

uint format = 0;
int access = 0;

//画像サイズを調べる
//第一引数に調べたい画像のポインタを指定
SDL.SDL_QueryTexture(image, out format, out access, out imageData.w, out imageData.h);

//画像をどこから描画するかを指定
rect0.x = 20;
rect0.y = 20;
//画像をどこまで描画するかを指定
rect0.w = imageData.w;
rect0.h = imageData.h;

//描画する場所
rect1.x = 30;
rect1.y = 30;
//描画サイズ
rect1.w = imageData.w;
rect1.h = imageData.h;

//画像の表示(今回はtest.pngを表示)
SDL.SDL_RenderCopy(renderer, image, ref rect0, ref rect1);

//描画したものを表示
SDL.SDL_RenderPresent(renderer);


SDL.SDL_Delay(100);
}

//使用したオブジェクトの破棄
SDL.SDL_DestroyRenderer(renderer);
SDL.SDL_DestroyWindow(window);

window = IntPtr.Zero;
renderer = IntPtr.Zero;
}
}
}

「SDL」 描画準備

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SDL2;

namespace Project1
{
class Program
{
static void Main()
{
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG);
SDL_ttf.TTF_Init();

Program.Start();

SDL.SDL_Quit();
SDL_image.IMG_Quit();
SDL_ttf.TTF_Quit();
}

static void Start()
{
IntPtr window = SDL.SDL_CreateWindow("表示テスト", 100, 100, 300, 300, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);
//描画に必要
IntPtr renderer = SDL.SDL_CreateRenderer(window, 0, 0);


SDL.SDL_Event e = new SDL.SDL_Event();

while (true)
{
SDL.SDL_PollEvent(out e);

switch (e.type)
{
case SDL.SDL_EventType.SDL_QUIT:
return;
}

//描画色の指定(今回は黒を指定)
//第二引数はR値
//第三引数はG値
//第四引数はB値
SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
//↑で指定した色で塗りつぶし
SDL.SDL_RenderClear(renderer);

/*
ここに描画処理を記述していく
*/

//描画したものを表示
SDL.SDL_RenderPresent(renderer);


SDL.SDL_Delay(100);
}

//使用したオブジェクトの破棄
SDL.SDL_DestroyRenderer(renderer);
SDL.SDL_DestroyWindow(window);

window = IntPtr.Zero;
renderer = IntPtr.Zero;
}
}
}

「SDL」 イベント処理の定義

using SDL2;
using System;

namespace DreamFinale.Game
{
internal static class Program
{
//SDLの初期化ができたかどうかを判定
private static bool baseInit = false;
private static bool imageInit = false;
private static bool ttfInit = false;

private static void Main()
{
try
{
//SDLの初期化
if (SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING) == 0)
{
Program.baseInit = true;
}
else
{
throw new Exception();
}

//SDL_imageの初期化
if (SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG) == 0)
{
Program.imageInit = true;
}
else
{
throw new Exception();
}

//SDL_ttfの初期化
if (SDL_ttf.TTF_Init() == 0)
{
Program.ttfInit = true;
}
else
{
throw new Exception();
}

//SDL・SDL_image・SDL_ttfが初期化できたら実行
Program.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
//SDLの終了
if (Program.imageInit)
{
Program.imageInit = false;
SDL_image.IMG_Quit();
}
//SDL_imageの終了
if (Program.ttfInit)
{
Program.ttfInit = false;
SDL_ttf.TTF_Quit();
}
//SDL_ttfの終了
if (Program.baseInit)
{
Program.baseInit = false;
SDL.SDL_Quit();
}
}

}

///
/// 画面の表示開始
///

private static void Start()
{
//ウィンドウ左上に表示する文字列
const string caption = "表示テスト";
//ウィンドウの位置
const int x = 100;
const int y = 100;
//ウィンドウの大きさ
const int width = 300; //横幅
const int height = 300; //縦幅

//ウィンドウの表示
IntPtr window = SDL.SDL_CreateWindow(caption, x, y, width, height, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);

//ウィンドウが表示できなかった時に例外を出して終了
if (window == IntPtr.Zero) throw new Exception();

//イベント定義用
SDL.SDL_Event e = new SDL.SDL_Event(); //イベント定義に必須
bool loop = true; //メッセージループ用変数

//メッセージループ
while (loop)
{
//イベントを取得
SDL.SDL_PollEvent(out e);

//イベント実行
switch (e.type)
{
/*
* ここに必要なイベント実行処理を記述していく
*/

//終了イベント(必須)
case SDL.SDL_EventType.SDL_QUIT:
loop = false; //ループを抜ける
break;
}

//待ち時間をミリ秒単位で指定
SDL.SDL_Delay(1000 / 30);
}


//ウィンドウの破棄
SDL.SDL_DestroyWindow(window);
window = IntPtr.Zero;

}
}
}

「SDL」 実行に必要なこと

using System;
using SDL2;

namespace Project1
{
class Project
{
static void Main()
{
//SDLの初期化
if(SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING) < 0)
{
//SDLの初期化に失敗した時、すぐに終了
throw new Exception();
}

//SDLの終了
SDL.SDL_Quit();

}
}
}

c# SDLの実行に必要なファイルまとめ


c# SDL2の実行の為の準備

下のページにあるSDL2# - https://github.com/flibitijibibo/SDL2-CS をクリックし、zipファイルを展開。
srcフォルダの中にある、SDL2.cs内のクラスSDLの定数nativeLibNameの値を必要に応じて変更後、
(初期状態では"SDL2.dll"となっているので、変更しない場合は必ず、実行ファイルと同じディレクトリに置きましょう)

プロジェクトをビルドし、SDL-CS.dllを作成してください(このDLLは、c#で参照するため、必須です)
https://www.libsdl.org/languages.php

そして以下のページにあるzipの中のdllが必要です
各種zipファイルをダウンロードしてください

↓のSDL2-2.0.3-win32-x86.zip (32-bit Windows)をダウンロード(これは必ず必要です)
https://www.libsdl.org/download-2.0.php

↓ SDL2_image-2.0.0-win32-x86.zip (32-bit Windows)をダウンロード(画像描画に必要です)
https://www.libsdl.org/projects/SDL_image/

↓ SDL2_ttf-2.0.12-win32-x86.zip (32-bit Windows)をダウンロード(文字列描画に必要です)
https://www.libsdl.org/projects/SDL_ttf/

↓SDL2_mixer-2.0.0-win32-x86.zip (32-bit Windows)をダウンロード(音声ファイル実行に必要です)
http://www.libsdl.org/projects/SDL_mixer/

これでc#でSDLが使えるようになります

「SharpDX」 DirectX9 文字列の描画

using System;
using System.Threading;
using SD = System.Drawing;
using DXWin = SharpDX.Windows;
using DX = SharpDX;
using DX9 = SharpDX.Direct3D9;

namespace Project1
{
internal static class Program
{
private static void Main()
{
const int width = 600;
const int height = 600;

DXWin.RenderForm form = new DXWin.RenderForm();
form.ClientSize = new SD.Size(width, height);

//DirectX9を使用するための設定1
DX9.PresentParameters pp = new DX9.PresentParameters(width, height); //描画バッファのサイズを指定
pp.Windowed = true; //フルスクリーンの場合はfalse、フルスクリーンにしない場合はtrue
pp.SwapEffect = DX9.SwapEffect.Discard;
pp.BackBufferCount = 1;
pp.DeviceWindowHandle = form.Handle; //描画先のウィンドウハンドル

//DirectX9を使用するための設定2
DX9.Direct3D direct = new DX9.Direct3D();
DX9.Device device = new DX9.Device(direct, 0, DX9.DeviceType.Hardware, form.Handle, DX9.CreateFlags.HardwareVertexProcessing, pp);

//フォント描画の準備
DX9.Sprite sprite=new DX9.Sprite(device);
SD.Font sdFont = new SD.Font("MS Gothic", 30); //使用するフォントの用意
DX9.Font font3d = new DX9.Font(device, sdFont); //DirectX9用フォント作成

DXWin.RenderLoop.Run(form, () =>
{
//描画開始
device.BeginScene();
device.Clear(DX9.ClearFlags.Target, DX.Color.Gray, 1, 0); //灰色で塗りつぶし
sprite.Begin(DX9.SpriteFlags.AlphaBlend);

//文字列の拡大率も指定可能
sprite.Transform = DX.Matrix.Scaling(1, 1, 0);

//文字列描画
font3d.DrawText(sprite, "表示テスト", 10, 100, DX.Color.Aqua); //座標X:10・y:100に”表示テスト”の文字を水色で描画


//描画終了
sprite.End();
device.EndScene();
device.Present();

Thread.Sleep(100);
});
}
}
}

「SharpDX」 DirectX9 拡大率の指定

using System;
using System.Threading;
using SD = System.Drawing;
using DXWin = SharpDX.Windows;
using DX = SharpDX;
using DX9 = SharpDX.Direct3D9;

namespace Project1
{
internal static class Program
{
private static void Main()
{
const int width = 600;
const int height = 600;

DXWin.RenderForm form = new DXWin.RenderForm();
form.ClientSize = new SD.Size(width, height);

//DirectX9を使用するための設定1
DX9.PresentParameters pp = new DX9.PresentParameters(width, height); //描画バッファのサイズを指定
pp.Windowed = true; //フルスクリーンの場合はfalse、フルスクリーンにしない場合はtrue
pp.SwapEffect = DX9.SwapEffect.Discard;
pp.BackBufferCount = 1;
pp.DeviceWindowHandle = form.Handle; //描画先のウィンドウハンドル

//DirectX9を使用するための設定2
DX9.Direct3D direct = new DX9.Direct3D();
DX9.Device device = new DX9.Device(direct, 0, DX9.DeviceType.Hardware, form.Handle, DX9.CreateFlags.HardwareVertexProcessing, pp);

//画像を描画するための準備
DX9.Sprite sprite = new DX9.Sprite(device);
DX9.Texture image1 = DX9.Texture.FromFile(device, "test.png");

DXWin.RenderLoop.Run(form, () =>
{
//描画開始
device.BeginScene();
device.Clear(DX9.ClearFlags.Target, DX.Color.Gray, 1, 0); //灰色で塗りつぶし

//画像描画に必須
sprite.Begin(DX9.SpriteFlags.AlphaBlend);

//Draw関数を呼び出す前に必ず使用
//
//DX.Matrix.Scaling関数 拡大率の指定
//引数全てfloat型
//
//第一引数 横方向の拡大率
//第二引数 縦方向の拡大率
sprite.Transform = DX.Matrix.Scaling(2, 2, 0);


//画像描画
sprite.Draw(image1, DX.Color.White, null, null, new DX.Vector3(20, 20, 0));

//画像の描画の終了
sprite.End();

//描画終了
device.EndScene();
device.Present();

Thread.Sleep(100);
});
}
}
}

「SharpDX」 DirectX9 画像の描画

using System;
using System.Threading;
using SD = System.Drawing;
using DXWin = SharpDX.Windows;
using DX = SharpDX;
using DX9 = SharpDX.Direct3D9;

namespace Project1
{
internal static class Program
{
private static void Main()
{
const int width = 600;
const int height = 600;

DXWin.RenderForm form = new DXWin.RenderForm();
form.ClientSize = new SD.Size(width, height);

//DirectX9を使用するための設定1
DX9.PresentParameters pp = new DX9.PresentParameters(width, height); //描画バッファのサイズを指定
pp.Windowed = true; //フルスクリーンの場合はfalse、フルスクリーンにしない場合はtrue
pp.SwapEffect = DX9.SwapEffect.Discard;
pp.BackBufferCount = 1;
pp.DeviceWindowHandle = form.Handle; //描画先のウィンドウハンドル

//DirectX9を使用するための設定2
DX9.Direct3D direct = new DX9.Direct3D();
DX9.Device device = new DX9.Device(direct, 0, DX9.DeviceType.Hardware, form.Handle, DX9.CreateFlags.HardwareVertexProcessing, pp);

//画像を描画するための準備
DX9.Sprite sprite = new DX9.Sprite(device);
DX9.Texture image1 = DX9.Texture.FromFile(device, "test.png"); //画像の読込。大きさは自動補正される
DX9.Texture image2 = DX9.Texture.FromFile(device, "test.png", 250, 250, 0, DX9.Usage.None, DX9.Format.A16B16G16R16F, DX9.Pool.Managed, DX9.Filter.Default, DX9.Filter.Default, 0); //画像の読込。大きさは手動指定(今回は250×250)


DXWin.RenderLoop.Run(form, () =>
{
//描画開始
device.BeginScene();
device.Clear(DX9.ClearFlags.Target, DX.Color.Gray, 1, 0); //灰色で塗りつぶし

//画像描画に必須
sprite.Begin(DX9.SpriteFlags.AlphaBlend);

//画像描画

//Draw関数の説明
//第一引数 描画に使用するテクスチャ
//第二引数 塗りつぶしの色(DX.Color.Whiteで塗りつぶしはしない)
//第三引数 画像の描画範囲(全体を描画する際はnull指定)
//第四引数 描画中心点。正の数で左や上に寄る。負の数で右や下に寄る(必要ない場合はnull指定)
//第五引数 描画の位置(null指定で左上に描画)
sprite.Draw(image1, DX.Color.White, null, null, new DX.Vector3(100, 100, 0));
sprite.Draw(image2, DX.Color.Wheat, new DX.Rectangle(0, 20, 250, 250), new DX.Vector3(-100, -100, 0), new DX.Vector3(10, 10, 0));

//画像の描画の終了
sprite.End();


//描画終了
device.EndScene();
device.Present();

Thread.Sleep(100);
});
}
}
}

「SharpDX」 DirectX9 背景の塗りつぶし

using System;
using System.Threading;
using SD = System.Drawing;
using DXWin = SharpDX.Windows;
using DX = SharpDX;
using DX9 = SharpDX.Direct3D9;

namespace Project1
{
internal static class Program
{
private static void Main()
{
const int width = 600;
const int height = 600;

DXWin.RenderForm form = new DXWin.RenderForm();
form.ClientSize = new SD.Size(width, height);

//DirectX9を使用するための設定1
DX9.PresentParameters pp = new DX9.PresentParameters(width, height); //描画バッファのサイズを指定
pp.Windowed = true; //フルスクリーンの場合はfalse、フルスクリーンにしない場合はtrue
pp.SwapEffect = DX9.SwapEffect.Discard;
pp.BackBufferCount = 1;
pp.DeviceWindowHandle = form.Handle; //描画先のウィンドウハンドル

//DirectX9を使用するための設定2
DX9.Direct3D direct = new DX9.Direct3D();
DX9.Device device = new DX9.Device(direct, 0, DX9.DeviceType.Hardware, form.Handle, DX9.CreateFlags.HardwareVertexProcessing, pp);


DXWin.RenderLoop.Run(form, () =>
{
//描画開始
device.BeginScene();
device.Clear(DX9.ClearFlags.Target, DX.Color.Gray, 1, 0); //灰色で塗りつぶし

//描画終了
device.EndScene();
device.Present();


Thread.Sleep(100);
});
}
}
}
プロフィール

みにおん

Author:みにおん
c#でゲームを作る人です
web小説なども書いています

低学歴で馬鹿なのパート従業員
ですが、よろしく

相互リンク・ブロとも募集中です
コメントなどご自由にどうぞ

ホームページを見る
Twitter(個人ページ)
PIXIV(個人ページ)

○自作ゲーム一覧
ふりーむ
フリーゲーム夢幻
100%ふりげストア

・web小説
最後の時の夢

最新記事
最新コメント
月別アーカイブ
カテゴリ
ブロとも一覧
検索フォーム
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
リンク
アクセスランキング
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。