ラビットガーデン(うさぎでもわかるUE4)

主にUE4(Unreal Engine 4) やLive2D、 Unity3D、自作ゲームについて解説

カテゴリ: 未分類

初心者向け講座なので、難しい記述法は避けたいのですが、
頻出する便利な記述については、覚えて欲しいので解説します。

■ x = x + 1; は x += 1; と書けます


player.x = player.x + speed;
とか、読むのも書くのも面倒なので
player.x += speed; と。

+=の他にも
-=
*=
/=
とかが大抵の言語では使えます。

■ if( func() ) とか while(1)


if(条件式)やwhile(条件式)は真のときに実行されます。
例えば if (2<3) は実行され、if(2>3) は実行されません。

また、C++やその他多くの言語では0(false)以外は真扱いになるものが多いです。
「if (1)」は必ず実行されますし、「while(1)」はよく書かれる無限ループの記述です。
※0以外なら何でもいいので、3とか-1でも同じ結果になります

「if (a)」は aが0(false)以外なら実行されます。
例えば、if (残機) { 自機を表示(); }と書けば残機が0以外なら自機を表示()が実行されます。

※「if (!a)」は「if (a == false)」や「if (a == 0)」の意味になります

従って、戻り値のある関数を条件式として使うことも可能です。
if( func() ) はfuncが0(false)以外を返しくれば、実行されます。
※if( func() == true)とも書けます
※if( !func() )はif( func() == false)やif( func() == 0)

■ if( funcA() && funcB() ) の注意点


funcA()が偽を返すとifが成立しないので、funcB()の実行を諦めてしまいます。
諦めんなよ!どうしてそこでやめるんだよ!

if( funcA() || funcB() )
だとfuncA()が真を返した時点でifが成立してしまうので、やっぱりfuncB()をサボっちゃいます。
サボるなよ!

両方とも実行してくれないと困るときは注意しましょう。

最近、プログラムを始めたS氏へ


ゲームに必要と思われる最低限のサンプルコードを書いた。
敢えて解説はしない。意図を汲み取ること。
一応、C++のコードだが、なるべく処理系に依存しないように書いたつもり。
(※プロジェクトのプロパティでDXライブラリのセッティングがしてあればコピペで動く)
追記:こっそりとY座標の表示バグを修正
追記2:※コードの中に全角スペースを入れるとエラーになるので注意!
追記3:ちょっとした解説を追加 続きを読むをクリック!

//***********************************
// 方向キーで自機を動かすだけのサンプル
//***********************************

#include "DxLib.h"

// 定数
const int 窓横幅 = 640;
const int 窓縦幅 = 480;

// 関数のプロトタイプ宣言
int ライブラリ初期化(bool ウィンドウモード, int 窓横幅, int 窓縦幅);
bool メインループ脱出チェック(int キーコード);
void 画面クリア();
void 背景描画();
void 自機描画();
void 描画バッファを実画面に反映();
void 入力検出();
void 終了処理();
void デバッグ表示();

// グローバル変数(※非推奨だが、取り敢えず)
int X座標 = 窓横幅 / 2;
int Y座標 = 窓縦幅 / 2;
int 移動速度 = 2;

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if(ライブラリ初期化(true, 窓横幅, 窓縦幅) == -1) { return -1;}

while(メインループ脱出チェック(KEY_INPUT_ESCAPE))
{
画面クリア();
入力検出();
背景描画();
自機描画();
デバッグ表示();
描画バッファを実画面に反映();
}

終了処理();
return 0;
}

//------------- 以下自作関数の定義部分----------------------------------------------
int ライブラリ初期化(bool ウィンドウモード, int 窓横幅, int 窓縦幅)
{
ChangeWindowMode(ウィンドウモード);
SetGraphMode(窓横幅, 窓縦幅, 16);// 16 or 32 ビットカラー
if( DxLib_Init() == -1 ){ return -1; }
SetDrawScreen(DX_SCREEN_BACK);
return 0;
}

bool メインループ脱出チェック(int キーコード)
{
if(!ProcessMessage() && !CheckHitKey(キーコード)){
return true;
}else{
return false;
}
}

void 画面クリア()
{
ClearDrawScreen();
}

void 背景描画()
{
int 赤 = 0, 緑 = 0, 青 = 128;
int RGB色 = GetColor(赤, 緑, 青);
bool 塗潰し = true;
DrawBox(0,0, 窓横幅,窓縦幅, RGB色, 塗潰し);
}

void 自機描画()
{
int 半径 = 16;
bool 塗潰し = false;
DrawCircle(X座標, Y座標, 半径, GetColor(0, 255, 0), 塗潰し);
}

void 描画バッファを実画面に反映()
{
ScreenFlip();
}

void 入力検出()
{
if(CheckHitKey(KEY_INPUT_LEFT) ) { X座標 -= 移動速度; } // ←方向キー
if(CheckHitKey(KEY_INPUT_RIGHT)) { X座標 += 移動速度; } // →方向キー
if(CheckHitKey(KEY_INPUT_UP) ) { Y座標 -= 移動速度; } // ↑方向キー
if(CheckHitKey(KEY_INPUT_DOWN) ) { Y座標 += 移動速度; } // ↓方向キー
}

void 終了処理()
{
DxLib_End();
}

void デバッグ表示()
{
DrawFormatString(0,0, GetColor(0,255,0), "X位置は%dでY位置は%dです", X座標, Y座標);
}

続きを読む

ちょくちょく思い出したときに起動していたのですが
本日、拙作ゲームの実行ファイル15maze0.2.exeを起動してみたところ問題なく起動しました!!
NortonのSONARが警告を出さなくなりました。

100611_sonarSS

ファイルインサイトの評価も「10人未満~」→「100人未満~」に変化しており良好です。
(※DL総数自体は1000人を超えています)
これで起動が不安だったノートンユーザーのみなさんにも安心してオススメできます!
ソフトはこちらのエントリの1番下へ

※まぁ、どうせ次回作を配布したら同じことの繰り返しなんでしょうけどね…orz


15年前のノートが迷路だった件について (ニコ動)↑を元ネタにゲームを作りました。


15年前の迷路 ノート味版 ゲーム(ニコ動)↑作ったゲーム(※動画は無音ですがゲームは音が鳴ります)

■exeファイルを実行するとノートンが警告を出してexeファイルを削除する件
ノートン360のSONAR機能はexeファイルを実行すると問答無用でexeファイルを削除するようです。
(体験版をインストールして確認済み。 ※該当exeは消さずにstdrt.exeを消す場合もあります。)
virustotal.comにて41種の有名セキュリィソフト最新版にてチェックし、問題ないことを確認しております。

SONARは
・リリース直後など新しくて利用者の少ないソフトは評価が下がる
・評価の低いソフトは少しでも怪しい振る舞いと判断されると問答無用で削除(ゴミ箱にもない)
・単にウィンドウを表示するだけのソフトでも削除されることがある
・何をもって怪しいと判断しているか謎(対処不可能)
フリゲ作者泣かせ

だそうです。
ノートン先生の余りの厳しさに泣きそうです。


↑ノートンのSONARの動作例

893eae60.jpg

↑21日時点でのファイルインサイトの評価

8d986a26.jpg

↑22日時点での評価(評価が良好になってきています)
今後のユーザー使用状況によって、安全とみなされそうな兆候です。


■当ソフトウェアの安全対策について
現時点で個人レベルで行えるチェックとしてvirustotal.com以上の方法ないと思われますので
アップロード前後の、このチェックをもって安全と判断させて頂きます。
(もちろん41の検疫をスリ抜ける未知の脅威の可能性を完全には否定出来ません)

安全性に問題はないと判断しますが100%の保証はどんなソフトウェアでも不可能です。
自己責任にてお願いします。

免責事項:本ソフトウェアを使用することによって発生した一切の損害に対して、
作者は如何なる責任も負わないものとします。


上記内容を了承した上でDown Load願います。
ゲーム配布中(斧アップローダ)

SyntaxHighlighter for Kuin ってのを導入してみたけど、上手く動かないや うーむ…何故だろう… たぶん単純なポカなんだろうけど、JSやCSSに疎くてよくわからない
func Init(cfg : Kuin@CCfg)
	do cfg.Title :: "Kuinvader 0.022"
	do cfg.FullScr :: false
	do cfg.PadNum :: 1
	do cfg.WaitTime :: 60
end func

func Main()
	while(true)
		do Sample@Game() { ゲーム画面 }
	end while
end func

CPPの表示テスト
  int main(){
    printf("hello world!\n");
}

他に作ったゲームの紹介です。

夏妃ムラムラ


うみねこのなく頃にの2次創作横スクロールアクションです。
同人イベントで配布(完売)
特徴 薙刀&ガンアクション
・薙刀の斬撃で間合いが詰まる
・銃の発砲で間合いが離れる
という2つの武器の特徴を上手く使い分けながら遊ぶように設計しました。

※この動画ではSE,BGMを原作の同名ファイルで上書きしてプレイしています


ラグナロクSTG THE 凧揚げ


ラグナロクオンラインのパロディゲームです。
身内限定で公開したゲームです。
(※BGM、ドット絵素材をそのまま使っているで、一般には公開していません)
煩雑、盛り込み過ぎ、独り善がりで最も反省点の多いゲームです。

友人に説明抜きで実際に遊ばせて観察していたのですが、途中で投げられてショックを受けました。
「マニュアルなんて誰も読まない」「チュートリアルなんて誰もまともにやらない」
を思い知った作品です。

・ラグナロクの「逃げ撃ち(凧揚げ)」
・弾が反射するブロック崩しSTG
・剣士、弓人の同時操作アクション
・ロックオンした順にホーミング弾(鷹)が飛ぶコンボSTG
という多くの要素を盛り込んでテーマが散逸になっています。
どれかひとつに絞るべきでした。

何百回もテストプレイした自分がギリギリクリアできる難易度にしたので、難しすぎたのも難点です。
自分がキモチイイように作ったので、自分で遊ぶ分には最高に面白く、完成したときは早く友人に遊ばせてあげたくてヤキモキしながら何度も難易度調整を繰り返していたのを思い出します。

難易度ばかり気にしていたので「面白くない」という反応が返ってくることは全く想像外でショックでした。
難易度よりも「想像した通りに動くかどうか」がプレイの不快感に大きいようです。
逆に言えば「想像した通りの方法論でクリアするゲーム」なら、むしろユーザーにとっては難しい方がキモチイイとも言えるでしょう。

↑このページのトップヘ