FC2ブログ

スポンサーサイト

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

配列とループ文を使った条件分岐

配列とループ文を使った条件分岐を書いて
Qiitaに投稿しました

ソースコードを見る
スポンサーサイト

Qiitaに登録しました

 Qiitaというサービスに登録してみました

 今までコードはブログにのせていたのですが、
インデントされなくて読みにくいし、なんかコードが一部抜けてるということに今日気づいたので、
Qiitaに登録しました

 コードをのせるなら、
ブログにのせるのが楽なんですが、
これからはQiitaにのせてみようと思いました

 初投稿記事

 記事作るのは初めてだからか大変でしたが
慣れたらもう少し記事を楽に作れるようになるだろうか

「SDL2」色調を用いて、画像の色違いを表現してみるサンプル「C#」

/*

使用言語 C#

SDL2の色調を用いて、
画像の色違いを表現してみるサンプル


画像が8ビットの時専用?の方法なことに注意

画像が32ビットの時はできない?らしいので注意



〇ソースコードを少し変更しました

8ビット形式以外の画像を読み込んだ時に例外を出すように変更

また、ブログにコードを載せた際に、一部のコードが抜け落ちていたので、
少しコードを修正

*/

using System;
using System.Collections.Generic;
using System.IO;
using SDL2;

namespace Test {
static class Program {
static void Main() {
try {
InitSDL();
Start();
QuitSDL();
}
catch {
QuitSDL();
}
}

static void InitSDL() {
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_PNG);
}
static void QuitSDL() {
SDL.SDL_Quit();
SDL_image.IMG_Quit();
}

static void Start() {
var window = SDL.SDL_CreateWindow("画像色変えテスト",
SDL.SDL_WINDOWPOS_CENTERED, SDL.SDL_WINDOWPOS_CENTERED,
300, 300,
SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN);
var renderer = SDL.SDL_CreateRenderer(window,
-1,
SDL.SDL_RendererFlags.SDL_RENDERER_ACCELERATED);

var textureAry = CreateTextureList(renderer);
var colorArgs = CreateArrayColorArgs(textureAry.Length);

while (true) {
var e = new SDL.SDL_Event();

SDL.SDL_PollEvent(out e);

if (e.type == SDL.SDL_EventType.SDL_QUIT) break;

//描画内容の初期化
SDL.SDL_RenderClear(renderer);
//描画の開始
for (var i = 0; i < textureAry.Length; i++) {
//テクスチャの描画
RenderTexture(renderer, textureAry[i], colorArgs[i]);
}
//描画の初期化
SDL.SDL_RenderPresent(renderer);

SDL.SDL_Delay(1000 / 30);
}
}

//画像が8ビット形式かをチェック
static unsafe void CheckImageTypeBit8(SDL.SDL_PixelFormat* format) {
if (format->BitsPerPixel != 8) {
throw new Exception("画像が8ビットでありません");
}
}

//描画用テクスチャのリストを作る
static unsafe IntPtr[] CreateTextureList(IntPtr renderer) {
//テクスチャ用配列の宣言
var texture_ary = default(IntPtr[]);

//画像サーフェスを読み込み
//(今回は、「test.png」を読み込みます)
var surface_p = SDL_image.IMG_Load("test.png");

//画像サーフェスのデータを取得
var surface = (SDL.SDL_Surface*)surface_p;
var format = (SDL.SDL_PixelFormat*)surface->format;

//画像が8ビット形式かをチェック
CheckImageTypeBit8(format);

//画像サーフェスのカラーパレットデータを取得
var pallete = (SDL.SDL_Palette*)format->palette;
var colors = (SDL.SDL_Color*)pallete->colors;

//テクスチャ用配列を作成
texture_ary = new IntPtr[pallete->ncolors];
//サーフェスの色データのコピー
var colorArray = CreateColorDataCopy(pallete);


//画像サーフェスで使われている色の数だけループが実行される
for (var i = 0; i < pallete->ncolors; i++) {
//サーフェスを色ごとに分割するためのループ
for (var n = 0; n < pallete->ncolors; n++) {
//サーフェスの色データをすべて白にする
ColorPtrWhiteOut(colors, n);
//違う色の部分は、透明にしておく
//こうして、サーフェスを色ごとに分割できる
if (i != n) ColorPtrHide(colors, n);
}

//切り分けたテクスチャの追加
texture_ary[i] = SDL.SDL_CreateTextureFromSurface(renderer, surface_p);
//サーフェスの色データを元に戻す
ResetColorPtr(colorArray, pallete);
}

//使い終わったサーフェスは削除しよう
SDL.SDL_FreeSurface(surface_p);

return texture_ary;
}
static unsafe void ColorPtrWhiteOut(SDL.SDL_Color* colorPtr, int index) {
//テクスチャの色を白にしておく
//こうすることで、色調を使うことでどんな色にも変化させられる
colorPtr[index].r = byte.MaxValue;
colorPtr[index].g = byte.MaxValue;
colorPtr[index].b = byte.MaxValue;
}
static unsafe void ColorPtrHide(SDL.SDL_Color* colorPtr, int index) {
//違う色の部分は透明にしておく
//そうしないと、画像の全域が同じ色で表示されてしまう
colorPtr[index].a = byte.MinValue;
}

//サーフェスの色データのコピーを作る
//
//サーフェスの色データをいじるので、
//元に戻すための配列コピーは必要
static unsafe SDL.SDL_Color[] CreateColorDataCopy(SDL.SDL_Palette* pallete) {
var colors = new SDL.SDL_Color[pallete->ncolors];

for (var i = 0; i < colors.Length; i++) {
colors[i] = ((SDL.SDL_Color*)pallete->colors)[i];
}

return colors;
}
//サーフェスのパレットカラーを元に戻す
static unsafe void ResetColorPtr(SDL.SDL_Color[] colors, SDL.SDL_Palette* pallete) {

for (var n = 0; n < pallete->ncolors; n++) {
((SDL.SDL_Color*)pallete->colors)[n] = colors[n];
}
}

//テクスチャの描画
static void RenderTexture(IntPtr renderer, IntPtr texture, SDL.SDL_Color color) {
//必ずブレンドモードにすること!
//(ブレンドモードにしないと、正しく表示されないことがあるため)
SDL.SDL_SetTextureBlendMode(texture, SDL.SDL_BlendMode.SDL_BLENDMODE_BLEND);
//テクスチャの色を指定する
SDL.SDL_SetTextureColorMod(texture, color.r, color.g, color.b);
//テクスチャの描画
SDL.SDL_RenderCopy(renderer, texture, IntPtr.Zero, IntPtr.Zero);
}
//乱数を使って色を指定しています
//
//もちろん、乱数を使わずに色指定してもよい
static SDL.SDL_Color[] CreateArrayColorArgs(int length) {
var rand = new Random();

var colorArgs = new SDL.SDL_Color[length];

for (var i = 0; i < colorArgs.Length; i++) {
//テクスチャの色はかならず指定すること
//指定しないで描画すると、真っ黒な画像が表示されてしまう
//
//色指定に必要なのは、RGB値の3つだけ
//(A値は指定しても変化がないので不要)
colorArgs[i].r = (byte)rand.Next(byte.MaxValue);
colorArgs[i].g = (byte)rand.Next(byte.MaxValue);
colorArgs[i].b = (byte)rand.Next(byte.MaxValue);
}

return colorArgs;
}

}
}

Twitterアンケート結果と感想


 数日前、あるアンケートをとりました
結果がでました

↓アンケート結果



↓感想




 D言語やGo言語にRust言語といった
(まだ他にもあまり知られていない言語が沢山あるだろう)、
使いやすく、新しいプログラミング言語がいくつかあるのですが、
あまり使われないのは、

・コンパイラ導入の難しさ
・使いやすいIDEがない
・使っている言語と文法が違っていてなかなか移行できない
・使っている言語より文法が面倒
・標準ライブラリの使い方がわからない
・外部ライブラリの導入方法がわからない
・情報がないもしくは少ない

といった理由なのではないかと考察しました

 主流のプログラミング言語と文法が違うというのは、仕方ないというところなんですが、
ライブラリの使い方がわからなくて使えないというのは非常に厳しいです
また、決定的なIDEがないのも本格的に使うにはかなりきつい

といった具合にこれらの言語を使っていくのは難しいのですが、
(私もD言語とRust言語をほんの少しだけやってみましたが、上記の理由の通りすぐ止めてしまいました)
去年からの目標としてC#以外の言語でゲームを作るというのがありまして、
メインで使っていくのは億劫なのですが、
Rust言語をもう一度やってみたいなと思いました

 でもこの目標はなんだかんだで口だけになりそう・・・
去年の目標としていた、
IDEがあるC++への移行もできなかったくらいですから・・・

JavaScriptを使ってCanvasのサイズを変えるサンプル

JavaScriptを使ってCanvasのサイズを変えるサンプルを作りました

サンプルを見る

キーを押した時の処理サンプル2回目

キー判定用プログラムを書いてみた
前回とは違って
途中でつっかかったりしません

サンプルを見る

キーを押した時の処理サンプル

キー判定用プログラムを書いたので

サンプルを見る

これだけでJavaScriptでゲームを作るのが難しいとわかる

2018年の目標など


 2018年 あけましておめでとうございます
と書くには少し遅いな

 年末から数日間、
ホームページの改修や、
慣れないJavaScriptを書いてたり、
ホームページ移転やブログ移転先探したり、で
年始のブログ更新ができませんでした
(で結局移転先が見つからなくて移転しませんでした)

 ホームページ改修のために、
慣れない言語で書かれたコードを修正してたのですが、
JavaScriptの楽しさに気づきました
 JavaScriptでゲーム作ってみたい!って思ったのですが、
この言語の知識が少ないので、いくらなんでも厳しいですね


 まあこのあたりの話は本題じゃないので置いといてですね・・・

 先日、流行ってほしいプログラミング言語のアンケート
作りました
 このアンケートを作った理由は、
言語仕様がいいマイナー言語が流行るきっかけを作れたらと思ってやりました
 今すぐ流行らせるってことはできないのですが、きっかけ作りはこれくらいでしかできないです
言語仕様はいいのに
「ライブラリの導入がわからない」
「情報が少ないもしくはない」
「IDEがない」
という理由で結局使わないプログラミング言語はあるはずで、
だからせめてきっかけ作りのために、今後もこういうアンケートをちょくちょくやっていきたいですね
 ただ、あまりにしつこいのはアレなんで、ほどほどにって感じで考えてます

 最後にですね、FC2ブログに頻繁に出現する
訪問者スパムが非常にうっとうしいので、
訪問者リストに載ったスパムブログをスクリーンショットを撮ってTwitterに上げてこうと思います
 FC2ブログに、こんな感じの足跡スパムをするのがいる、ってことをわかるように


 今年は、まあ、上記の2つを実践していきたいですね

来年の予定


 昨日(10月22日)で26歳になりました
せっかくだから来年の予定を書くことにしました
今年は今作ってるゲームの完成目指してるので、
これらを始めるのは来年以降だろうね

本当にするかどうかは全く分かりません あくまで予定です

    〇来年の予定〇

・絵守未來二次創作ゲームを作る

「仮面ライダーエモリ」というタイトルで
短編アクションゲームにする予定

内容の予定

3回目以降の2分ゲー参加作品として制作するかもしれない

これ作ったら、二次創作ゲーム第2号になるよ


・2分ゲー投稿用ゲームを作る

2回目の2分ゲーに参加してみたいと思ったけれど、見送り
3回目以降に参加してみたいですね
実際にするかどうかはわからない

これをするとき、
絵守未來二次創作ゲームを2分ゲーとして登録するかもしんない



・C#以外のプログラミング言語を始める

去年C++を始めようかと思ったまま、いまだにほとんど始められてないので
来年以降に始めてみたい

Rustとかにも興味があるのでやってみたい

こう思った理由は、
C#はポインタ関連が結構使いにくいからです
ジェネリックとポインタの併用ができないですからね


C++はヘッダがめんどうなので結局始めないかもしれない
でもC++からでしか使えないSDL2の関数とかがあるから
C++に移行したいと思うんですけどね



・他の予定

「2017メイドの旅」っていうゲームを作ろうとしたんですけど、
今制作中のゲームがあるから、作れません
なんで来年には「2018メイドの旅」というゲーム作りたいですね

プロフィール

みにおん

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

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

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

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

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

・web小説
最後の時の夢

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

この人とブロともになる

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