前書き
こんにちは~絶賛C++勉強中のひなるひです
この記事はほぼほぼずっとゲームを一人で製作してた人の、C++頑張って勉強していて壁にあたりまくっている人の現状を描いたものです。(まあ簡単に言うとややこしいものをほとんど勉強せずにひたすら避けてきた人の苦難を書いたものです。)
この記事が何の役に立つかは不明ですが...まあ同じ道をたどりそうな人への助言の参考として役立ててくれればいいかな(?)という感じです。
(ただ、↑に書いた通りまだC/C++は勉強中の身なので、だいぶその入り口のことしか書けない気がする&多分どっか間違えている可能性が高いので、その知識の浅さはご了承ください。
後、Adc書くのが初めてなので、内容の薄さはご了承ください。)
ちなみに僕が今まで使ってきた言語はVB,SmileBasic(プチコン),NS-Hu BASIC(ファミリーベーシック),HSPなどです。
1.ポインタなんてなかった
これがおそらく一番大きいです。(現在進行形)
僕は最近C++ができる友達に詰め寄って初歩の初歩を聞き出してきたところですが、今は聞いたところは完全理解達成したはずなんですけど、気持ち的にはその部分すらできない感がすごいです。
僕がやってきた言語がほぼほぼBASICを基にしたものばかりっということもあって全然接点がないものでした。(あるにはあるんですけど、僕が見たコード、やってきた範疇には一切出てこなかった…)
これ勉強しなかったときに何が危ないかっていうと、「ほかの人のコードを見て勉強しよう」というときに、ポインタとは何かをちゃんと知る前に「ポインタうっとうしい/難しい」というイメージが付きまとって、 いざ勉強しようとしたときに後回しの連続になってしまうこと です。何回も試みましたが、おそらくポインタは他の人のコードを見て、つけ刃てきに覚えることはできないです。今後どっかで問題になってくるので是非ちゃんと見て勉強、演習すべきだと思います(特に僕(汗))。
2.クラスとは
これは易しめの言語に特にありがちなんですが、クラスが用意されてなかったりするんです。そもそもそういう言語は大規模のプログラムが書かれることを想定していないがためにはしょった可能性が高いと思われるのですが、クラスをやったことない人にとってクラスを使えるようになることは簡単なことじゃないです。
確かにクラスの中でメンバ変数を用いて関数が使えることは理解できるんです。問題は private,publicの問題なんです 。大体の場合、privateにメンバ変数を入れて、publicにメンバ関数を入れる感じなんですが、その例が多いためかそういうもんだと思ってしまうんです。そもそも変数が使える範囲の管理がそこまで必要のない言語が簡単な言語には多いので(あっても関数内のみで使える変数か、グローバル変数なのかだけだったり)、private内の変数はどの範囲まで使えるのかなど、しっかり理解するのが必要ではないかと思います。後、これに関して疎い理由がもう一つあるとすると、例えばブロック崩しを作る際に「自機はx,yを用いて、ボールはbx,byの変数を用いて操作しましょう」という風に教えられるので、途中で「わかりづらい/もっとすっきりしないのか」と思わない限り、なかなか構造体を用いようとは思わないです。(あるいはxを使いまわしするとか…割と逃げ道はあるんです)
3.ファイルって分けるの?
…もちろん大体の言語にはシーンごとなどでファイルごとに分けて保存することはできます。(ちなみに存在しない言語も存在します。)ただ一人で開発をしていると、 別にファイル分ける必要ないなと思ってしまう のです。
その理由は大体3つほどあって、1つはファイルを分けなくてもゲームは作れるから必要性を感じない、2つ目はややこしそうに感じてしまうためです。そして3つ目は、そこまで大掛かりなゲームって僕みたいな人にはなかなか作れないので、そもそもファイルを分けないと困ることがなかったのです。(もちろん存在は知ってましたけど)なので、個人で小規模のゲームを作る場合なら考えなくてもいいと思うかもしれないのですけど、多人数でゲームを作る際にはほぼ確実にファイル分けないと死にます。そして、ファイル一覧機能があるおかげで、ファイル分けたほうがどこで何をしているのかが視覚的にわかりやすいのです。ので、僕は今割と後悔しています。(コードが割とぐちゃぐちゃになって、後から読むのがいつも嫌で仕方なかった)
後、ヘッダーファイルの存在はC/C++で初めて知りました。(C/C++を、他の言語ある程度勉強してから触り始めた時も、あまり使おうとは思わなかったのですが…)
4.記号多くない!?
C++はBASICなどの言語と比べると、 記号が多いです。(記号の種類が多いというよりも、1つの記号に対する用途が多い…など)
例えば「1.ポインタなんてなかった」で紹介したように、ポインタがあまり出てこないので、ポインタ関連の記号が使われることがあまりないです。(vectorの<>もそう)
ifの省略形もおそらくないです。(「?:」←これ)
::もおそらく存在しません。
問題なのは、記号を単に覚えてないという知識量の問題以上に、他の言語では記号を使わない場面で記号を使うことが割とよくあることから、各々の記号に慣れにくいんです。なので、「1.ポインタなんてなかった」と同様に、十分勉強してない状態で他人のコードを見たときに、自分の常識の範囲外のところに記号が羅列しているので、困惑しかしないです。
おまけ
1.gitの存在自体知らなかった
git講習会にて初めて存在を知りました。gitはどういうものかは割と理解できるのですが、使わないと「どれをどう選択して次どうすればいいのか」を、普通にブランチを切ってpushして、プルリクエストを送る作業だけでも覚えづらいです。よく言われるのが「 masterにpushするな 」っていうことなんですけど、sourcetreeで、ちゃんとブランチ切ってpushしたのを初めてみると、あたかもmasterにpushしたような図に見えてしまうのがネックです。(僕だけですかね?)
2.C/C++できるっと思い込む
C/C++初心者が思い込みやすいものらしいです。(僕にもかつてそういう時期があった、…てか大学入ってからも言ってた気がする(汗))
自信がある分にはいいんですが、こうなるとそれ以上のことを覚えようとしなくなってしまうんですね。(しかもこういう人に限って割と覚えるべき重要なことを抜かしている気がします)
正直に言うと、この状態の時って割と気分はいいです...w
まとめ
だいぶ上から目線で書いてしまったことは申し訳なかったと思います。もしこれが何かの役に立てればいいなと思います。あと、これを機に僕も足りない基礎をちゃんと埋めていこうかなと思います。ただ、逆に言うと僕が今まで使ってきた言語や他の言語はそのようなことを考えずに(逆に言うと使えない場合があって困ったりするんですが)気軽にプログラミングできる利点を持っているので、これを機に触ってみてはいかがでしょうか。今まで使うのが面倒くさかった命令などが簡略化されたりしていて、個人などでささっとプログラミングする分には割と向いてるんではないかと思います。
どの言語でも、どのような使い方ができるかは個人が考え付く範疇では、なかなかその言語の特徴を生かすのは難しいんだなと思いました。だからこそ、他の人のコードを参考にする、ちゃんと勉強するのって、重要じゃないかと僕は思います。
明日はHF担当の記事です、お楽しみに!