構造体に関する理解が浅かったですね。
実は最近、時間のあるときにC++の勉強もしています。
と言っても、入門用のサイトを読む程度で、実際にC++でプログラムを書いたりしているわけではないんですが。
まあ、やはりオブジェクト指向とかの知識を欲すると、C言語の拡張版であるC++に興味が行くわけです。
で、その中で、C++の中核をなす機能であるクラスについて読んでいて、自分の構造体に関する理解の浅さに気付きました。
C++におけるクラスとは、C言語における構造体の機能を拡張する事でオブジェクト指向プログラミングを可能にすると言う考え方で、これを勉強すると副産物として『Cの構造体とは何か』をより深く知る事が出来るなあと感じました。
中級以上の人達には何を今さらな話なんでしょうけども。
構造体とは、扱うオブジェクトに必要な様々な型の変数をまとめて一つの変数のように使う(宣言する)機能なんだなと。
typedef struct {
メンバ変数;
} 型名;
型名 変数名;
とやって構造体を使っていたのですが、最後の行の意味がわかっていませんでした。
最後の行は言わば、
int x;
ってやってるのと同じ事なんですね。
つまり、変数を宣言するように構造体に名前をつけて宣言しているわけです。
その有効範囲は変数と同じように宣言されたスコープ内になるのでしょう。
僕は宣言まで含めて一括りで覚えたために、構造体は同じようなメンバ内容でもオブジェクトごとに作り、全てグローバルで宣言していました。
理解が深まると自分が公開していたソースの拙さが恥ずかしくなります・・・。
まあ、そうなる事は最初からわかっていて、その過程も隠さず見せる方が同じような初心者の人にはわかりやすいと思ったからやっているわけですけども。
具体的に言うと、現状で僕のソースは自機、敵機、敵弾、自機の波動砲、フォースと、画面上に表示するオブジェクトに関して、必要なデータは似通っているにも関わらず、個別に構造体を作っています。
座標(x、y)や、ベクトル(x、y)など、そのメンバ変数はかぶりまくっています。
おそらくこれらは、一番メンバ変数の多い敵機の構造体をキャラクターデータ型として統合し、皆で共有する方がソースは単純になるはずです。
typedef struct {
メンバ変数(座標とかベクトルとか);
~内容は敵機の構造体~
} charadata;
charadata Jiki, JikiShot, Teki, TekiShot, Force;
これで、いけると思います。
「ばかだなあ、俺・・・」と思うと同時に、勉強の成果なんで嬉しくも感じます。
今回、何が言いたいかというと、「気が向いたらC++もやっとけ」と。
他の言語でもいいんでしょうけど、とにかく自分の使っている言語以外の勉強をする事で、メインで使っている言語の理解がより深まる事ってあるんだなあと思ったわけです。
今回、C++でクラスの概念を知った事がC言語における構造体の理解を深めた様に、他のオブジェクト指向型言語を軽く勉強する音でC++におけるクラスやオブジェクト指向に関する理解を深められるんだろうなと容易に想像できます。
趣味でプログラミングをやっている人なんて、レベルの違いがあっても、おおよそ利害関係を度外視して勉強好きな方が多いとは思いますが、ホント、こういうことがあるから勉強って面白いですよね。
実は最近、時間のあるときにC++の勉強もしています。
と言っても、入門用のサイトを読む程度で、実際にC++でプログラムを書いたりしているわけではないんですが。
まあ、やはりオブジェクト指向とかの知識を欲すると、C言語の拡張版であるC++に興味が行くわけです。
で、その中で、C++の中核をなす機能であるクラスについて読んでいて、自分の構造体に関する理解の浅さに気付きました。
C++におけるクラスとは、C言語における構造体の機能を拡張する事でオブジェクト指向プログラミングを可能にすると言う考え方で、これを勉強すると副産物として『Cの構造体とは何か』をより深く知る事が出来るなあと感じました。
中級以上の人達には何を今さらな話なんでしょうけども。
構造体とは、扱うオブジェクトに必要な様々な型の変数をまとめて一つの変数のように使う(宣言する)機能なんだなと。
typedef struct {
メンバ変数;
} 型名;
型名 変数名;
とやって構造体を使っていたのですが、最後の行の意味がわかっていませんでした。
最後の行は言わば、
int x;
ってやってるのと同じ事なんですね。
つまり、変数を宣言するように構造体に名前をつけて宣言しているわけです。
その有効範囲は変数と同じように宣言されたスコープ内になるのでしょう。
僕は宣言まで含めて一括りで覚えたために、構造体は同じようなメンバ内容でもオブジェクトごとに作り、全てグローバルで宣言していました。
理解が深まると自分が公開していたソースの拙さが恥ずかしくなります・・・。
まあ、そうなる事は最初からわかっていて、その過程も隠さず見せる方が同じような初心者の人にはわかりやすいと思ったからやっているわけですけども。
具体的に言うと、現状で僕のソースは自機、敵機、敵弾、自機の波動砲、フォースと、画面上に表示するオブジェクトに関して、必要なデータは似通っているにも関わらず、個別に構造体を作っています。
座標(x、y)や、ベクトル(x、y)など、そのメンバ変数はかぶりまくっています。
おそらくこれらは、一番メンバ変数の多い敵機の構造体をキャラクターデータ型として統合し、皆で共有する方がソースは単純になるはずです。
typedef struct {
メンバ変数(座標とかベクトルとか);
~内容は敵機の構造体~
} charadata;
charadata Jiki, JikiShot, Teki, TekiShot, Force;
これで、いけると思います。
「ばかだなあ、俺・・・」と思うと同時に、勉強の成果なんで嬉しくも感じます。
今回、何が言いたいかというと、「気が向いたらC++もやっとけ」と。
他の言語でもいいんでしょうけど、とにかく自分の使っている言語以外の勉強をする事で、メインで使っている言語の理解がより深まる事ってあるんだなあと思ったわけです。
今回、C++でクラスの概念を知った事がC言語における構造体の理解を深めた様に、他のオブジェクト指向型言語を軽く勉強する音でC++におけるクラスやオブジェクト指向に関する理解を深められるんだろうなと容易に想像できます。
趣味でプログラミングをやっている人なんて、レベルの違いがあっても、おおよそ利害関係を度外視して勉強好きな方が多いとは思いますが、ホント、こういうことがあるから勉強って面白いですよね。
PR
開発環境をインストールして、モチベーションキープのためにこのブログを立ち上げて、1週間がたった。
この1週間、平均睡眠時間は3時間くらいかと。
みごとにハマってます。
空いた時間はほとんどPCと睨めっこ(笑)。
プログラムしてる時は集中しているから平気なんだけど、仕事中がやばい・・・。
本職に影響しない程度にしとかないとね。
で、迷っていた今後の方向なんだけど。
取り合えずテキストの方はいったん中断する事にした。
2つの事を同時に進められる時間も脳みそも無いし、素直にやりたい方を取った方がモチベーションもキープできるだろってことで。
テキストの方はアクションゲームを題材にしているので、実際アクションゲームを作る時が来たら(来るのか?)また進めてみようと思っております。
ま、それ以外にも調べたいことがある時のリファレンスとしても使えるだろうし。
と言うわけで、ぷよぷよの再現にチャレンジしてゆこう!
おそらく壁に当たりまくるだろうけど、そのつど調べて知識を得てゆけば力も自然についてくるだろう。
と言っても、僕の持っているテキストは今回買ったやつだけなんで、C言語の知識の引き出しを先に見つけておいた。
1つは導入したDXライブラリのHP。
もう1つはネットしてて見つけた『苦しんで覚えるC言語』と言うサイト。(ブログのリンクに追加しておいたので、知らなかった方は覗いて見てください。かなり有難いサイトです。)
この1週間、平均睡眠時間は3時間くらいかと。
みごとにハマってます。
空いた時間はほとんどPCと睨めっこ(笑)。
プログラムしてる時は集中しているから平気なんだけど、仕事中がやばい・・・。
本職に影響しない程度にしとかないとね。
で、迷っていた今後の方向なんだけど。
取り合えずテキストの方はいったん中断する事にした。
2つの事を同時に進められる時間も脳みそも無いし、素直にやりたい方を取った方がモチベーションもキープできるだろってことで。
テキストの方はアクションゲームを題材にしているので、実際アクションゲームを作る時が来たら(来るのか?)また進めてみようと思っております。
ま、それ以外にも調べたいことがある時のリファレンスとしても使えるだろうし。
と言うわけで、ぷよぷよの再現にチャレンジしてゆこう!
おそらく壁に当たりまくるだろうけど、そのつど調べて知識を得てゆけば力も自然についてくるだろう。
と言っても、僕の持っているテキストは今回買ったやつだけなんで、C言語の知識の引き出しを先に見つけておいた。
1つは導入したDXライブラリのHP。
もう1つはネットしてて見つけた『苦しんで覚えるC言語』と言うサイト。(ブログのリンクに追加しておいたので、知らなかった方は覗いて見てください。かなり有難いサイトです。)
やっぱ、このテキストは便利すぎる気がする。
ゲームで使う色々な関数が書かれたcppファイルをダウンロードして使うってのが楽ではあるんだけど、いずれこの中身を自分で解析してみないと、自分の力にはならないかと。
ちなみに、前の記事で書いたベクトル計算も、アニメーションも、1フレームの時間管理も、この関数ファイルがやってくれている。
甘えすぎじゃなかろうか・・・。
まあ、わずらわしい事は置いてといて、ゲーム作りの根幹部分に集中させるって意図だと思うんだけど。
で、昨日書いたテキストとは別のゲーム制作なんだけど。
とりあえず最初は既存のゲームを再現してみようかなと思っています。
もちろんテキストの便利ライブラリは極力使わない方向で。
シンプルなものが良いと思うので、落ち物パズルなんかどうだろ。
『テトリス』か『ぷよぷよ』か迷うとこなんだけど、テトリスは中学生か高校生のころBASICで再現しようとして挫折したトラウマがあるので、今回は回避しようと思います(笑)。
ってわけで、ぷよぷよが第一候補。
出来るかな・・・。
出来そうな気はするんだよなあ。
連鎖時も含めて同じ色がつながった時の判定がうまく出来るかが肝だと思う。
これが出来れば完成できるだろうし、出来なきゃテトリスと同じ道を・・・w。
とりあえず、どんな要素でゲームが構成されているか思いつく限り書き出して、一つ一つコードでの表現方法を考えてみよう。
テキストの方は急いでやるけど、こっちはのんびり進めます。
ゲームで使う色々な関数が書かれたcppファイルをダウンロードして使うってのが楽ではあるんだけど、いずれこの中身を自分で解析してみないと、自分の力にはならないかと。
ちなみに、前の記事で書いたベクトル計算も、アニメーションも、1フレームの時間管理も、この関数ファイルがやってくれている。
甘えすぎじゃなかろうか・・・。
まあ、わずらわしい事は置いてといて、ゲーム作りの根幹部分に集中させるって意図だと思うんだけど。
で、昨日書いたテキストとは別のゲーム制作なんだけど。
とりあえず最初は既存のゲームを再現してみようかなと思っています。
もちろんテキストの便利ライブラリは極力使わない方向で。
シンプルなものが良いと思うので、落ち物パズルなんかどうだろ。
『テトリス』か『ぷよぷよ』か迷うとこなんだけど、テトリスは中学生か高校生のころBASICで再現しようとして挫折したトラウマがあるので、今回は回避しようと思います(笑)。
ってわけで、ぷよぷよが第一候補。
出来るかな・・・。
出来そうな気はするんだよなあ。
連鎖時も含めて同じ色がつながった時の判定がうまく出来るかが肝だと思う。
これが出来れば完成できるだろうし、出来なきゃテトリスと同じ道を・・・w。
とりあえず、どんな要素でゲームが構成されているか思いつく限り書き出して、一つ一つコードでの表現方法を考えてみよう。
テキストの方は急いでやるけど、こっちはのんびり進めます。
左右に向きを変えながら走る。(状況によって画像を反転)
静止状態からジャンプする。
走りながらジャンプする。
これらのアクションが出来るようになった。
キャラクターの動きには方向(X 成分・Y成分)と速度(ピクセル/秒)を表すベクトルを使う。
ジャンプ中は常に下方向に重力ベクトルを加算するため、飛び上がった瞬間から上昇方向の速度は減少し、頂点を境にマイナス方向(落下方向)となる。
あとは、地面の位置となるY座標を設定して、キャラがそこで接地するようになった。
ベクトルなんて懐かしい響き。
物理の授業を思い出したよ。
ゲームのアクションなんて、動く時の座標を操作して、それっぽく見せてるだけかと思ってたけど、ちゃんとベクトル使って重力の計算とかしてるんだね。
ビックリだ。
実行ファイルをアップローダにアップしときました。
触ってみたい方はアップローダの管理者に感謝しつつ、ご自由にどうぞ。
http://u7.getuploader.com/game/download/26/%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.zip
リンク先を少し下にスクロールさせると出てくる『同意する』ボタンをポチっとすれば、ダウンロードできます。
ポップアップブロックされた場合はウィンドウの上にある情報バーをクリックして『ファイルのダウンロード』を選んでください。
ファイルは圧縮されたzipファイルです。
Lhacaなどで解凍してから、フォルダ内のexeファイルをダブルクリックで実行できます。
矢印キーの左右でキャラクターが走り、Zキーでジャンプします。
Escキーでプログラムを終了します。
静止状態からジャンプする。
走りながらジャンプする。
これらのアクションが出来るようになった。
キャラクターの動きには方向(X 成分・Y成分)と速度(ピクセル/秒)を表すベクトルを使う。
ジャンプ中は常に下方向に重力ベクトルを加算するため、飛び上がった瞬間から上昇方向の速度は減少し、頂点を境にマイナス方向(落下方向)となる。
あとは、地面の位置となるY座標を設定して、キャラがそこで接地するようになった。
ベクトルなんて懐かしい響き。
物理の授業を思い出したよ。
ゲームのアクションなんて、動く時の座標を操作して、それっぽく見せてるだけかと思ってたけど、ちゃんとベクトル使って重力の計算とかしてるんだね。
ビックリだ。
実行ファイルをアップローダにアップしときました。
触ってみたい方はアップローダの管理者に感謝しつつ、ご自由にどうぞ。
http://u7.getuploader.com/game/download/26/%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.zip
リンク先を少し下にスクロールさせると出てくる『同意する』ボタンをポチっとすれば、ダウンロードできます。
ポップアップブロックされた場合はウィンドウの上にある情報バーをクリックして『ファイルのダウンロード』を選んでください。
ファイルは圧縮されたzipファイルです。
Lhacaなどで解凍してから、フォルダ内のexeファイルをダブルクリックで実行できます。
矢印キーの左右でキャラクターが走り、Zキーでジャンプします。
Escキーでプログラムを終了します。
- ABOUT
やってやれないことはないっ!たぶん・・・
- カレンダー
04 | 2024/05 | 06 |
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 | 31 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
49
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析