プラグイン集

無料ブログはココログ
2021年8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

サンプルJS

  • ユーロバカ一代の締切
    ・・・初期化中・・・

プログラミング

2021年7月17日 (土)

Intel oneAPI をインストールした

Intel oneAPI とは、 Intel Parallel Studio XE の後継のコンパイラスイートである。
基本的には、C++コンパイラ、オプションで fortran コンパイラが20万円~買える。
付随ツールとしてプロファイルを作成する VTune や MKL 、 TBB と言った機能スイートがある。

ソフトの詳細は、日本の代理店である、エクセルソフトさんに詳細を譲る。

真面目に買ったらん百万単位のコンパイラスイートが何と、無料開放されたのだ。
URL: https://software.intel.com/content/www/us/en/develop/articles/free-intel-software-developer-tools.html

無料と聞いて正直信じられなかったが、URL見て、" Free for All Developers " 、「 全ての開発者の皆さんはご自由にお持ち下さい。 」だと。

規約をざっと確認したところ、普通のコンパイラスイートとそん色がない。
と言うか、エクセルソフトさんのIntel製品を取り扱っている価値がぶっ飛んでしまう。
有料版との差分は、日本語サポートの有無・サポート優先権・ダウングレード権、アップグレード権、SA権が無い、
コンパイラにバグがあってもしばらくそのまま、コンパイラに個人情報ブッコ抜き機能があったとしてもそのままで保証なしぐらい。
要するに、コンパイラをそのまま使うだけの、サンデー開発者にとっては全く気にする事でない部分しか、
パッケージソフトと違いが無いのだ・・・。
※いつ提供を終了するかもわからないし、いつ有料化して、既存のユーザーは金払えと言ってくるか分からないのはリスクではあるが・・・。

尚、 Intel oneAPI のフル機能を活用するのは難しい。
最低限、第9世代以降のIntel社製Core i シリーズのCPU( Celeronはダメよ。 )AVX2 や AVX512 が使える 、
Xeon であればスケーラブルプロセッサにDLBoostが付いていること、
FPGA、GPU をつかうのであれば、「 Iris Xe MAX  ( DG1 ) 」が入っていることが望ましい。
メモリもFPGA使用時は、64GBのRAMを要求されることもある。( 動作要件

ちなみに、手元のパソコンのCPUは Core i7 3520M ( 第3世代 )でかろうじてAVX無印に対応しているだけである。
よっぽど性能クリティカルな用事があるような場合でないと入れる意味が無い。

OSの要件は、LinuxのUbuntuであれば20.04.02を入れれば、そこまで難しくはなさそう。
一方、 CentOS が Stream になって以降、落ち着けない RedHat クローンはインストールが面倒なようだ。
Windows であれば、 Windows10 の細かい世代は要求していない。OSは64bit の必要があるが。
Visual Studio 2017 以降であれば、開発環境は問題ないようだ。

手元のパソコンの Windows10 21H1 なので試しに入れてみることができる。
多分、CPUの拡張命令を見ても速くなることはほぼないでしょう。
普通にGCCやVC++で事足りる。まぁ、それじゃ記事にする理由が無いのでね・・・。

インストールは特に迷う部分は無いが、長い。UAC制御の確認画面が上がってくるまでに2分ぐらいはかかる。
BaseToolkit のインストールにSSDで1時間は軽くかかった。
HPCToolKitも30分はかかったかな。

今のところシステムパスに変更を加えることはしないので、
iccとかifortだけでコンパイラを動かしたいのであれば、パスを手動で通す必要がありそうだ。
intelPythonも入っていて、バージョン情報は「 Python 3.7.10 :: Intel Corporation 」だった。
自分用の Pythonha3.8 使ってるんだけどな。パスの邪魔してないしまぁ、いいか。
iccコマンドはicxに代わっていて、バージョンは、「 Intel(R) oneAPI DPC++/C++ Compiler for applications running on Intel(R) 64, Version 2021.3.0 Build 20210619 」、
ifortはifxに代わっていて、バージョンは「Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2021.3.0 Beta Build 20210619 」だった。

パフォーマンステストは、実行していないので、とりあえずここまで。

2021年7月18日追記、
1000×1000の行列積計算を実行するプログラムを自分の手でPythonとC言語で組んで比較した。
時間測定範囲は、プログラム開始から終了までをmsys2の/usr/bin/time.exe -p で測定している。
行列の初期化から、解のチェックの時間までもちろん測定時間に含んでいる。

20210718_mutmul_speed_test

icc( Linux )、icl( Windows )の旧コンパイラが最速を記録した。
1秒程度で1000×1000の行列積の計算を終わらせてしまう。

VisualC++が20秒ぐらいで計算が終わるように行列サイズを調整したので、まぁ、こんなものだと思う。
mingwのgccは本来Linux系のところをWindows系バイナリを出力させているので、VC++より若干遅くて普通だと思う。
VC++もgccも-O2オプションでほぼ同タイムが出ているので、処理系にあったコンパイラの性能と言える。

iccがチート性能と言われるゆえんはこれで、単純コンパイルで1/20の実行時間ですよ。
圧倒的性能じゃないか。

一方でデータパラレルが、GCC -O2 、 VC++ -O2 レベルのスピードしか出ていない。
出来立てほやほやコンパイラだからこんなものか?
それとも、IvyBridgeじゃデータ並列の性能が出せないと言う事か?

Pythonの方に注目すると、Python2.7が速いのはちょっと意外。
Python3.8はかなり進化しているし、xrangeではなくrangeを使っているので、Python2.7の方が不利になるはずなのに。
さらに言えば、Python2.7は日本語処理の都合で、標準入出力・エラー出力の文字コード切り替え時間も含まれている。
それなのに、Python3.8より早いというのはやはり不思議だ。

残念なのはIntel Python3.7だろう。公式サイト
「Intel Distribution for Python
Develop fast, performant Python code with this set of essential computational packages including NumPy, SciPy, scikit-learn, and more. 」
翻訳、
「Intel 配布の Python
高速開発、高性能Pythonコード(基本計算パッケージ Numpy、Scipy、Scikit-learnとその他を含む)。」
って言ってるのに。
ん!!翻訳してみると、高速なのは開発であって、計算速度が高速とは言ってない??
ん~、そう言う事にしておこうか。

一応、各ソースコードを添付する。CとPython大きい違いは、引数処理の違いがある。
C言語のgetoptはUnistd.hなので、Windowsでは使えない。
コマンドライン引数処理がC言語の方が軽くなっている。
それ以外の基本的な計算コードに差は無い(と思いたい)。

Pythonコード:ダウンロード - matmul.py

Cコード:ダウンロード - matmul.c

ハイパフォーマンスコンピューティングをかじっている人なら、最適化なしのオーソドックスな行列積計算コードだと分かると思う。
これをチューニングすれば、数倍早くなるが、サンデープログラマが普通にコーディングすればこうなると思う。

以上、2021年7月18日追記部分。

2020年8月16日 (日)

電車でD ShiningStage の MOD 作りは可能かの調査

電車でD RisingStage までは、Selene というゲームエンジンで、Win32 のコテコテのバイナリで電車でDのゲームは作られていた。
x86 アセンブラの知識があれば、MOD 作りは可能だろうが、そんなものはないので諦めていた。

電車でD ShiningStage になってからゲームエンジンが Unity に変わったおかげで、x86 アセンブラの知識がなくても、
C# の知識レベルで対応できるようになった。

参考サイト:https://github.com/yaegaki/unity-mod-doc 
ほかにもいくつかサイトを見たが、URLを忘れた。
まぁ、調べたい人は調べがつくし、勉強する気がない人はたどり着けないので、省略でよいか。

道具:Visual Studio 2019Unity 2018.4.6f1JustDecompileILSpy.exeReflexil電車でD ShiningStage DEMO2(OPだけがループする奴。)

それぞれのインストール方法については省略する。ILspy にILコンパイラを追加する方法は、Reflexil のサイトからダウンロードした一式をコピペで置くだけ。

参考サイトには、”Visual Studioでクラスライブラリを作成します。 ”とさっくり書いてあるが、自分のインストール設定の Visual Studio 2019では、C# のクラスライブラリは、クラスライブラリ(.NET Standard)、クラスライブラリ(.NET Core)、クラスライブラリ(.NET Framework)、クラスライブラリ(ユニバーサルWindows)の4つがある。いったいどれだよ。
クラスライブラリ(.NET Framework)が正解らしい。ソリューションの設定を、電車でD ShiningStage が持っている、Assembly-CSharp.dll に合わせて、.NET Framework 4.X に設定する。

これでプロジェクトを開くことができる。
Assembly-CSharp.dllと同じフォルダに存在する UnityEngine.dll を開いて、参考サイトのコードをコピペ・・・、はい上手くいきません。
赤線が引かれて駄目です。MonoBehaviour は、UnityEngine.CoreModule.dll を参照に追加することで有効になる。
GUI.TextArea は、UnityEngine.IMGUIModule.dll を参照に追加することで有効になる。

これで、dllの準備が整い、赤線が消えるので、クラスライブラリ設定対象フレームワーク設定が.NET Framework 4に設定されていることを確認する。そしてコンパイルする。無事にプロジェクトディレクトリのdebugディレクトリにClassLibrary1.dllが作られる。

ClassLibrary1.dllのInitを電車でDのいっぱいあるクラスのどこで呼んでもらうかだが、cGameMgrクラスのtoOP()の最初にエントリー(Init)を仕掛けて、cGameMgrクラスの toMenu()とMenuToOP()でonDestory()を仕掛けた。

さっそく、Assembly-CSharp.dll を再度アセンブリしたいところだが、JustDecompile は依存ライブラリ UnityEngine.CoreModule.dll が解決できないとエラーを出力してフリーズするし、ILSpy は別のフォルダーに保存することで行けた。
dnSpy 使えばといわれそうなので書いておくが、JustDecompile と同じ運命をたどった。
dotPeek は・・・、存在忘れてて SSD の肥やしになってた。まぁ、ILSpy.exe+Reflexilで行けたからOK。
作ったソースは、以下の通り。

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using UnityEngine;

namespace Benchss1

{
public class BenchMark1 : MonoBehaviour
{
// variables
long allframs = 0;
float myfps = 0.0f;
GUIStyle m_guiStyle;
GUIStyleState m_styleState;
//private static Boolean created = false;
static GameObject go = null;

public static void Init()
{
go = new GameObject();
//DontDestroyOnLoad(go.gameObject);
go.AddComponent();

}

void Start()
{
allframs = 0;
myfps = 0.0f;
m_guiStyle = new GUIStyle();
m_guiStyle.fontSize = 40;
m_styleState = new GUIStyleState();
m_styleState.textColor = Color.green;
m_guiStyle.normal = m_styleState;
}
void OnGUI()
{
allframs++;
//float time = Time.realtimeSinceStartup - prevTime;
myfps = 1f / Time.deltaTime;

String myrenderedframes = "Score : " + allframs.ToString() + " \nFPS : " + myfps.ToString("F3");
GUI.TextArea(new Rect(40, 40, 500, 300), myrenderedframes, m_guiStyle);
if (Input.GetKey(KeyCode.R))
{
allframs = 0;
}
}

public static void OnDestroy() {
Destroy(go.gameObject);
}
}
}

C# なんて知らず、Visual Basic の自分からすれば、よく書いたわ。
前に Unity 使った時は、UnityScript(JScript(javaScriptとは似て非なるもの))で作ってたので、参考にならない。

本当は、電車でD ShiningStage のOPのシーンが最初に戻るたびにスコアをリセットしたいところだが、キーボードのRキーを押してリセットで妥協した。

このノートPCでスコア9000ぐらい行くので、20000 以上が動作ラインじゃないか?
アルゴリズム見ると分かるが、ただレンダリングしたフレーム数を足しているだけなのだが、
2分*60秒*60フレーム=7200フレームのはずなのだが、橋を渡るシーンなどで数秒間に400fps越えするので、2000フレーム位上振れしている。
しかも、スコアは64bit整数だが、適度にリセットしないとオーバーフローする。

MODとしては稚拙な出来だが、電車でD ShiningStage の MOD が作れるかどうかに十分答えられると思う。

本当はもっと、FFベンチとかドラクエベンチみたいに、「貴方のマシンは、やや性能不足です。」とかスコアをもって判定できればよかったのだが、残念ながらそこまでのコーディング能力はなかった。(やっぱり実ソフト動かして、良い悪い言う方が、スペック情報取って判定している電DローダーSSより、説得力がある。)

これを積み重ねていくことで、BGM差し替えや自分の車両の追加、オリジナルシナリオ追加、オンラインプレイ環境整備とMODの幅を広げていけるだろう。

配布は・・・、Assembly-CSharp.dllとClassLibrary1.dllを電車でD ShiningStage DEMO2のdend_ss_demo2\DenD5_Demo_Data\Managed\ フォルダーに上書きコピーすれば適応できるが・・・、セキュリティソフトが通さないので、配布しない方がいいだろう。

これだけ大規模な構造体(プログラムの意味じゃなくて、コンポーネント接続図的な意味で。)をしっかり把握している地主さんはすごいな。
そしてオーディオ関係のかなりのコード量。Twitterでちょくちょく言っていた通り、相当な問題児だったことがうかがえる。

2016年11月 3日 (木)

unityの変数にアタックする

Win32のネイティブアプリなら、T-searchで変数を攻めることができるが、Unityは(私の技量では)残念ながら変数を見つけることができなかった。

プログラムである以上、次の瞬間に値を保持するためにはメモリー上に格納する。そのアドレス、と型が分かれば、値のバイナリの表現方法が決まる。
Unityは.NET上で動作する、中間コード方式だ。ならば、中間コードをアタックする方が、自分の技量として速いのではないだろうか。

と言う事で、検索。あっさりと方法が見つかる。※この記事は、逆アセンブルやリバースエンジニアリングを推奨する記事ではありません。技術的な検証を目的にしています。

どのソフト書き換えるか、「秒速巫女」。どうしてもフランちゃんまで行かない。

ILSpyというソフトで秒速巫女_Data\ManagedのAssembly-CSharp.dllを開く。素晴らしい、ildasmよりもC#コードに戻る。しかも、どんどん参照先、参照元をトレースできるのが素晴らしい。しかしながら、このソフトは書かれている内容を見ることはできても、書き換え手元に戻すことはできない。

もう一つのサイトにたどり着く。う~んやはり、JustDecompile+Assembly Editorの組み合わせしかないのか。仕方ないのでインストール。

JustDecompileでAssembly-CSharp.dllをオープン。ILSpyで辺りを付けていたので、迷いなく、ParamControllerを開く。

Asm_op_01this.gameTimer.Init(5, 0, 0);は、それらしいところありました。見事にリテラル。ありがとうございます。ここの値を増やせばOKです。

ここからは、Reflexilの力を借りて、アセンブラプログラミング。8までならldc.i4.Xで直接指定ができる。今回は15を代入したいので、ldc.i4.sにして、オペランドタイプをSByte、オペランドを15にする。
Asm_op_02正しく書き換えが成功していれば、アップデートボタンをクリックすることで反映される。

その周囲にそれっぽいパラメーターが、いろいろあるので、カスタムするには楽しいかもしれない。アセンブリ言語は頑張れ。

Asm_op_03ちゃんと15分に書き換わったぞい。
init周り読むと、その辺でパラメーター調整しているから、いろいろ書き換えるられそうだ。

もう一度書くけど、リバースエンジニアリングや逆アセンブルを推奨している訳じゃないからな。無理なバイナリ書けばパソコンぶっ壊れる可能性も当然あるし、ウイルス化する恐れもある。その辺の責任をすべて理解したうえで、実行するメリットと社会的責任を天秤にかけてください。読者が何か起こったことに対する法的責任は無いし取れない。

2016年7月20日 (水)

はじめてのVisual C++

工学社米村先生の本。

今年の2月?ぐらいに買って、少しやって放置してた本なんだけど、Visual Studio使ったC言語プログラミング教えてくれ言われたので、焦って読み直して、読破しました。

米村先生の本はC++2冊、Java1冊でこれ入れて4冊目になるかな。

C++の本と同じく、ドラゴンとねーちゃんのペアで進行して、マッドサイエンティスト倒して、Windowプログラミングしてフィニッシュですかね。

独習とか凶器のC++本とかと比べると、教えてない技術もかなりあるけど、これだけ知ってればまぁ、組めるかな。

Visual C++でC言語やらなければならないなら、とにかく薄い本(同人誌じゃないぞ。)としてはアリかな。

最後のドラゴン2体書くところまでやったけど、本当はダブルバッファリングしてBitBlt呼んで滑らかな画面出力とか、エラー処理とか書きたかったが、本質はそこじゃなくてとにかくC++を思い出して使えるようにと言う事なので、これで良しとする。

Visual Studio 2015で、クラスをhとCPPに分割して作ってたけど、Windowsプログラミングのdouble[]の位置、ドラゴン側のcppファイル内でよかったのかな?そのおかげでextern宣言しなくて済んだけど。

2016年5月 4日 (水)

androidのwidgetを作る

ごちうさの画集のミラクルブレンドを買って眺めていて、キャラが、黒板を持って立っているページがあると思う。

昔流行った美女時計そっくりだ、では、そいつをスキャンして黒板部分の解説を消去・デジタル時計貼って、Androidウイジェット化しよう。

ウイジェットのつくり方なんてとっくに忘れたが、ググって何件かサイトを見繕う。JavaはほぼノーコーディングでXMLの設定を頑張れば行ける。

たとえば、モカ姉

Device20160504210119_2アンドロイド4.2・4.4に限りロック時のウイジェットにも対応。

webページの通り、クロックテキスト使ったら、アップデート間隔0でも、勝手に時刻更新された。うれしい誤算。

ロック画面とホーム画面の区別が分からず、javaファイルのonUpdateメソッドはほぼ空欄。ロック画面とホーム画面では読ませる画面定義のXMLファイルが変わるから、どうにかif分で条件分岐できないかと思ったが、結局やり方分からず仕舞い。

自分の端末をAndroid2.3.3→4.4.2に変更したから、高次元APIが使えるようになって楽だわ。

配布の予定は無し。ミラクルブレンド買ってきて、スキャナー無くてもコンビニのマルチコピー機使ってデータ取り込んで、画像加工ソフトで頑張れば、普通に作れると思う。

ちなみに時計の位置と傾きはXMLのリテラルガチ打ちなので、他の端末だと黒板上に時計が表示できないと思う。

2016年1月24日 (日)

O! S! U! 秋葉原ソースコード公開

前回動画だけ公開して、その後放置状態だったソフト?のソースを公開します。

いわゆる唾付けぇ~。カウントダウンスクリプト。

#pragma strict

var timeGUI : Text;
private var start_time : System.DateTime;

function Start () {
    start_time = System.DateTime.Now;
}

function Update () {
    var now_time : System.DateTime = System.DateTime.Now;
    var jikan : System.TimeSpan = now_time - start_time;
    
    timeGUI.text=jikan.Hours.ToString("D2") + "時間" + jikan.Minutes.ToString("D2") + "分" + jikan.Seconds.ToString("D2") + "秒" + jikan.Milliseconds.ToString("D3");

}

次、本体

#pragma strict
import UnityEngine.UI;

//マップの使える範囲
var L_Z_max : float = 70f;
var L_Z_min : float = -400f;
var L_X_max : float = 320f;
var L_X_min : float = -110f;
var L_Y_min : float = -20f;

var All_Item : int = 8;//MAP上の全アイテム数
private var Get_Item = 0;//獲得アイテム数

var Object_Num : Text;//アイテム数のテキスト表示用
var objMessage : Text;//ゲームオーバーのテキスト用
public var is_finish : boolean = false;//ゴール終了フラグ(成功時)
public var is_gameOver :boolean = false;//ゲームオーバーフラグ(失敗時)
public var esc_menu : boolean = false; //メニュー
var ssindex : int = 0;//スクリーンショットの番号


//スタート時に呼ばれる
function Start () {
    is_finish = false;//終了フラグを落とす
    is_gameOver = false;//ゲームオーバーフラグを落とす
    objMessage.enabled = false;//ゲームオーバーの表示を落とす
    esc_menu = false;//Escメニューは閉じておく
    ssindex = 0;
}

//毎フレームごとに処理される。
function Update () {
    if(!is_gameOver){
        Object_Num.text = "獲得アイテム\n"+ Get_Item.ToString() +"/" + All_Item.ToString() + "個";
    }
    
    //Escメニューのイベントを取る
    if(Input.GetKeyDown(KeyCode.Escape))
    {
        esc_menu=!esc_menu;
    }
    //キャラが、範囲内に居るかチェック。
    //transform.position.x = L_X_min; とは書けない。
    if(transform.position.x < L_X_min){
        transform.position = new Vector3( L_X_min , transform.position.y , transform.position.z );
    }
    if(transform.position.x > L_X_max){
        transform.position = new Vector3( L_X_max , transform.position.y , transform.position.z );
    }
    if(transform.position.z < L_Z_min){
        transform.position = new Vector3( transform.position.x , transform.position.y , L_Z_min );
    }
    if(transform.position.z > L_Z_max){
        transform.position = new Vector3( transform.position.x , transform.position.y , L_Z_max );
    }
    
    //落下したらゲームオーバー
    if(transform.position.y < L_Y_min){
        //落下してピチューン/(^o^)\ナンテコッタイ
        //Debug.Log("Fall OUT!!");
        FailOut();//落下ピチューンで終了処理を関数に投げる
    }
    
    //F2キーでスクショ撮る
    if(Input.GetKeyDown(KeyCode.F2)){
        Application.CaptureScreenshot("screenshot" + ssindex++ + ".png");
    }
}

//衝突検知、引数objにぶつかった物体が入る
function OnCollisionEnter (obj : Collision) {
    
    switch(obj.gameObject.name){
        case "CD_item03":
            Get_Item++;
            Debug.Log("CD_item03");
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            //Destroy(obj.gameObject);

            //obj.gameObject.SetActive (false);
            //当り判定と外枠を消す
            //内のCDまで消すとパーティクルが出ない。でも接触判定は重複させたくないので消す。
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            
            //パーティクルが出るのを待って、オブジェクトを削除する。
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
/*
            var renderers = obj.gameObject.GetComponentsInChildren(Renderer);
            for (var r : Renderer in renderers ){
                r.enabled=false;
            }
*/
            
        break;
        case "CD_item001":
            Get_Item++;
            Debug.Log("CD_item001");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item01":
            Get_Item++;
            Debug.Log("CD_item01");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item02":
            Get_Item++;
            Debug.Log("CD_item02");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item04":
            Get_Item++;
            Debug.Log("CD_item04");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item05":
            Get_Item++;
            Debug.Log("CD_item05");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item005":
            Get_Item++;
            Debug.Log("CD_item005");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        case "CD_item0087":
            Get_Item++;
            Debug.Log("CD_item0087");
            //Destroy(obj.gameObject);
            (obj.gameObject.GetComponent("ParticleSystem") as ParticleSystem).Play();
            obj.gameObject.GetComponent.<Renderer>().enabled = false;
            obj.gameObject.GetComponent.<SphereCollider>().enabled = false;
            StartCoroutine(DelayMethod(2.0f, obj.gameObject));
            
        break;
        //マグロのエリアなのでゴールゾーンです。
        case "Goal_area":
            if( Get_Item == All_Item){
                //ゴール
                Debug.Log("finish!");
                
                Finish_Goal();
            }
            
        break;
        default:
        break;
    }
}

//メニュー画面を描画する
function OnGUI (){
    //Escが押された時にだけ表示。もう一度Escが押されたら非表示
    if(esc_menu)
    {
        GUI.Box (new Rect (Screen.width - 260, 10, 250, 350), "操作方法");
        GUI.Label (new Rect (Screen.width - 245, 30, 250, 30), "上下矢印 : 前進/後退");
        GUI.Label (new Rect (Screen.width - 245, 50, 250, 30), "左右矢印 : 左回転/右回転");
        GUI.Label (new Rect (Screen.width - 245, 70, 250, 30), "走行状態でスペース : ジャンプ");
        GUI.Label (new Rect (Screen.width - 245, 90, 250, 30), "停止状態でスペース : 休憩");
        GUI.Label (new Rect (Screen.width - 245, 110, 250, 30), "左コントール : 前視点");
        GUI.Label (new Rect (Screen.width - 245, 130, 250, 30), "Alt : LookAt Camera");
        
        //追記:メニューボタンの面倒も見てもらう
        if(GUI.Button(new Rect (Screen.width - 250 ,160,230,30), "再開"))
        {
            //Debug.Log("再開ボタン"); 
            esc_menu=!esc_menu;
        }
        if(GUI.Button(new Rect (Screen.width - 250 ,200,230,30), "再挑戦"))
        {
            //Debug.Log("再挑戦ボタン"); 
            esc_menu=!esc_menu;
            Application.LoadLevel(Application.loadedLevel);
        }
        if(GUI.Button(new Rect (Screen.width - 250 ,240,230,30), "タイトルに戻る"))
        {
            Debug.Log("タイトルに戻るボタン"); 
            Application.LoadLevel ("startup");
        }
        if(GUI.Button(new Rect (Screen.width - 250 ,300,230,30), "ゲーム終了"))
        {
            Debug.Log("ゲーム終了ボタン");
            Application.Quit(); 
        }
    }
}

//ゲーム失敗のゲームオーバー
function FailOut(){
    //これ以上の落下を防ぐ
    transform.position = new Vector3( transform.position.x , L_Y_min , transform.position.z );
    is_gameOver = true;//ゲームオーバーフラグを立てる
    GameObject.Find("Timer_text").GetComponent(countup).enabled = false;//時間のカウント停止
    objMessage.enabled = true;//ゲームオーバーのメッセージを表示
    esc_menu = true;//Escメニューを常時展開する。
    objMessage.color = Color.red;//ゲームオーバーのメッセージを赤色に指定
    if(is_gameOver){
        //ピチュった原因を表示
        Object_Num.text = "世界からの落下";
    }
}

//ゲームクリア
function Finish_Goal(){
    is_finish = true;//ゲームクリアフラグを立てる
    GameObject.Find("Timer_text").GetComponent(countup).enabled = false;//時間のカウント停止
    objMessage.color = Color.yellow;//メッセージの色を黄色に設定
    objMessage.text="ゲームクリア";//ゲームクリアのメッセージ
    objMessage.enabled = true;//ゲームオーバーのメッセージを表示
    esc_menu = true;//Escメニューを常時展開する。
    
    Application.CaptureScreenshot("Goal_finish.png");//スクリーンショットを撮る
    
    if(is_finish){
        Object_Num.text = "クリア";
    }
    
}

//コルーチン
function DelayMethod(delay : float , obj : GameObject) {
    //delay秒待つ
    yield WaitForSeconds(delay);
    /*処理*/
    Destroy(obj);
    
    //オブジェクトをポイすれば、コルーチンは終わってよい。
    yield;
}

次、BGM

#pragma strict

public var bgmarray : AudioClip[];
public var asize :int = 8;
public var audioSource : AudioSource;
var gakkyoku_GUI : Text;

private var kyokumei  = new Array("♪ユーロバカ一代 DUB-MIX♪","♪ユーロバカ一代 VOL.1♪","♪ユーロバカ一代 VOL.2♪","♪ユーロバカ一代 VOL.3♪","♪ユーロバカ一代 VOL.4♪","♪ユーロバカ一代 VERSION 0.5♪", "♪ユーロバカ一代 VOL.5♪" ,"♪ユーロバカ一代 VERSION 0.87♪");


function Start () {
    var select_kyoku : int =Random.Range(0, bgmarray.Length);
    audioSource.clip = bgmarray[select_kyoku];
    audioSource.Play ();
    
    gakkyoku_GUI.text=kyokumei[select_kyoku];
}

function Update () {
    if(!audioSource.isPlaying){
        var select_kyoku : int =Random.Range(0, bgmarray.Length);
        audioSource.clip = bgmarray[select_kyoku];
        audioSource.Play ();
        
        gakkyoku_GUI.text=kyokumei[select_kyoku];
    }
}

ゲームスタート、ストップは省略。だってググったまんまだし。アイテムは、球体作って、旧透過シェーダーを読み込んで、ユーロビートユニオンのサイトからデータ落としてきて設定。
アセットは、ゼンリンのサイトからオタクシティーを落として反映する。

大体こんな感じでできてる。→バイナリ

以上。

書き忘れ。Unityちゃんの、シフトキーとAltキーいじってるの忘れてたわ。まぁソース公開できない部分だし問題ないか。

2015年12月22日 (火)

mfcに移植したソースがリンクできない時

時間が無いので超簡単にメモ書き。

mfcのプロジェクトに、項目の追加でソースを移植すると、プリコンパイル済みヘッダー検索中にどうのとかでて、コンパイルができない。

安易な解決策として、ソリューションエクスプローラーから該当CPPファイルを右クリック→プロパティー→プリコンパイル済みヘッダーを利用しないに設定すると解決する。

しかしながら、移植した方のコードが#include <altstr.h>取り込んでいて、CString使っている場合は、テンプレートが一致せずリンクが失敗する。(コンパイルは通るが、リンクできないので、ソフトができない。)

ちゃんとした方法で治すには、プリコンパイル済みヘッダーを無効にしたソースを再度、プリコンパイル済みヘッダーを有効化する。
そして、#include "stdafx.h" を取り込んであげること。

良く分からないが私の場合は、プリコンパイル済みヘッダーを取り込んであげたら、半日の苦労が嘘のように普通に動き始めた。

CString恐ろしい子。尚Visual C++ 2008での情報でした。

2015年12月13日 (日)

別の大陸間Edit大会

EuroBeat Union主催の大陸間EDIT武道会2015が無事に雌雄決したようで。参加した皆様お疲れ様でした。主催者の皆様良い肉食べてください。

私は楽曲を、編集したり、再合成したりはできないので、DJ_Command仙人ができるようになりたいと、夏コミの時に言っていたUnity3Dというゲームエンジンを駆使して、同じ期間の100日間でどこまでUnityで作れるかという挑戦をした。

最初はやる、中はサボって、最後にブースト。そんな感じの制作だった。
11月の第1週に出して20日頃上書き提出を行った。

まぁ、こんな感じのものができたよ。ゲームじゃないね。Unityソフトと言う方が正しいね。
この動画も若干古くて、最終Verだとアイテム取得時にエフェクト出るよ。

8月にEuroBeeat Unionに提出した企画書よりはとてつもなくヘボいが、100日でここまで出来て自分では、まぁよかったかと。

前回のユーロ仙人の生放送見てたけど、皆すごいね。ユーロ砲全門噴射って感じで。
自分はあの中から優劣は付けられないので投票できなったです。
なんというか、もうユーロ山という一つの山の頂上と言う世界ではなく。
いい意味でのユーロ宇宙だ。それぞれのアーティストがそれぞれ光り輝く、その光景がまるで恒星のような。

そう考えると、自分のやったことはおこがましいことかもしれないが、山は登るだけが楽しみではない、(富士山好きだって、登るのが好きな人がいれば、ダイヤモンド富士にこったり、湖面に映る富士にコル人もいる)というスタンスで行こうと思う。
ユーロ宇宙、誰が一つと定義した?


しかし、MMDが終わらない。(やってないから。)

2015年12月 5日 (土)

chromeで見えてadbで見えないSHL25

Android端末変えた。IS14sh→SHL25、Android2.3.3→Android4.4.2に一気にジャンプアップだ。
これがまたじゃじゃ馬で、全然パソコンに認識されなかった。MTPモードで見えない、PTPモードで認識するときもある、SDカードモードだと時間がたてば認識するとか。

デバッグモードをONにするとPCから見えない状態が続いて、シャープのADBドライバを無理やり入れたが、adbで認識せず。で諦めていた。

  • adbのバージョンも更新
  • Google adbドライバも更新
  • シャープの(当時)最新ドライバ
  • JavaSDKの(当時)最新バージョン
  • カスタムドライバ

これだけ試してどうすればいいんだと放置していた。

だが今日見たらadbのドライバのバージョンが上がっていて、同じ手順を試してやっぱり駄目だった。

ところが今日、google chromeから接続しているAndroidデバイスを見る方法を知った。google chromeのアドレスバーに chrome://inspect/#devices と入力して、Discover USB devices にチェックを入れると、なんとSHL25が見えたのだ。その情報を頼りに、検索かけまくって、シャープ開発者フォーラムにADBで見えない投稿があった。下の方を見ると、C:\Windows\infにusb.inf、usb.PNF がないとうまく動かない記述があった。

さっそく自分のPCのC:\Windows\inf\フォルダーを見る。案の定usb.infとusb.pnfが無かった。どうやって導入するかだが、こっちのブログを参考にしてくれ。
自分の場合、該当するフォルダーが4つあって、1つはpnfの方が無かった、残り3つの中で一番新しいものを選び、C:\Windows\inf\にコピーして配置。

PCを再起動してドライバをなじませた。その後、ADBデバイスを削除し、最新のシャープドライバーをインストールした。前は、Windowsが互換性が無いとかうんぬん言ってきたが、今回はスコンと入った。再起動要求が有ったので再起動する。

やっぱりADBでは見えない。ダメ元でスマホのUSBを挿しなおしたら、USBデバッグを許可しますかの画面がSHL25上に表示され、直ちに、常にデバッグを受け入れるにチェックを入れて、OKを押す。

やっとadb devicesで見えるようになった。

これまで、無効にしたgoogleアプリを有効にしたりとか、セキュリティー項目ゆるくしたりとかやってみたが、どれが当たりなのかは分からない。しいて言えば、C:\Windows\inf\の中にusb.infとusb.pnfが無かった。ADBドライバーを再インストールしたとかの辺りが効いている気がする。MTPとPTPの切り替えは効いてるのかはよくわからない。


何はともあれ、やっとADBで認識されたという事は、自分のアプリケーションをAndroidに転送して使えるようになったという事だ。ありがて~。

いや、ここからが開発のスタートになるんだけどさ。

2015年11月25日 (水)

VDSforGPSのスキンコード

GPSのデータを動画に取り込む際に、直接NMEAファイル見て、テキスト挿入でプロットしていくのは馬鹿臭いので、VDS for GPS なるソフトを見つけた。

AVIutlのプラグインとして動作するソフトで、やる気があればGoogle Mapとも連携可能らしい。

自分はGoogle MAPのAPI上限と課金が怖くて試してませんが。(なので地図は、ルートラボのGPSログ再生をキャプチャーして手動合成。かなりずれるので、結構面倒くさい。)

ソース、アナログ速度メーターと速度を7セグフォントで表示。※JR在来線特急の130km/h用。メーターは160km/hにしている。

//*** 初期化処理 ************************************************************

var MeterRight = 1;

function Initialize(){
	Scale = Vsd.Width / 1280;
	
	// 使用する画像・フォントの宣言
	FontS = new Font( "Arial Black", 30 * Scale );
	FontM = new Font( "Arial Black", 42 * Scale );
	FontL = new Font( "Arial Black", 90 * Scale );
	FontD = new Font( "YournameD7FinancialCondensed", 90 * Scale );
	
	GCx = Vsd.Width - 330 * Scale;
	GCy = 60 * Scale;
	GR  = 55 * Scale;
	
	BackImg = new Image( Vsd.SkinDir + "compact.png" );//領域背景画像
	ImgMeter = new Image( Vsd.SkinDir + "standard.png" );//メーターの背景画像
	BackImg.Resize( Vsd.Width, 120 * Scale );
	
		// 動画サイズに応じてメーター画像をリサイズ
	if( Scale != 1 ){
		ImgMeter.Resize( ImgMeter.Width * Scale, ImgMeter.Height * Scale );
	}
	
	MeterCx = Vsd.Width - 140 * Scale;
	MeterCy = 260 * Scale;
	MeterR  = 250 * Scale;
	
	// メータ描画用パラメータ作成
	MeterX	= MeterRight ? Vsd.Width  - ImgMeter.Width : 0;
	MeterY	= Vsd.Height - ImgMeter.Height * 0.85;
	MeterR  = 150 * Scale;
	MeterR2 = 126 * Scale;
	
	MeterParam = {
		X:			MeterX + MeterR,
		Y:			MeterY + MeterR,
		R:			MeterR2,
		Line1Len:	MeterR2 * 0.1,
		Line1Width:	2,
		Line1Color:	0xFFFFFF,
		Line1Cnt:	12,
		Line2Len:	MeterR2 * 0.05,
		Line2Width:	1,
		Line2Color:	0xFFFFFF,
		Line2Cnt:	5,
		NumR:		MeterR2 * 0.78,
		FontColor:	0xFFFFFF,
		Font:		FontS,
		MinAngle:	135,
		MaxAngle:	45,
		MinVal:		0,
		MaxVal:		0,	// 暫定
	};
	
	// グラフ用パラメータ生成
	GraphParam = [
		"Speed",	"%.0f km/h",	0x00FFFF,
		"Tacho",	"%.0f rpm",		0xFF4000,
	//	"Accel",	"%.0f %%",		0x00FF00,
	//	"TurnR",	"%.0f m",		0x00FF00,
		"Gx",		"%.2f G[lat]",	0x00FF00,
		"Gy",		"%.2f G[lon]",	0xFF00FF,
	];
	
	// スピードメータ用最高速計算
	if( Log.Max.Tacho > 0 ){
		MaxTacho			= Math.ceil( Log.Max.Tacho / 1000 ) * 1000;
		MeterParam.MaxVal	= ~~( MaxTacho / 1000 );
		MeterParam.Font		= FontM;
	}else{
		MaxSpeed			= Math.ceil( Log.Max.Speed / 10 ) * 10 + 20;
		MeterParam.MaxVal	= MaxSpeed;
	}
	
}

//*** メーター描画処理 ******************************************************

function Draw(){
	// 背景
	//Vsd.DrawRect( 0, 0, Vsd.Width - 1, 120, 0x80006000, DRAW_FILL );
	//Vsd.PutImage( Vsd.Width - BackImg.Width , Vsd.Height - BackImg.Height , BackImg );
	
	// スピード km部分
	Vsd.DrawTextAlign(
		Vsd.Width-20, 680 * Scale, ALIGN_RIGHT | ALIGN_BOTTOM,
		"km/h", FontM, 0x00FFFF
	);
	//スピードの数値部分
	Vsd.DrawTextAlign(
		Vsd.Width - 120 * Scale, 660 * Scale, ALIGN_RIGHT | ALIGN_VCENTER,
		~~Log.Speed, FontD, 0x00FFFF
	);
	
	/* ここに、速度計を取り付ける */
	Vsd.PutImage( MeterX, MeterY, ImgMeter );
	
	if( Log.Max.Tacho > 0 ){
		MeterParam.Line1Color =
		MeterParam.Line2Color =
		MeterParam.FontColor = Log.Tacho > REV_LIMIT && ( Vsd.FrameCnt & 0x2 ) ? 0xFF0000 : 0xFFFFFF;
		
		// タコメーター目盛り描画
		Vsd.DrawRoundMeterScale( MeterParam );
		
		// ギア
		Vsd.DrawRect(
			MeterParam.X - MeterR * 0.09, MeterParam.Y - MeterR * 0.48,
			MeterParam.X + MeterR * 0.09, MeterParam.Y - MeterR * 0.22,
			0xFF4000, DRAW_FILL
		);
		
		Vsd.DrawTextAlign(
			MeterParam.X, MeterParam.Y - MeterR * 0.35,
			ALIGN_HCENTER | ALIGN_VCENTER,
			GetGear( Log.Tacho / Log.Speed ), FontG, 0
		);
	}else{
		// スピードメーター目盛り描画
		Vsd.DrawRoundMeterScale( MeterParam );
	}
	
	if( Log.Max.Tacho > 0 ){
		// タコメーター針
		Vsd.DrawNeedle(
			MeterParam.X, MeterParam.Y, MeterParam.R * 0.95, MeterParam.R * -0.1,
			135, 45, Log.Tacho / MaxTacho, 0xFF0000, 4 * Scale
		);
	}else{
		// スピードメーター針
		Vsd.DrawNeedle(
			MeterParam.X, MeterParam.Y, MeterParam.R * 0.95, MeterParam.R * -0.1,
			135, 45, Log.Speed / MaxSpeed, 0xFF0000, 4 * Scale
		);
	}

}

中にあったソースを寄せ集めした感じ。「dend_130km.js」をダウンロード

160km/h出すスカイアクセスは要調整だけど、まぁ、これで大体事足りる。
遅い列車も要調整だけど。
7セグフォントは各自で何とか入手してね。

より以前の記事一覧