忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   
カテゴリー「お役立ち【技術】」の記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

やばかった・・・

どうもたくあんっす。
ながらく更新できなくて申し訳ないっす!

ここ数日なかなか自由な時間がなかったんだ。
仕事と家事の両立は大変ですね。普通にやってる他の人がすげぇわ・・・
まぁ楽しいので辛くはないんですけどね。

んじゃ今日はいつもC#では面白くないかなと思ったのであまり学校でやらないと思う話を。

拍手[0回]

PR

最近他のメンバーが更新してない

どうも、たくあんです。
ん~皆忙しいだろうなぁ~

過疎らないためにも今日は暇なので更新しますよ~

今日もC#講座だ! 
これ需要あるのかな・・・・・

まぁ頑張って行こうか

拍手[0回]

更新遅れました。

どうもたくあんです。
ここんとこ忙しくて中々更新できませんでした。
皆さんもテストお疲れ様です。

まぁ結果が悪くても後期に取り戻せるさ!

今日は何を書こうかな~
最近C#やってたのでその辺書こうかな。

拍手[0回]

CEDEC行きたかった。

ども、たくあん(財田)です。
最近少しだけ余裕ができて、朝だけですがのんびりできます。

さて今話題のCEDEC!! 全く記事読んでねぇ、なんて奴はいませんよね?

例えばですが、下の記事で紹介していたRubyの開発者のまつもとひろゆき氏の講義とか!
鉄拳の開発時に4キャラ表示しても処理落ちさせないためにどうしたかとか!
ダンガンロンパができるまでの熱い男の戦いとか!
興味深いものばかりでした。

そこで私も何か一つ紹介したいと思ったので・・・・・

拍手[0回]

Ruby勉強してみた

夏休みが終わったかと思ったら、月末には前期末試験です。
東京ゲームショウ(主に1年生)や資格試験、2年生は就職活動の本格化など、
きっちり気持ちを切り替えないといけませんね。

学校の(テストのための)勉強も大切ですが、それ以上に自分で勉強するのって大事です。
採用面接でもかなりの確率で「学校の授業以外に勉強していることは?」って訊かれます。
みなさんC言語やC++については色々勉強しているかと思いますが、
他のプログラミング言語についてはどうでしょうか?

拍手[0回]

DirectXとOpenGL

どうも、大西(はかせ)です。久しぶりに記事を書いてみました。
今回は2・3年生向けにDirectXとOpenGLの違いにちょっと触れてみたいと思います。
2年生は夏休みの面接練習でDirectXとOpenGLの違いを説明できますか?みたいな質問をされたり、
ゲーム会社に行った先輩達からは「PS3とかで開発したいんだったらOpenGLやっといた方が良いよ」
みたいな話を聞くっていうのを松尾先生から聞いた人もいるんじゃないでしょうか?

何でかっていうと、DirectXはWindows環境に強く依存するので
PCゲームやXBox360などはこれでいけますが、
他のハードだとOpenGLESベースのものが多いからです。
そんな訳でDirectXとOpenGLの違いを説明しようと思うのですが、
皆さんこの2つの違いっていくつ知ってます?

拍手[0回]

2・3年生向け記事


どうも、本編初登場の大西( はかせ )です。
C++やシェーダー以外にもC#とかいろんなツールいじったり手広くやってます。
今までコメント欄だけだったのですが、記事を書いた順番がドベだけは避けたかったので…
( これで記事書いてないの上原といいんちょだけだよねって煽ってみたり。 )

今回は2年生向けに( 3年生にも通じる部分もある )プログラムのアドバイスなんかをしようと思います。
現在、2年生はJavaでゲームを作っていると思います。そこでいくつかコード例を挙げます。

 

拍手[0回]

自分の武器を探せ、作れ!


こんにちは、広報の城間です。

前回、自分の武器について考えようと言いましたが、みなさんどうですか?
自分自身だけが持ってる武器はありましたか?

特に2年生にとって就職活動が本格的に始める前に自分の武器について知っていなければPRすることもできず、周りと差をつけられてしまいますよ。
まだ何もないのはやばいと実感した方がいいですね。
しかし、今から勉強すれば制作がおろそかになる可能性がありますので、頭のいい人以外はゲームを完成させるのに時間を費やした方がいいでしょう。
技術もひつようですが、一番は完成させる(最後までやりこむ)力ですからね。
最悪、知識はなくとも興味を持ってそれに関わる情報収集は欠かさないでください。

一年生はプログラムを始めたばかりの方が多いと思うので、いろいろと情報収集して自分に合ったものを選択するといいんではないでしょうか。


ここで一つ疑問が上がると思います。
問  就職活動ではどういった技術が有効に働くのか?

答え  なんでも有効に働く。


↑アバウトですね。
ですか、言葉通りなんですよ。
企業さんによって少し異なりますが特に、何かに特化したレベルの技術力があればなおいいみたいです。

なので・・・・・好きなのを学びましょう。(適当ですね)

よくある技術
物理エンジン
シェーダー
AI
会話力(面接力) *これだけは全員が養ってほしい力です。無くては内定までたどり着けないでしょう

参考になると思いますのでぜひ見て回ってください。
Wiki Game Develop

誰にも負けない武器を持って、がんばりましょ。


それでは、みなさん。
セイ、ピーース♪~(^o^)

拍手[0回]

グッバイ・セグメンテーションエラー ~ Linuxでのデバッグ

こんにちは柴崎です。

Linuxの授業で作ったプログラムがエラーで落ちる時に役立つデバッグ法を紹介します。


拍手[0回]

コーディング

今回は、プログラミング中の些細なことについて説明します。
また、共同開発においても重要ですよ!

些細なことというのは、コーディングルールです。
コーディングルールというのは、ソースコード中での決まり事で
統一性が出て、可読性や保守性が高まります。
コーディングルールの一つである、
ソースコード中でのルールを説明していきたいと思います。

中括弧の位置について
例えば条件分岐の際の中括弧の位置は

if( i == 0 ) {
} else if( i == 1 ) {
}

if( i == 0 ) {
}
else if( i == 1 ) {
}

if( i == 0 )
{
}
else if( i == 1 )
{
}

色々なパターンがあり、人それぞれだと思います。
また、中括弧だけではなく
if (i == 0)
ifと小括弧の位置にスペースを空けたりや
小括弧の始まりと終わりはスペースを空けたり空けなかったりと
色々決めることが出来ます。
他にもfor文やインデント、演算子等様々な所で
ルールを決めることができます。
そうすることにおいて、自分のソースコードが見やすくなる事に繋がります。
共同開発においても、ルールを守ることで
統一性が出てデバッグ効率を上げる事にも繋がるかもです。

些細なことですが、続けることで役に立つ事なので
今からでもやってみましょう!

拍手[0回]

ツール開発

ども・・・・・・・・・・・・GES会長の和佐田雅史です。
今日はC#とWindowsAPIにおけるツール開発ついてです。


皆さんはツールを開発する際に恐らくWindowsAPIを使う人が殆どだと思います。

C++言語でWindowsAPIを利用してツール開発を行う。
確かに授業でもやってます。


しかし開発効率をとるのならば、C#で組むべきです。
C#はunsafecode( ポインタを利用したソースコード )というプログラムを書かない限り絶対にメモリーリークはしません。(ポインタを使わなくてもいいように作られています)


それに、VisualBasicのようにツールボックスから色々とカスタマイズ出来、リソースを追加してどうこうするWindowsAPIよりは遥かに効率的です。


では3Dのツールを作りたい場合はどうするのか?
C++で組んでいる方ならDirectXを真っ先にあげると思いますが正にそのDirectXを使うのです。

C#にはManaged DirectXというC#のDirectXがあり、これを利用すれば3DMapEditorやMotionTool等が作成出来る様になります。
( C++のDirectXと一緒にインストールされます )


ただ、Managed DirectXは残念ながらやっている人自体が極めて少ない技術です。
基本的にはC++のDirectXと変わりませんが、困った時は海外サイトもしくは洋書を読むなりして独自に解析していくしかありません。


また、企業ではC#でツールを作る所が増えてきています。

これからツールを作ろうと思っている人はC#を勉強する事をお勧めします。
( javaやj#が出来る人なら出来ると思いますが・・・・・ )


それではお疲れ様でした。

拍手[0回]

DLLにしてみようぜっ?

ども、こんばんわ~

寝不足で頭痛が酷いZAKIです

忙しくなってきましたよ~

ふ、ふふふwがんばるぜっw

ブログのネタがあれども、書いてる時間が無いっ

そろそろ今書いてるブログメンバーじゃ更新がきつくなってきましたw

1年生のあいつとか、2年生のあいつとか、書いてくれないかなぁ~?かなぁ~?


さて、今回のテーマは「DLLにしてみよう!」です。

DLLって聞いたことあるでしょうか?

ダイナミックリンクライブラリ(Dynamic Link Library)の略なんですが、

これを使うと何がいいのか?

それは本編を見てのお楽しみw

サンプルソースはこちらっ

C++_DLLTestはクラスをDLLにしたものです。

dglib_DLLTestはdglibを使った関数をDLLにしました。

拍手[0回]

メモリリークを簡単に探そう

ども、こんばんわ~

最近こたつが恋しいZAKIです

部屋が狭くてこたつ置けないんですよねぇ…

いいなぁ、こたつ…


さて、今回のテーマは「メモリリークを探せっ!」です。

メモリリークとはプログラム中で確保したメモリ(画像データ、new,mallocなど)を開放し忘れて残してしまうことです

こいつが残り続けるとどんどん使用可能メモリが無くなってOSがフリーズすることがあります(一回ありました

探すにも一つずつコードを調べていくのも面倒。

そこで!プログラムで表示させちゃいましょー!
 

拍手[1回]

シーン制御

ども、こんばんわ~

さっき最後まで記事を書いたのに、ブラウザが落ちて記事が消えてしまったZAKIです

涙をこらえながら書き直そうと思います。


さてええぇぇぇぇ今回のおおおおぉぉぉぉテーーーーーーマはああああぁぁぁぁあぁぁぁぁ

シーン制御です。

すんません。マジで悔しいんですorz

さて、シーンとは何でしょうか。

シーンとは、タイトル、キャラセレクト、ゲーム、ゲームオーバー、などなど、ゲームの場面を指します

皆さんはどんな感じで管理していますか?

while(1) {
  if(sceneNo == 0)  {
     Title();
  } else if(sceneNo == 1) {
    CharaSelect();
  } else if(sceneNo == 2) {
    Game();
  } else {
    break;
  }
}

こんな感じですか?

出来てるといえば出来ていますが、Game()関数を実行するとき毎回3回if判定が起こりますね

メインループだけに無駄な処理は避けたいところです

それを防ぐにはいろいろと使い回しの効く憎い奴を使います

そう、ポインタです。

しかも、関数ポインタです。

ああ引かないで待ってがんばるから僕がんばって説明するからぁ

続けて読んでもらえる人。ありがとう。

読んでくれない人、コノヤロウ。

関数ポインタとは関数のアドレスを入れるポインタ変数のことです

関数ポインタの定義はサンプルではmain.hの38行目でやっていますね。

typedef  void *(*LPSCENE)();

この行がそうです

typedefとは新しい型の定義を行います。

この場合はLPSCENEという自作の型を作っています。

説明すると結構長くなるので、詳しくは教科書、ネットで見てみてください。

あ、C言語の教科書あれは必携ですよ

みんな邪険にしますが、あれ見ればほっとんどのことが書いてあるので、実習中は持ってくことをオススメしますよ

あ、すいません。話を戻しますね

残りの部分が関数ポインタの宣言です

この場合は「void *型を返す引数なし」の関数のポインタです。

(*LPSCENE)が型の名前です

typedefが無ければこの部分は、変数名になります

()内の*はポインタであることをさします。

詳しくは教科書およびネットで(ry

関数ポインタ変数の宣言はmain.cppの18,19行目で行っています。

これをシーンの制御に使うので、これをシーン変数と呼びましょう

それじゃ、シーン制御の全体の流れを説明します

  1. シーン変数に最初に処理をする関数のアドレスを入れる(main.cpp 95行目)
  2. シーン変数の中の関数を実行する(main.cpp 112行目)
  3. 2で実行した関数の戻り値をシーン変数に代入しなおす(main.cpp 112行目)
  4. 中身がNULLならループを終了(main.cpp 113行目)
  5. 関数のアドレスなら2へ戻る

と、こんな具合になります

main.cppの112行目pNowLoop()の前に(LPSCENE)としているのはキャストと言う処理です

この場合の意味はpNowLoop()の戻り値(void *型)をLPSCENE型にしろってことです。

戻り値を代入する変数と戻り値の型が全然違うのであわせてやるわけです

ちなみに、void *型は何でも型です

どの型のアドレスでも入れれます

それを任意の型へキャスト変換して使うというのは、ポインタ系の処理ではよくあることなのですが、

型が自由に変えれてしまうため、あまり好ましくはありません

できるなら、使わないほうがいいのですが、いい方法が見つからなかったので使っています

良い子のみんなはいい方法を探してみてね

あとは、各シーン関連の関数で次に処理をさせる関数のアドレスを返してやります

関数のアドレスをさす場合は関数名のみ(()を付けない)とするとアドレス参照できます。

変数でよくやる「&a」と同じような意味です

さて、この方式の場合の制約は、

全てのシーン関連関数はシーン変数の型定義に従わなければならない。(この場合はvoid *を返す引数なし関数)

関数の戻り値は次の処理をする関数のアドレスでなければならない。

です。

このルールを守っておけばこの方法を使うことが出来ます

ちなみに、サンプルではシーン変数を二つ使っています

pNowReleaseは常に初期化に対応した開放関数を保持しておきます

こうすると、初期化処理で失敗して関数でNULLを返した場合、

メイン関数の最後で任意の関数の開放を呼ぶことが出来ます。

そうして、開放忘れを防いでるわけですね

ただ、この場合、正常にループを抜けた時は2回開放関数が呼ばれることになります

それ用の処理を開放関数にしておかないと、同じ変数を2回開放することになっちゃいますよ

追記:dglib始めました。

いきなりVSでって何を考えてるんだ僕は…orz

dglib版をアップしておきました

VS版とは少し違いますが、やり方は一緒です

dglib版の分割コンパイルバージョンでは、各シーンでアニメーションの基本ぽいことをやっています

悩んでいる人は一見の価値ありかも



ふぅ、一応、シーン制御の項目は以上です

前回以上にめちゃ長いですね

分けて丁寧に説明したほうがよかったんですが、

なにぶん、時間が……orz

質問はいつもどおり、コメント、リアル(実習室など)で受け付けています

わからなかったら突撃してみてください

それでは、今回はこの辺で。

あでゅーノシ

 

拍手[0回]

分割コンパイル

ども、こんにちわ~

ここまで来たら割とやけなZAKIです

意味の無い意地を張っています


さて、今回のテーマは「分割コンパイル」です。

ブログタイトルに釣られた人。

どんまい

毎度おなじみサンプルファイルはこちら

大西先生が便利なものを作ってくださってているお陰で、コンパイルのやり方自体は簡単です

いつもcl2にソースファイルを足すだけです

cl2 test.c bunkatu.c dglib.obj

と、DOS窓に書けばコンパイルできます。

それでは、分割したソースの中を解説していきましょう

まず、bunkatu.cから。

1行目にbunkatu.hをインクルードしていますが、今の時点でこれは無くても大丈夫です。

6行目、グローバル変数ですが、staticがついていますね。

この場合、g_cnt変数はのソースからアクセスできなくなります

なので、この変数が原因でバグが出たときは、このソースを調べるだけで済みます

その下の関数も同じ意味で、

バグが出てもその関数を読んでいるのはこのソースのみなので、デバッグが楽になります

その下の2行続いて関数が書いてあるのはプロトタイプ宣言です。

関数が沢山になってくると、他の人が下のほうまで関数を見ていくのは大変です

なので、プロトタイプ宣言でどんな関数があるかを明記しておくとわかりやすいのです

ちなみに、この二つにはstaticがついていないので、外部のソースで呼ばれる可能性があることがわかります

外部からは呼ばれないものにはstaticを付けるというルールがあると、必然的にそういうことがわかるので、

関数を追いかける必要もなくなります

こういうルールを決めた書き方はチーム製作ではオススメです

あとの関数の中身はテスト用なので適当です。

次はbunkatu.hを見てみましょう。

.hのつくソースファイルは「ヘッダ」と呼ばれます。

ソースファイルの頭でインクルードされるのが語源です。

……嘘です

まず、1行目。

これはコメントの通り、1つのソースで1回しかこのヘッダを読まないようにしています

externの宣言しか書いてない場合は大丈夫ですが、

構造体の宣言、define等が書いてあると、インクルードしたソース内で2回これが定義されることになるので、

同じのが2個あるぞーっとコンパイラに起こられます

#pragma onceがあるとこれをコンパイラ防いでくれます

ちなみ、VisualStudio(VC++)のコンパイラ(CLコンパイラ)でしか使えないので、要注意です

さて、その下のexternの関数宣言。

externとはその後ろのものがどこかにあるよー」という宣言です。

なので、その関数を使っているソースで、「そんな関数しらないぞ」というエラーを防げます

ちなみに、staticとexternを同時には使えません

まぁ使用用途をみれば大体わかりますよね

基本的にヘッダはソースファイルと同じ名前にすることが多いです

そのほうが、ヘッダからソースの内容がわかったり、名前からどのソースの宣言があるわかりやすいからです。

あとは、ヘッダを目的の(関数を使いたい)ソースへインクルードしてやれば関数が使えるようになります

VisualStudioプロジェクトのほうでもやり方は一緒で、コンパイル時は普通にF5などを押してやれば動きます。

よくあるエラーについて補足。

未解決の外部シンボル _drawCntが関数 _Main で参照されました。

こういうエラーを僕はリンクエラーとよんでいます。

ソースファイルをコンパイルした後に複数のソースファイルの内容をまとめる作業(リンク)するときに起こるエラーです

コンパイルが終わった後に起こるということは、文法的には間違っていないので、

#includeなど、ヘッダ系でエラーを探します

この場合はmain()関数の中でtest.cが知らない関数(drawCnt)を見つけたときに起こります。

原因としては、
  • cl2をするときにbunkatu.c(main関数の書いてないソースファイル)を付け忘れている
  • test.c(main関数の書いてあるソース)でbunkatu.hをインクルードしていない
  • (または、ソース内でextern修飾子つきのdrawCnt関数のプロトタイプ宣言をしていない)
って、感じだと思います。

なので、これを直してやれば、うまくいくはずです


と、こんな感じで分割コンパイルについて説明してみましたが、どうでしょうか?

わかりづらければ、どんどん質問してくださいね~

あと、GESメンバーならブログ記事で書いてくれてもいいです。

あ、それおもしろいかもw

わからないやつ vs 教えるやつ みたいな論争が起こったらおもしろいなぁ

まぁ、気軽に記事かいたってくださいw

それでは今回はこの辺で。

あでゅーノシ

拍手[0回]

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
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

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]