#include "DxLib.h"
typedef struct{
int x,y,z,img,flag,down,up;
}ch_t;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
ch_t ball;//構造体ball
ball.x=320;
ball.y=450;
ball.z=10;
ball.up=0;
ball.down=0;
int bx=270;//bx:バーのX座標
int bcolor; bcolor=GetColor(255,255,255);//バーの色の設定
char key[256];
SetDrawScreen( DX_SCREEN_BACK ) ;
int start=0;//発射確認
while(1){
if(ProcessMessage()==-1) break;
ClearDrawScreen();
GetHitKeyStateAll(key);
if(key[KEY_INPUT_SPACE]==1){
ball.flag=1;
}
if(key[KEY_INPUT_RIGHT]==1){ bx+=5; if(ball.flag==0) ball.x+=5;};//右キーでバーを右に+ボール操作
if(key[KEY_INPUT_LEFT]==1){ bx-=5; if(ball.flag==0) ball.x-=5;}//左キーでバーを左に+ボール操作
if(bx>540){ bx=540; if(ball.flag==0) ball.x=590;}
if(bx<0){ bx=0;if(ball.flag==0) ball.x=50;}
if(ball.flag==1){
if(ball.x==0&&ball.down==1&&ball.y>=5){
ball.x+=5;
ball.y-=5;
ball.up=0;
ball.down=1;
}
if(ball.x==640&&ball.down==0&&ball.y>=5){
ball.x-=5;
ball.y-=5;
ball.up=1;
ball.down=0;
}
if(ball.y<5&&ball.up==1){
ball.x-=5;
ball.y+=5;
ball.up=1;
ball.down=0;
}
else {
ball.x+=5;
ball.y-=5;
ball.up=1;
ball.down=0;
}
}
DrawBox(bx,460,bx+100,470,bcolor,TRUE);
DrawCircle(ball.x,ball.y,ball.z,bcolor,TRUE);
ScreenFlip();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
スペースでボール発射
ball.upはボールが上へ向かっている状態
ball.downはボールが下へ向かっている状態です。
どうしたらいいか教えてください。
跳ね返りができません。
Re:跳ね返りができません。
見辛い
#include "DxLib.h" typedef struct { int x; int y; int dx; int dy; 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.x = 320; ball.y = 450; ball.dx = 0; ball.dy = 0; ball.r = 10; ball.flag = 0; int bx = 270; int by = 460; int color = GetColor(255, 255, 255); char key[256]; int start = 0; while(ProcessMessage() != -1) { ClearDrawScreen(); GetHitKeyStateAll(key); if(key[KEY_INPUT_ESCAPE]) { break; } // 発射 if(key[KEY_INPUT_SPACE]) { ball.flag=1; ball.dx = 5; ball.dy = -5; } // バー移動 if(key[KEY_INPUT_RIGHT]) { bx += 5; } if(key[KEY_INPUT_LEFT]) { bx -= 5; } // バー移動範囲 if(bx > 540) { bx = 540; } if(bx < 0) { bx = 0; } // ボール if(ball.flag) { // 移動計算 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 + 100 >= ball.x) { ball.dy *= -1; } } DrawBox(bx, by, bx + 100, by + 10, color, TRUE); // バー DrawCircle(ball.x, ball.y, ball.r, color, TRUE); // ボール ScreenFlip(); } DxLib_End(); return 0; }
Re:跳ね返りができません。
跳ね返りがうまくいかないと書かれていますが
ボールが何にもぶつかっていない状態では右上にしか
動かないようになっているみたいです。
そこで、ボールの構造体にx方向の速度、y方向の速度(または、速さと移動方向)
の変数を追加して、ボールの座標に速度を足して移動させるようにしたらどうでしょうか。
跳ね返りはボールが壁やバーにめり込み続けるような状態だったら速度を変更する
というようにすればよいでしょう。
あと、ブロック崩しのプログラムであるならば始めにそう書いておいた方がよいですよ。
ボールが何にもぶつかっていない状態では右上にしか
動かないようになっているみたいです。
そこで、ボールの構造体にx方向の速度、y方向の速度(または、速さと移動方向)
の変数を追加して、ボールの座標に速度を足して移動させるようにしたらどうでしょうか。
跳ね返りはボールが壁やバーにめり込み続けるような状態だったら速度を変更する
というようにすればよいでしょう。
あと、ブロック崩しのプログラムであるならば始めにそう書いておいた方がよいですよ。
Re:跳ね返りができません。
速度の変数で移動すればいいのですね。
ありがとうございました。
ブロックなしのブロック崩しというのは書き忘れていました。
すみませんでした。
ありがとうございました。
ブロックなしのブロック崩しというのは書き忘れていました。
すみませんでした。