ページ 11

ブロック崩し完成

Posted: 2010年6月03日(木) 21:54
by Ultimate
旧ハナブトオオトカゲです。
名前を変えてUltimateにしました。
これからも、少しでもUltimate(究極)に近付くよう頑張りたいと思います。

ところで、本題ですが、ついにhttp://www.play21.jp/board/formz.cgi?ac ... &rln=53238でもらった回答を参考に、自力でブロック表示と当たり判定などをやってブロック崩しができました。

次は、中級編に進むべきでしょうか?
それとも初級編までの知識を使って自分で何かを作って練習した方がいいでしょうか?

ちなみに、ブロック崩しのソースは以下のとおりです。
よかったらやってみて感想を教えてください。(多分1分もあれば終わります。)
特殊効果は
Iキーでバーが長くなる。
XとY同時押しでボール復活。
はじめてのDXライブラリの作品です。(初めて約1週間半と少しくらい)

#include "DxLib.h"

typedef struct
{
int x; //ボールX座標
int y; //ボールY座標
int dx; //Xスピード
int dy; //Yスピード
int r; //円の直半径
int flag; //発射フラグ
}ch_t;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);

ch_t ball;
ball.dx = 0;
ball.dy = 0;
ball.r = 5;
ball.flag = 0;

int blocksum=0; //壊したブロック合計
int block[4][8],blockflag[4][8],blockcolor[4][8];//ブロック表示のための配列
int bx = 270; //バーX座標
int by = 460; //バーY座標
int blong=100; //バーの長さ
int color = GetColor(255, 255, 255); //バー、ボールの色
char key[256]; //キー入力の配列
int ballmax=0,wcount=0,scount=0; //ボール発射関係
ball.x = 320; //ボールX座標
ball.y = 455; //ボールY座標
int i,j; //for文用


//ブロックの色設定
for(i=0;i<4;i++){
for(j=0;j<8;j++){
blockcolor[j]=GetColor(GetRand(255),GetRand(255),GetRand(255));
}
}
//ブロック初期化 表示フラグを1に
for(i=0;i<4;i++){
for(j=0;j<8;j++){
blockflag[j]=1;
}
}

while(ProcessMessage() != -1)
{
ClearDrawScreen();
GetHitKeyStateAll(key);
SetDrawBright( 255 , 255 , 255 );




if(key[KEY_INPUT_ESCAPE])
{
break;
}

// 発射
if(key[KEY_INPUT_SPACE]&&scount==0)
{
ball.flag=1;
ball.dx = 7;
ball.dy = -7;
scount=1;
wcount=0;
}
// バー移動と発射前ボール移動
if(key[KEY_INPUT_RIGHT])
{
if(ball.flag==0) ball.x += 8;
bx += 8;
}
if(key[KEY_INPUT_LEFT])
{
if(ball.flag==0) ball.x -= 8;
bx -= 8;
}

// バー移動範囲と発射前ボール範囲
if(bx > 640-blong)
{
if(ball.flag==0) ball.x = 640-blong/2;
bx = 640-blong;

}
if(bx < 0)
{
if(ball.flag==0) ball.x = blong/2;
bx = 0;

}
//特殊効果 Iキーでバーの長さを伸ばす
if(key[KEY_INPUT_I]==1) blong=200;
//特殊効果 XとY同時押しでボール数リセット
if(key[KEY_INPUT_X]==1&&key[KEY_INPUT_Y]==1){
ballmax=0;
SetDrawBright( 255 , 255 , 0 );
}
// ボールの移動 壁との当たり判定
if(ball.flag==1)
{
// 移動距離計算
ball.x += ball.dx;
ball.y += ball.dy;
// 移動範囲
if(ball.x < 5 || ball.x > 640 - 5)
{
ball.dx *= -1;
}
if(ball.y < 0)
{
ball.dy *= -1;
}
if(by <= ball.y && by + 10 >= ball.y && bx <= ball.x && bx + blong >= ball.x)
{
ball.dy *= -1;
}

}
//ブロックとの当たり判定

for(i=0;i<4;i++){
for(j=0;j<8;j++){
if(blockflag[j]==1&&ball.y-5<=i*30+30&&ball.y-5>=i*30&&ball.x>=j*82&&ball.x<=j*82+64){
blockflag[j]=0;
ball.dy *= -1;
blocksum+=1;
}
}
}
//ボールが下に落ちた時
if(ball.y>480&&wcount==0&&ballmax<3){
ballmax += 1;
wcount = 1;
ball.flag = 0;
ball.y = 455;
ball.x = bx+blong/2;
scount=0;
}
if(ball.y>480&&wcount==0&&ballmax==3) ballmax+=1;
//ブロック絵画
for(i=0;i<4;i++){
for(j=0;j<8;j++){
if(blockflag[j]==1){
DrawBox(j*82+5,i*30+10,j*82+64,i*30+30,blockcolor[j],TRUE);
}
}
}
//その他絵画
DrawBox(bx, by, bx + blong, by + 10, color, TRUE); // バー絵画
DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール絵画

if(ballmax<=3)DrawFormatString(0,460,color,"ボール残り%d",3-ballmax);//ボール残り数表示
if(ballmax==4&&blocksum!=32)DrawString(0,460,"GAME OVER",color,TRUE);
if(blocksum==32){
ClearDrawScreen();
DrawString(250,230,"ゲームクリアー",color,TRUE);
}
ScreenFlip();
}

DxLib_End();
return 0;
}


画像

Re:ブロック崩し完成

Posted: 2010年6月03日(木) 23:07
by ookami
ブロック崩しやってみました。

オーソドックスな感じで楽しめました!昔(windowsが無かったころ)、似たようなゲームを誰かからフロッピーでもらってプレイした記憶がよみがえって参りました。

しかし、ゲーム内容よりも、ソースコードが読みやすいのが印象的でした!
別スレで「見辛い」と書かれている方がいらっしゃいますが、私はとてもすんなり読めました。スタイルが近い感じがするのもあるでしょうが...
(強いて言えば、「絵画」でなく「描画」でしょうねwwww)

しかもリンク先を見ると中2だとか。
DXライブラリは1週間との事ですが、C++はいつからやっているのですか、とか聞いていいですかwwww
あと、このブロック崩しを作るにあたって、参考にされたサイトなどありましたら教えてもらえますか?

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 00:58
by ムンバ
こんばんは。

やらせて頂きました。
鈍(にぶ)いので1回目、30秒位でゲームオーバーになってしまいました。^^;
ブロック崩し、懐かしいですね~♪
出回った当時から、へたくそでした。(自爆

私が初めてやったブロック崩しは、駄菓子屋(だがしや)の中に置いてあるテーブルゲームで
1回、100円だったと思います。
ゲームセンターにもありました。

インベーダーなどのテーブルゲームが
当時、中古でも1台購入するのに、99万円とか?だった事を思い出しました。w

>>次は、中級編に進むべきでしょうか?

 このプログラミングが出来た時点で、既に中級以上ではないかと私には思えます。
 私的なランク付けとなってしまいますが
 スキー検定や、そろばん検定に例えさせて頂くと、2級以上
 習字検定や剣道・柔道などですと、初段以上ではないかと思います。

遊んでて、楽しかったです!^^

---追記・希望---

GameOver になった時に
もう一度、最初からやり直せる「ボタン」(キー)が欲しいです。
クリアできないのが、悔しいので・・・。(笑 画像

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 06:22
by Ultimate
感想ありがとうございました。

参考にしたのはhttp://wiki.game-develop.com/index.php? ... C#m5d7e44fで、プログラムする流れだけが載っているサイトなので、内容は自力で頑張ってみました。

Cは大体1か月くらいですね。

Cの勉強は「明解C言語 入門編」で勉強して、ゲームプログラミングの館だけでやりました。

次はインベーダーに挑戦しようと思います。

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 16:06
by Tororo
面白いですね^^
自分もこれくらい面白いゲームを作れるといいんですけど・・難しいですねw
年は中二だそうですね、自分より一つ上の先輩ですか・・

近い年齢同士頑張っていきたいです。


これからも頑張ってください!
インベーダー期待しています!

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 17:56
by Dixq (管理人)
携帯からなので見れていませんが、
中級編はちょっとややこしそうに見える関数について説明してたりするだけのところが多いので、ザッと目を通すだけで、
後からめぼしいとこをよく読んだらそれでいいと思いますよ。

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 22:13
by Ultimate
それなら、次は「龍神録プログラミングの館」に行くべきでしょうか?

ミニテクニックは必要に応じて見て、物理編はもう少し学校で物理をやってからというので大丈夫ですよね?

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 22:34
by ookami
53516のリンク先を見てみました。ホントに流れだけなんですね。 Ultimate さんすごいっすwwww

> 物理編はもう少し学校で物理をやって

「学校で」という意味では、物理と、微積分と、代数(ベクトル)と...と、いろいろあるにはありますが、習っていないからといって、プログラミングの「物理編」の理解の妨げには、ならないと思いますよ。さわりだけでもやってみてはいかがでしょうか。

放物線(...は中3でしたっけ?)はたぶん理解できるんじゃないかな...

円をえがく動きは、高校(かな?)で三角関数をやってからの方がいいかもしれませんね。ただ、理解はともかく円をえがく動きをとにかく実装したければ、授業よりプログラミングが先でも全く問題ないと思います。

Re:ブロック崩し完成

Posted: 2010年6月04日(金) 22:36
by fr
将来有望で素晴らしい!
学校でという制限をかけずにひたすら突き進むべきですよ。

Re:ブロック崩し完成

Posted: 2010年6月05日(土) 02:43
by しろ
すごいですね。1ヶ月でここまで作れるようになることに驚きです。私はこの域まで達していないので、まだまだがんばらないといけませんね。

物理と数学は高校でやると思うので、そっちできちんと勉強するといいですね。もちろん先取りするのもOKです。三角関数は数IIなので、有名私立以外では高校2年生で学習するはずです。

もし教科書があれば、さらっと読んでみるのもいいと思います。高校数学の教科書は(微積などで論理的にごまかしている部分も一部ありますが)基本的には初学者にわかりやすく書いていますよ。

Re:ブロック崩し完成

Posted: 2010年6月05日(土) 05:51
by Ultimate
物理は、いつか横スクロールのものも作ってみたいのですが、その時にジャンプなどを勉強しようと思います。

次は、インベーダーなどのシューティング系がいいので。

龍神録プログラミングの館をやってから、シューティングを作ってみたいと思います。

たくさんの回答ありがとうございました。

ここで解決にします。