ページ 11

ブロック崩し

Posted: 2010年4月02日(金) 04:43
by さっちー
プログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。

#include "DxLib.h"

typedef struct _racket{
int g_racket;
int g_x;
int g_y;
}racket;

typedef struct _block{
int stone;
int x;
int y;
}block;

typedef struct _tama{
int ball;
int x;
int y;
int vx;
int vy;
}tama;

int Key;
tama ta;

void ball_attack()
{
ta.x = 300;
ta.y = 450;
ta.vx = 4;
ta.vy = 4;

ta.ball = LoadGraph("ball.bmp");


DrawGraph(ta.x, ta.y, ta.ball, TRUE);

ta.x += ta.vx;
ta.y += ta.vy;
if(ta.x < 5 || ta.x > 635)
ta.vx = -ta.vx;
if(ta.y < 5 || ta.y > 475)
ta.vy = -ta.vy;


}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
//tama ta;
racket ra;

//ta.x = 300;
//ta.y = 450;
//ta.vx = 4;
//ta.vy = 4;

ra.g_x = 300;
ra.g_y = 420;

ChangeWindowMode( TRUE ) ;

if( DxLib_Init() == -1 ) return -1;

SetDrawScreen( DX_SCREEN_BACK );

// 透過色を変更
SetTransColor( 255 , 255 , 255 ) ;

ra.g_racket = LoadGraph("ziki.bmp");
//ta.ball = LoadGraph("ball.bmp");

while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0)
{
// メッセージループに代わる処理をする
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける

}


ClearDrawScreen();

ball_attack();

/* DrawGraph(ta.x, ta.y, ta.ball, TRUE);

ta.x += ta.vx;
ta.y += ta.vy;
if(ta.x < 5 || ta.x > 635)
ta.vx = -ta.vx;
if(ta.y < 5 || ta.y > 475)
ta.vy = -ta.vy*/;

// キー入力取得
Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

// 右を押していたら右に進む
if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ;

// 左を押していたら左に進む
if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ;

// 読みこんだグラフィックを画面左上に描画
DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ;

ScreenFlip();


}

WaitKey();
DxLib_End();
return 0;
}

Re:ブロック崩し

Posted: 2010年4月02日(金) 07:51
by Dixq (管理人)
>さっちーさん

こんにちは。
DXライブラリを用いたプログラムの骨格はゲームプログラミングの館の41章を参考にされてはいかがでしょう?

http://dixq.net/g/43.html

また、ソースコードが字下げされていないようですが、元々字下げしていないのでしょうか?
字下げした方が見やすいですよ。

そして、関数化の構成ですが、まずは解り易く以下のようにしてみてはいかがですか?



バー移動計算部(){
if(左右キーが押されていたら){
バーを移動
}
}

弾計算部(){
.x += cos( 角度 ) * speed;
.y += sin( 角度 ) * speed;
if( 壁にぶつかっていたら ){
方向転換;
}
}

描画部(){
バー描画;
弾描画;
}

int WINAPI WinMain(...){
...
while(...){

バー移動計算部();
弾計算部();
描画部();

}
}