BSプレミアム 数字

普通に使っている数字0から9までの10個の数字のことを

アラビア数字という、へえとおもいました。

インド・アラビア数字ともいうそうです。

まあ、インドが発祥地ということです。

この数字の中で、3,4,5という3つの数字とGeometory(測量学)

幾何学と思っていたら、なんと測量学ということで、さらにへえと

思いました。

ピタゴラスの3平方の定理で、受験数学の中で、覚えていたのですが

3角測量で使われ、ピラミッド建設にも使われていたとか

改めて、この偉大な数字に感銘しました。

さらに、用事をしながら、番組をみていると、チューリングというかたが

紹介されていました。

これは、第二次世界大戦で、暗号解読で使われた、チューリングマシン

のことかとおもっていたら、チューリングの方程式のことでした。

いろんな、生物の模様と関係あるということで、

さらに、花の花びらの数が、フィボナッチ数列になっているとのこと

1、2,3,5,8、

なるほど、大きさで表現すると巻貝になるらしい。

また、ネットでみたら、黄金比とも関係があるとのこと、

興味のあるテーマが次から次へとでてきたので、

引き込まれました。

残念ながら、買い物に出かけないと

みることができませんでした。

今回は、書留めです。

 

GW 西遊記はじまりのはじまり にみる仏教の教え

2023年5月ゴールデンウイークに、みた

中国、香港合作映画ですが

最後のエンディングにGメン'75の曲が流れ、ノスタルジック

になりました、結構頭に染み付きました、

丹波哲郎さんが浮かびます。

最初に、河のモンスターが出てくるのですが

これを、妖怪ハンターの女のかたが、捕まえると、

なんと人間の姿に、昔子供がおぼれるのを助けてあげたが

村の人に、誤解されたみたいです。

いったんは、袋の中にしまい込みますが

のちに沙悟浄として、復活させてあげます。

退治は、しますが、のちに復活させるという

ことに、のちのち気がつきました。

また、孫悟空を鎮めるときに、三蔵法師が菩薩の姿で、お経を

唱えるシーンがありますが

始めて、仏教思想が流れていることに、気が付きました。

改めて、みてよかったです。

やはり、妖怪といえども、説得して、良い妖怪に

していくというポリシーは、

徳川家康の乱世の時代、武田信玄ににらまれるも、今川氏真を助けた。

このシーンとかぶります。

 

 

 

 

さあどうする家康

NHK大河ドラマ、さあどうする家康にはまっています。

三河の地の殿様であるがゆえに、西の織田信長と東の

武田信玄にはさまれ、さあどうする。

人情味あふれる家康が、描かれていて、まるで

自分をみているみたいで、感情移入して、ポロポロ涙がでてきます。

今回の姉川の戦いで、浅井長政に一緒に戦おうと誘われるものの、

部下のいろんな意見のはざまで、将来のことを考えて

織田信長側につくことを、決心する。

最後のシーンで、岡崎城から引間城に移ることを命ぜられ、

妻の瀬名に一緒に行こうよとせがんでいるところは、

面白いし、泣けてきました。

地名の漢字、歴史よくわからないので

文章おかしいところあるとおもいますが、

大変感銘しているドラマで、朝の忙しいところ

書きました

ファイルな話 続き

前回、C言語での構造体レコードの簡単なプログラムを紹介しました。

そこで、StaffDisplay()という関数を紹介しました。

関数を追加すると、以下のようになります。

#include <iostream>

#define Staff_Max 2//社員数

using namespace std;

//社員情報表示

void StaffDisplay(void);

int main(void){

//社員情報の表示

 staffDisplay();

return 0;

}

//社員情報表示関数

void StaffDisplay(void){

//社員レコードの定義

struct StaffSt{

int no;              //社員番号

char name[20];//氏名

int salary;        //給料

};

//社員情報初期化

struct StaffSt staffrec[Staff_Max]={

{1,"かめ",200000},

{2,"うさぎ",100000}

};

for(int i=0; i< Staff_Max; ++i){

cout << "--社員レコード--" << endl;

cout << "社員番号  “ << staffrec[i].no << endl;

cout << "社員名     "  << staffrec[i].name << endl;

cout << "給料" <<           staffrec[i].salary << endl;

}

}

はい、以上のようになりますが

まだ、あります。

次は、プログラム分割です。

関数化できると分割が可能になります。

メイン関数とサブ関数のプログラムにわけます。

そのときに、ヘッダーを追加するとあとあとその関数を使うときに

超便利となります。

プログラム名は

StaffDisplay.cppとStaffDisplay.hです

なお、ヘッダーにはデータはいれられないので、原則ですが

社員レコードの型の定義と

関数名をヘッダーにいれます。

StaffDisplay.h

struct StaffSt{

int no;//社員番号

char name[20];//社員名

int salary;//給料

};

void StaffDisplay(void);

StaffDisplay.cpp

#include "StaffDisplay.h"

#include <iostream>

#define Staff_Max 2 //社員数

using namespace std;

void StaffDisplay(void){

上記の内容に同じ

}

//メイン関数

main.cpp

#include "StaffDisplay.h"

int main(void){

//社員レコードの表示

StaffDisplay();

return 0;

}

以上ですが、関数化したときより

さらに、プログラムを分割すると

メイン関数が、シンプルになったというのが

わかります。

また、分割することにより、再利用の可能性があがります。

関数がより、汎用的になるということです。

経験の部分もありますので、

このコンソールアプリ プロジェクト名Staff

練習してみてください

 

 

 

ファイルな話

ファイルとは、実はものすごく身近で、Webで買い物をするとき、アカウントを作成します、アカウントとは、UID,PWDをつくります。

名前、住所とかいろんな情報を入力します、

次回からは、アカウントを入力すれば、本人というのがわかります。

実は、このいろんな情報を入力するという作業、昔は(江戸時代以降ですね、

コンピューターが、アメリカから持ち込まれて以来、黒船みたいに)

京都の老舗に、商品を発注するとき、お手紙で、自分の名前、住所を

送付し、店舗側では、商品に宛先ラベルを書いて、貼って、

請求書を同封して、発送します。次回からは、注文がきたときに、

名前、住所を書かなくても、ラベルを発行すれば、貼ればよいことになります。

宛名間違いも発生しなくなります。はい、そうですね

顧客の情報をコンピューターに入力したわけです。

一人や、二人ならよいですが、万人ともなると、やってられません。

徹夜して、コンピューターに入力しても、おいつきません。

何か月もかかるでしょう、というのは、入力ミスを防ぐために

Verifyといいまして、2回打ちます、一回目を入力したあと

もう一回、同じ内容を打ち込むのですが、ここで、前回打ち込んだ

内容と異なれば、警報がでて、もう一回やり直しとなります。

これでOKかといいますと、いったん顧客情報をコンピュータに入れて

保存します、仮の顧客マスターを作成します、

ここから、顧客情報を紙にプリントして、紙に書かれた顧客情報と

照らし合わせます、ここで、間違い(漢字ミスが多発)があれば、

情報の修正データを作成し、マスターとトランザクション(伝票)

をマッチングし、修正します。件数が少なければ、すぐ終わりますが

老舗ともなりますと、全国のお客さまから、注文がきます。

新規のお客さまが減ってくれば、このシステムは安定してきます。

ただし、超人気商品ともなると、その現場を視察したのですが

たくさんのパンチャー(ボクシングではなしに)女の方が

ぱちぱちとパンチしておられました、キーボードが

指にあわせて、へこむというというなんという怪力かな(笑)

はい、少し昔の話でしたが、この顧客情報を入力するという作業が

いつごろからか、インターネットが発達しまして、

画面からWeb経由で注文できるようになりました、

ただし、最初のアカウント入力が大変ですが、昔のことを

考えると、本人が入力するので、まず間違いが発生しないという

素晴らしいシステム(発注)だと思います。

この顧客マスターを作成するときに、顧客データを入力しますが

これを顧客レコードといいます。

タイムライン上では、トランザクション(伝票)と呼ばれますね、

この顧客レコードを顧客番号(主キー)をもとに

追加します、アンマッチであれば、新規追加、マッチすれば、顧客レコードの

修正となりますが、追加区分でミスが発生しないようにします。

つまり、新規の顧客なのに、マッチすれば、顧客番号ミスとなります。

従って、キーにミスが発生しないように、Webサイドで、顧客番号を

自動で発行します。

オンラインでマルチユーザーともなると、同時発行が問題となりますが、

これは、先に顧客マスターをいまから追加するぞとiIOモードで

ロックをかければよいですね、マスター全体をロックかけると

システムに待ちが発生するので、顧客レーコード単位でロックをかけます。

こんな処理大変ですね、いまではデータベースマネージャーがやってくれます。

いまでは、論理データベースですね、MySQL,Postgreとかいろいろありますね

ASP.NETとかも

はい、ここで顧客レコードがでてきました。

C言語で解説すると、構造体レコードとなります。

#include <iostrean>

#define Staff_Max 2

using namespace std;

struct StaffSt{

int no;             //社員番号

char name[Staff_Max];//名前

int salary;        //給料

};

int main(void){

struct StaffSt staffrec[2]={

{1,"かめ",200000},

{2,"うさぎ",100000}

}

for(int i=0; i<2; ++i){

cout << "社員番号 " << staffrec[i].no << endl;

cout << "氏名 " << staffrec[i].name << endl;

cout << "給料 " << staffrec[i].salary << endl;

}

 

return 0;

}

 

プログラム分割するには、まず関数化が必要です。

 

void StaffDisplay()
{

struct StaffSt staffrec[2]={

{1,"かめ",200000},

{2,"うさぎ",100000}

}

for(int i=0; i<2; ++i){

cout << "社員番号 " << staffrec[i].no << endl;

cout << "氏名 " << staffrec[i].name << endl;

cout << "給料 " << staffrec[i].salary << endl;

}

 

}

ゲームエンジンとObject指向プログラミング

従来、ゲームエンジンといえば、Unityがありました。

大阪にスマホの、ゲームエンジンとして、某メーカーさんが

Unityをもってこられて、これでスマホのゲーム開発をしてくださいと、

当時は、日本語訳も少なくて、全部英語でしたが、

3Ⅾゲームが簡単に作れて、しかもスマホに出力できるということで、

もちろんPC上でも、動きますし、Playstation 用にも出力できるという

すぐれものでした、これを作ったかたがたは、すごいと思います。

ツールの使い方が、よくわからず、ふーんと思っていました。

今日2大ゲームエンジンの時代を迎えて、改めて、Unityがよくできていることに

今頃、気が付きました。遅すぎるウ

UEは、開発している様子が、ラインが混線して、かっこよすぎます。

難点は、重たいということですが、それももう解決しそうですね、

Intel CPU GPUAMD CPU GPUの進化がすごい

空冷から水冷マシンが登場している、どんだけ、発熱しているのか、

ひょうっとして、燃える寸前、湯がわかせる(笑)

Unityの画面で、標準の画面レイアウトが好きなので、

左側に、ヒエラルキーという、画面があって、ここに

GameObjectをおくということでしたが、今までは、Player とか、地面とか

木とかをObjectとして、置くのになんでこんな階層的な名前がついているんだろう

と思っていましたが、やってみると、あー親子関係が簡単にドラッグで実現できる、

なんとそうか、そういうことかと、ブロックを4つあって、全部こわしたら、

Clearのとき、プログラムでは、4つのライフフラッグを作って、

フラッグが全部Falseになるのを待ってでしたが

なんとダミー(Empty)の親を作って、そこにBlockをドラッグしたら

親の下に4つぶら下がって、親の子供が0になったら、Clearと

なんとすごい、アルゴリズムで実現できると、C++で組んでいると、

DirectXと格闘しながら、面倒くさーとおもっていたのに、

なんとすっきりしたコーディング、唖然、ぽかん、ほーほけきょ(笑)

また、Physicsも搭載されていて、うごくものに、Physics のRigidBodyコンポーネント

(最近コンポーネントと表現するのが少し身についてきました)

をAddコンポーネントしたら、重力、空気抵抗などを実装することができて

また、Collder(当たり判定)がMeshに標準でついていて、

Physical Materialを搭載すると、摩擦係数、反射係数が設定できてしまう

という、Physicsの世界は理解できるけど、Physicsライブラリーの実装は

死にそうになって、チーンですが、簡単に実装できるという

これまた、改めてすごいと思いました、

衝突、摩擦、反射を簡単に実装できるということです

改めて、すごさに、感嘆いたしました、遅すぎるウ

またPrefabのことをプレハブと発音していて、なんという名前かと思っていましたら、

オブジェクトをAssestsのPrefabsフォルダーにドラッグ&ドロップしたら

なんとPrefabができる、設計図とか説明がよくありますが

あらためて、Classかと思いました、

あらためて、Prefabの威力を思いしりました、いまごろやっとプレハブではなしに

プレファブと発音できるようになりました、遅すぎるウ

というわけで、今回改めた、さわってみて、そのものすごさに

感動しすぎました、遅い春がやってまいりました、

また、次回書きたいですが、忙しくなって書く暇がないかも

です、毎日新しい発見の日々です

ありがとうございます

Unityの初心者マークさんです

 

 

 

クラスの使い方とインスタンス

クラスといっても、使いかたがわからないと、宝のもちぐされです。

ここでは、クラスの使い方について触れてみます。

まず、プレーヤークラスCPlayerがあったとします。

そのなかに、関数が初期化関数 void Init()関数

移動関数void Move()関数

描画関数void Draw()関数

メモリ解放関数 void Release()関数がはいってたとします。

このクラスをgamescene.cppの中で使いたいとします。

この中も初期化関数 void InitGameScene()関数

アップデート関数(更新関数)void UpdateGameScene()関数

描画関数 void DrawGameScene()関数

メモリ解放関数void UninitGameScene()関数があるとします。

 

すると

CPlayer.hには

class CPlayer{

省略

public;

 void Init();

void Move();

void Draw();

void Release();

};

CPlayer* GetPlayer();

がはいっています。

CPlayer.cppの頭のほうには、

必要なヘッダー

#include "CPlayer."

 

CPlayer g_player;

CPlayer* GetPlayer(){

   return &g_player;

}

下省略

があるとすると

Playerのインスタンスゲッターが

GetPlayer()です。

 

クラスは、実体化しないと、オブジェクト化

インスタンス化しないと使えません。

上のg_playerがPlayerオブジェクトです、これも

メモリにロードされて、実際にメモリが割り当てられないと、使えません。

そのメモリ割り当て後が、&g_playerです。

これは、実際に、メモリに割り当てられないとアドレスは存在しません。

それでは、使ってみましょう。

ゲームシーンにPlayerを追加します。

ヘッダーに#include "CPlayer.h"を追加します。つぎに

初期化シーン void InitGameScene(){の中で

playerインスタンスをよびだします。

CPlayer* player=GetPlayer();

player->Init();

変数は呼び出せません、というか見えません(privateなので)

つぎに

void UpdateGameScene()[の中で

playerインスタンスを呼び出します。

さきほどのplayerインスタンスは、みえませんし、もう消えてなくなっています。

えーそれなら、グローバルに定義したいところですが、

グローバルに定義すると、インスタンスを生成する順番に影響されます。

グローバルは使いません、必要に応じてインスタンスを生成します。

ここでも

CPlayer* player=GetPlayer();

player->Move();で移動します。

最後、DrawGameScene()関数でplayerを描画します。

さきほどのplayerインスタンスは、もうありませんので

再び、インスタンスを生成します。

CPlayer* player=GetPlayer();

player->Draw();

ラストに、ゲーム終了後、メモリーから

playerのモデルを消します。

UninitGameScene(){の中で

再びインスタンスを生成します。

CPlayer* player=GetPlayer();

player->Release();

 

とまあ、こんな感じです

各関数の中で、playerインスタンスを生成しているので

他の関数からは、みえませんし、

ローカル変数なので、関数の最後で、消滅してしまいます。

インスタンスの情報が消えてしまいます。

毎回なので、大変なような気がしますが

コンピューターにとっては、一瞬のできごとです。

インスタンスを扱っているので、軽量です。

オブジェクトよりも軽いです。

また、何回もよびだされても、インスタンスなので

一瞬で、処理できます。

アドレスの処理は、超高速です。