前回:Visual StudioとC#を初めて使ってブロック崩しゲームを作ってみた③
前回で一応完成していますが
今回はさらにゲームっぽくする為、機能追加します。
アウトライン
- 設定ボタン追加
- カウントダウン開始3秒
- 経過中タイム表示
- CLEAR表示(動きを付けたい)
- ランキング表示(アプリ起動中)
ディティール
- 設定ボタンの画面
- ボール加速 on/off(ラジオボタン)
- パドル移動距離 最大で1個分(スライドボタン)
CLEAR表示
気分でCLEAR表示作成から作っていきます!
JavaScriptで作れるようなポヨンポヨン動く文字を作りたかったのに
Windowsフォームじゃできない?みたいです。
なのでプロパティを活用して見た目をよくします。
CLEAR用のラベルだけ追加してサイズ、色、配置等はお任せです。
頑張っても古臭いデザインにしかなりませんでしたw
初期値でCLEARを入れているので、
ブロック数が1以上のときに文字を変更します。
以下をform3_loadメソッドに追加。
if(Form1.blockNum>0){label7.Text="NotGood..";label7.ForeColor=Color.Black;}カウントダウン開始
これも数字が縮小していって次の数字を出したかったのですが難しいので
いや縮小させるだけならタイマーでサイズダウンさせましょう。
Form1で以下ラベル作成
プロパティのFontでサイズを大きくします。これは48pt
追加コードは以下になります。
publicpartialclassForm1:Form{TimertimerCount=newTimer();//カウントダウンタイマーintcountSize=200;//カウント文字のサイズintcountNo=3;//カウント数publicForm1(){label1.Font=newFont(label1.Font.OriginalFontName,countSize+1);//カウントダウン初期表示サイズ指定//カウントダウン開始timer.Interval=100;timerCount.Tick+=newEventHandler(countDown);//timer.Trik:Timer有効時に呼ばれるtimerCount.Start();}privatevoidcountDown(objectsender,EventArgse){if(countSize==0){countNo--;label1.Text=countNo.ToString();countSize=200;}if(countSize==20&&countNo==1){timerCount.Stop();//ゲームスタートcountDownAfter();}countSize-=20;label1.Font=newFont(label1.Font.OriginalFontName,countSize+1);}privatevoidcountDownAfter(){//ゲームタイマーtimer.Interval=33;timer.Tick+=newEventHandler(Update);//timer.Trik:Timer有効時に呼ばれるtimer.Start();//経過時間スタートkeikaTime.Restart();}①まずカウントダウン用のタイマーを作成
②タイマー有効時に呼ばれるcountDownメソッドを作成
③countDownAfterメソッド作成。カウントダウン後にゲームを開始するので
ゲーム中のタイマーと経過時間処理をそこへ移動。
フォントの変更の仕方結構調べました。
この記事に感謝します。https://qiita.com/r-ngtm/items/276a6ee832bd32afed36
文字ボックスのサイズを小さくしているので値が小さくなるにつれて
左上に寄ってしまいます。
画面のXY軸を半分にすると画面の中心になります。
そこからカウントダウンのラベルサイズの半径を引くと
画面の中心に表示されるように「なります。
Form()とcountDown()でラベルをnewで作り出した後に位置を指定します。
「label1.Left」と「label1.Top 」の2行をそれぞれに追加します。
publicForm1(){label1.Font=newFont(label1.Font.OriginalFontName,countSize+1);//カウントダウン初期表示サイズ指定label1.Left=(this.Width/2)-(countSize/2);label1.Top=(this.Height/2)-(countSize/2);・・・privatevoidcountDown(objectsender,EventArgse){label1.Font=newFont(label1.Font.OriginalFontName,countSize+1);label1.Left=(this.Width/2)-(countSize/2);label1.Top=(this.Height/2)-(countSize/2);「コントロール名.Left」でX軸、TopでY軸を位置指定できます。
ラベルの四角い背景が後ろと被らないように透明にします。
Form1()のlabel1.Top処理の下に書きます。
label1.BackColor=Color.Transparent;//背景透明化経過中タイム表示
新しくタイマーを作るのも面倒だじ、
定期処理のUpdate()に追加します。
Form(){label2.BackColor=Color.Transparent;//背景透明化・・・privatevoidrealTime()//リアルタイム表示{label2.Text=keikaTime.Elapsed.ToString().Substring(6,6);}・・・privatevoidUpdate(objectsender,EventArgse){//リアルタイムrealTime();先ほどのlabel1の透明化処理の下にlabel2の透明化処理も書きます。
realTime()で表示するテキストを指定(リザルト画面の処理を丸パクリする)。
設定ボタン追加
ここでイメージしている画面は、スマホ版バトロワのエイム感度の設定画面
上の画面はタブ切り替えでページが切り替わります。
ユーザコントロールを利用してこれを作成します。
設定ボタンは後にして、先に設定画面を作ります。
Form4画面を追加します。
ツールボックス→すべてのWindowsフォーム→「TabControl」を画面に設置する。
テキストは対象タブを選択して、タブの画面エリア部をクリックし
そこからのプロパティでタブのテキストを変更できる(パドル距離・ボール加速)。
ツールボックス→すべてのWindowsフォーム→「TrackBar」を画面に設置する。
プロパティを変更します。Form4に記述するか、プロパティに直接打ちます。
trackBar1.Minimum = 1; //最小値
trackBar1.Maximum = 100; //最大値
trackBar1.Value = 50; //初期値
trackBar1.TickFrequency = 0; //メモリ刻む値
trackBar1.SmallChange = 1; //マウスで移動できる値
trackBar1.BackColor= Window; //とりあえず白く
trackBar1.TickStyle = Both; //つまみの形
参考→TrackBarの基本
メモリを刻むのは今どきダサいのでしませんw
以下のようになったはずです。
左右にボタン、下にラベルを設置します。
TrackBarのイベントを作成します。
プロパティ→イベント→MouseMoveにbar_Move入力。
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceBreakout{publicpartialclassForm4:Form{publicstaticintpaddleMove{get;set;}//パドル距離publicForm4(){InitializeComponent();label1.Text=trackBar1.Value.ToString();//距離初期値}//バー移動時privatevoidbar_Move(objectsender,EventArgse){label1.Text=trackBar1.Value.ToString();paddleMove=trackBar1.Value;}privatevoiddown_Click(objectsender,EventArgse){trackBar1.Value--;bar_Move(sender,e);}privatevoidup_Click(objectsender,EventArgse){trackBar1.Value++;bar_Move(sender,e);}}}Form2にて設定ボタン追加します。
プロパティのイベントのClickに「setting_Click」を入力しエンター押下。
以下の内容を追記
privatevoidoption_Click(objectsender,EventArgse)//設定押下時{// Form4のインスタンスを生成Form4form4=newForm4();// form4を表示form4.ShowDialog();}Form1のパドル移動処理(KeyPressed)を変更します。
privatevoidKeyPressed(objectsender,KeyPressEventArgse)//押下毎{if(Form4.paddleMove==0)//設定行っていない場合{Form4.paddleMove=20;}if(e.KeyChar=='a'&&paddlePos.Left>0)//A押下時{this.paddlePos.X-=Form4.paddleMove;}elseif(e.KeyChar=='s'&&paddlePos.Right<this.Width)//S押下時{this.paddlePos.X+=Form4.paddleMove;}}今回はここまで
残りは後日追記します。
未対応不具合メモ:
・スタート後画面閉じてもリザルト画面が表示される
・スタート前にパドル移動するとおかしな挙動
感想
ここまでお付き合いいただきありがとうございました!
Visual StudioとC#を使ってみて。
Eclipseより楽しいし簡単に作れる!
入門はJavaよりC#選ぶべきだったかも・・
ただWindowsフォームだとCSSとかJavaScriptがないのは不便。
動きを付けるのには向いてなく、
本当に業務システム向けだなって感じでした。
学びやすいからC#でスタートダッシュをして、
それから他の言語をやるのもありかと!
スコア毎にS~Dなどのランクをつけて表示するなど
色々いじって身につけるください!
1ファイルが長くなったり、ファイル数が増えてきたら
フォルダ―を追加したり共有ファイルを作ったりします。
実際の現場では何十何百とファイルがありますが
小分けにされているだけなので怖がらないように!
興味もない業務システム作るのはあんまり楽しくないなあ。。
(次の案件がVisual Studio(C#)...)





