[C++]クリックしたらボールが発生して自由落下
Posted: 2015年1月17日(土) 13:41
C++言語でDxlibを用いて、クリックした場所にボールが発生して自由落下するプログラムを作りたいと考えています。
どなたか参考になるプログラムなど教えていただけないでしょうか?
初投稿ですが、よろしくお願いします。
どなたか参考になるプログラムなど教えていただけないでしょうか?
初投稿ですが、よろしくお願いします。
#include "DxLib.h"
#define g 9.8
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int mx,my;//マウス座標
int Handle,Handle2; // 画像格納用ハンドル
Handle = LoadGraph( "ball.png" ); // ball画像のロード
Handle2= LoadGraph( "ground.png" );//地面画像のロード
double F,a;//力と加速度
//初期値
double y=0;//y座標
double v=0;//速度
double m=1.0;//質量
double r=25.0;//半径
double k=0.5;//ばね定数
double c=2.5;//粘性係数
double dt=0.1;//時間変化
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0&&CheckHitKey(KEY_INPUT_ESCAPE) == 0 ){
//マウスの入力状態取得
GetMousePoint(&mx,&my);
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){//マウスをクリックしたら
F=m*g;//自由落下
//バウンド処理
if(y>450){
F=-m*g;
if(y>r){
F+=k*(r-y)-c*v;
}
}
a=F/m;//加速度
v+=a*dt;//加速度から速度
y+=v*dt;//速度から座標
DrawGraph( mx,y, Handle, TRUE ); //ball画像の描画
DrawGraph( 0, 470, Handle2, TRUE ); //地面画像の描画
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include "DxLib.h"
#define g 9.8
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int mx, my; //マウス座標
int Handle, Handle2; // 画像格納用ハンドル
Handle = LoadGraph( "ball.png" ); // ball画像のロード
Handle2 = LoadGraph( "ground.png" ); //地面画像のロード
double F, a; //力と加速度
//初期値
double y = 0; //y座標
double v = 0; //速度
double m = 1.0; //質量
double r = 25.0; //半径
double k = 0.5; //ばね定数
double c = 2.5; //粘性係数
double dt = 0.1; //時間変化
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
//マウスの入力状態取得
GetMousePoint( &mx, &my );
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { //マウスをクリックしたら
F = m * g; //自由落下
//バウンド処理
if( y > 450 ) {
F = -m * g;
if( y > r ) {
F += k * ( r - y ) - c * v;
}
}
a = F / m; //加速度
v += a * dt; //加速度から速度
y += v * dt; //速度から座標
DrawGraph( mx, y, Handle, TRUE ); //ball画像の描画
DrawGraph( 0, 470, Handle2, TRUE ); //地面画像の描画
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include "DxLib.h"
#define g 9.8
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int mx, my; //マウス座標
int Handle, Handle2; // 画像格納用ハンドル
Handle = LoadGraph( "ball.png" ); // ball画像のロード
Handle2 = LoadGraph( "ground.png" ); //地面画像のロード
double F, a; //力と加速度
//初期値
int count=0;
double y = 0; //y座標
double v = 0; //速度
double m = 1.0; //質量
double r = 25.0; //半径
double k = 0.5; //ばね定数
double c = 2.5; //粘性係数
double dt = 0.1; //時間変化
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
//マウスの入力状態取得
GetMousePoint( &mx, &my );
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { //マウスをクリックしたら
count=1;
}
if(count==1){
F = m * g; //自由落下
//バウンド処理
if( y > 450 ) {
F = -m * g;
if( y > r ) {
F += k * ( r - y ) - c * v;
}
}
a = F / m; //加速度
v += a * dt; //加速度から速度
y += v * dt; //速度から座標
DrawGraph( mx, y, Handle, TRUE ); //ball画像の描画
DrawGraph( 0, 470, Handle2, TRUE ); //地面画像の描画
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include "DxLib.h"
#define g 9.8
const int MAXN=10;
int ball[MAXN];
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int mx,my; //マウス座標
int Handle, Handle2; // 画像格納用ハンドル
Handle = LoadGraph( "ball.png" ); // ball画像のロード
Handle2 = LoadGraph( "ground.png" ); //地面画像のロード
double F, a; //力と加速度
//マウスの入力状態取得
GetMousePoint( &mx, &my );
//初期値
int count=0;
struct Ball{
double x ; //x座標
double y ; //y座標
double v ; //速度
double m ; //質量
double r ; //半径
double k ; //ばね定数
double c ; //粘性係数
double dt; //時間変化
}ball[MAXN];
for(int i=0;i<10;i++){
ball[i].x=mx;
ball[i].y=my;
ball[i].v=0;
ball[i].m=1.0;
ball[i].r=25.0;
ball[i].k=0.5;
ball[i].c=2.5;
ball[i].dt=0.1;
}
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
for(int i=0;i<10;i++){
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { //マウスをクリックしたら
count=1;
}
if(count==1){
F = ball[i].m * g; //自由落下
//バウンド処理
if( ball[i].y > 450 ) {
F = -ball[i].m * g;
if( ball[i].y > ball[i].r ) {
F += ball[i].k * ( ball[i].r -ball[i]. y ) - ball[i].c *ball[i]. v;
}
}
a = F / ball[i].m; //加速度
ball[i].v += a * ball[i].dt; //加速度から速度
ball[i].y += ball[i].v * ball[i].dt; //速度から座標
DrawGraph( ball[i].x, ball[i].y, Handle, TRUE ); //ball画像の描画
}
DrawGraph( 0, 470, Handle2, TRUE ); //地面画像の描画
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include <windows.h>
#include "DxLib.h"
#define g 9.8
#define BMAX 10
int mx,my; //マウス座標
int click =0;
//初期値
float F, a; //力と加速度
struct Ball{
BOOL enable; //使用:1 未使用:0
float x ; //x座標
float y ; //y座標
float v ; //速度
float m ; //質量
float r ; //半径
float k ; //ばね定数
float c ; //粘性係数
float dt; //時間変化
}ball[BMAX];
void InitGame(){
int Handle2 = LoadGraph( "ground.png" ); //地面画像の
DrawGraph( 0, 470, Handle2, TRUE ); //地面画像の描画
//弾データ初期化
for(int i=0;i<BMAX;i++)
ball[i].enable=0;
}
void Createball(float x,float y){
int i;
int no=-1; //作成する弾のデータ番号
//構造体の中で、空いている(未使用)データを探す
for(i=0;i<BMAX;i++)
if(ball[i].enable==0){
no=i;
break;
}
//空いているデータが見つからなかったら作成せずに戻る
if(no==-1)
return;
//データ詰める
ball[no].x=x;
ball[no].y=y;
ball[no].enable=1; //使用中にする
}
void Shoot(){
//ボール発射判定
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )//マウスをクリックしたら
click=1;
if(click==1)
Createball(mx,my);
}
void MoveBall(){
int i;
for(i=0;i<BMAX;i++){
if(ball[i].enable==0) //未使用データだったら次の処理へ
continue;
//移動
F = ball[i].m * g; //自由落下
//バウンド処理
if( ball[i].y > 450 ) {
F = -ball[i].m * g;
if( ball[i].y > ball[i].r ) {
F += ball[i].k * ( ball[i].r -ball[i]. y ) - ball[i].c *ball[i]. v;
}
}
a = F / ball[i].m; //加速度
ball[i].v += a * ball[i].dt; //加速度から速度
ball[i].y += ball[i].v * ball[i].dt; //速度から座標
}
}
void Show(){
int i;
int Handle = LoadGraph( "ball.png" ); // ball画像のロード
//ボール表示
for(i=0;i<BMAX;i++)
if(ball[i].enable==1)
DrawGraph( ball[i].x, ball[i].y, Handle, TRUE ); //ball画像の描画
}
//----------[ メインループ ]--------------------------------------------------------------------
void GameLoop(void){
for(int i=0;i<BMAX;i++){
Shoot(); //弾発射判定
MoveBall(); //弾移動
Show(); //画像表示
}
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
//マウスの入力状態取得
GetMousePoint( &mx, &my );
//初期値
int i;
for(i=0;i<BMAX;i++){
ball[i].x=mx;
ball[i].y=my;
ball[i].v=0;
ball[i].m=1.0;
ball[i].r=25.0;
ball[i].k=0.5;
ball[i].c=2.5;
ball[i].dt=0.1;
}
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
InitGame();
GameLoop();
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
#include <windows.h>
#include "DxLib.h"
#include<math.h>
#define g 9.8
#define BMAX 10
//----------[ ボール構造体 ]----------------------------------------
struct Ball{
BOOL enable; //使用:1 未使用:0
float x ; //x座標
float y ; //y座標
float v ; //速度
float m ; //質量
float r ; //半径
float k ; //ばね定数
float c ; //粘性係数
float dt; //時間変化
}ball[BMAX];
//----------[ ゲーム初期化 ]----------------------------------------
void InitGame(){
int Handle2 = LoadGraph( "ground.png" ); //地面画像の
DrawGraph( 0, 420, Handle2, TRUE ); //地面画像の描画
//弾データ初期化
for(int i=0;i<BMAX;i++)
ball[i].enable=0;
}
//----------[ ボール作成 ]----------------------------------------------
void Createball(float x,float y){
int i;
int no=-1; //作成する弾のデータ番号
//構造体の中で、空いている(未使用)データを探す
for(i=0;i<BMAX;i++)
if(ball[i].enable==0){
no=i;
break;
}
//空いているデータが見つからなかったら作成せずに戻る
if(no==-1)
return;
//データ詰める
ball[no].x=x;
ball[no].y=y;
ball[no].enable=1; //使用中にする
}
//----------[ メイン関数 ]----------------------------------------------
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int mx,my; //マウス座標
int Handle;// 画像格納用ハンドル
Handle = LoadGraph( "ball.png" ); // ball画像のロード
float F, a; //力と加速度
//初期値
int clickcount=0;//クリック初期化
int beforeMouseInput = 0;//1フレーム前のマウスの状態
//マウスの初期化
GetMousePoint( &mx, &my );
for(int i=0;i<BMAX;i++){
ball[i].x=mx;
ball[i].y=my;
ball[i].v=0;
ball[i].m=1.0;
ball[i].r=25.0;
ball[i].k=1.0;
ball[i].c=3.5;
ball[i].dt=0.1;
}
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
//マウスの入力状態更新
GetMousePoint( &mx, &my );
InitGame();
for(int i=0;i<BMAX;i++){
//クリックした瞬間
if( (beforeMouseInput & MOUSE_INPUT_LEFT ) != MOUSE_INPUT_LEFT
&& (GetMouseInput() & MOUSE_INPUT_LEFT)== MOUSE_INPUT_LEFT){
clickcount=1;
Createball(mx,my);
}
beforeMouseInput = GetMouseInput();
if(ball[i].enable==0&&clickcount==1){
F = ball[i].m * g; //自由落下
//バウンド処理
if( ball[i].y > 380 ) {
F = -ball[i].m * g;
if( abs(ball[i].y-380) < ball[i].r ) {
F += ball[i].k * ( ball[i].r -ball[i]. y ) - ball[i].c *ball[i]. v;
}
}
a = F / ball[i].m; //加速度
ball[i].v += a * ball[i].dt; //加速度から速度
ball[i].y += ball[i].v * ball[i].dt; //速度から座標
DrawGraph( ball[i].x, ball[i].y, Handle, TRUE ); //ball画像の描画
}
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
よく直ったつもりで、直っていないことがありますので最終コードを投稿することをオススメします。たらお さんが書きました:皆さんのアドバイスを参考にしたら、完成できました。
ありがとうございます。
/----------[インクルードファイル ]----------------------------------------
#include "DxLib.h"
//----------[マクロ定義部 ]----------------------------------------
#define g 9.8//重力加速度
#define BMAX 100 //ボールの最大出現数を100個に
#define X_MAX 640//画面の最大横幅
//----------[ グローバル変数 ]----------------------------------------
int Handle,Handle2,Handle3,Handle4,Handle5;//画像格納用ハンドル
int clickcount;//クリック格納変数
int beforeMouseInput;//1フレーム前のマウスの状態
int mx,my; //マウス座標
double F, a; //力と加速度
//----------[ ボール構造体 ]----------------------------------------
struct Ball{
int flag;//1:使用 0:消去
double x ; //x座標
double y ; //y座標
double v ; //速度
double m ; //質量
double r ; //半径
double k ; //ばね定数
double c ; //粘性係数
double dt; //時間変化
}ball[BMAX];
//----------[ 音声・画像ファイルロード ]----------------------------------------
void File_load(){
Handle= LoadGraph( "tumball.png" ); // ball画像のロード
Handle2 = LoadGraph( "tumball3.png" ); //ball2画像のロード
Handle3 = LoadGraph( "ground4.jpg" ); //地面画像のロード
Handle4=LoadGraph( "background5.jpg" ); //背景画像のロード
Handle5= LoadSoundMem( "se1.mp3" );//効果音のロード
}
//----------[ 初期値 ]----------------------------------------
void Ini_Game(){
clickcount=0;//クリック初期化
beforeMouseInput = 0;//1フレーム前のマウスの状態
}
//----------[ 背景描画 ]----------------------------------------
void BackGround(){
DrawGraph( 0, 0, Handle4, TRUE ); //背景画像の描画
}
//----------[ 地面描画 ]----------------------------------------
void DrawGround(){
DrawGraph( 0, 420, Handle3, TRUE ); //地面画像の描画
for(int i=0;i<BMAX;i++){
//ボールが当たったら地面振動
if(ball[i].flag==1&& ball[i].y+ball[i].r > 395)
DrawGraph( 10, 420, Handle3, TRUE ); //x軸に10ピクセルずらして地面画像の描画
}
}
//----------[ ボール作成 ]----------------------------------------------
void Createball(double x,double y){
//構造体の中で、空いている(未使用)データを探す
for(int i=clickcount;i<BMAX;i++){
//データ詰める
ball[i].x=x;
ball[i].y=y;
ball[i].v=0;
ball[i].m=1.0;
ball[i].r=25.0;
ball[i].k=0.5;
ball[i].c=2.5;
ball[i].dt=0.1;
ball[i].flag=1;//使用にする
}
}
//----------[ ボール発射判定 ]----------------------------------------------
void Shot_Hantei(){
//クリックした瞬間
if( (beforeMouseInput & MOUSE_INPUT_LEFT ) != MOUSE_INPUT_LEFT
&& (GetMouseInput() & MOUSE_INPUT_LEFT)== MOUSE_INPUT_LEFT){
clickcount+=1;//クリックカウント増やす
Createball(mx,my);//マウスの座標にボール作成
PlaySoundMem(Handle5,DX_PLAYTYPE_NORMAL);//ボール出現音再生
}
beforeMouseInput = GetMouseInput();
}
//----------[ ボール移動 ]----------------------------------------------
void Moveball(){
for(int i=0;i<BMAX;i++){
if(ball[i].flag==1&&clickcount>=1){//ボールが使用中なら
F = ball[i].m * g; //自由落下
//バウンド処理
if( ball[i].y+ball[i].r > 395 ) {//地面に当たったら
F = -ball[i].m * g;//バウンドさせる。
//沈み込み量に応じてバウンド減衰
if( ball[i].y-370 < ball[i].r ) {
F += ball[i].k * ( ball[i].r -ball[i]. y) - ball[i].c *ball[i]. v;
}
}
a = F / ball[i].m; //加速度
ball[i].v += a * ball[i].dt; //加速度から速度
ball[i].y += ball[i].v * ball[i].dt; //速度から座標
ball[i].x +=2; //x座標方向への移動
//画面外に出たらボール消去
if(ball[i].x<0 || X_MAX<ball[i].x)
ball[i].flag=0;//消去する
}
}
}
//----------[ ボール描画 ]----------------------------------------------
void Drawball(){
for(int i=0;i<BMAX;i++){
if(ball[i].flag==1&&clickcount>=1){//ボールが使用中なら
DrawGraph( ball[i].x, ball[i].y, Handle, TRUE); //ball1画像の描画
if( ball[i].y+ball[i].r > 395 )//地面に当たったらボール変形
DrawGraph( ball[i].x, ball[i].y, Handle2, TRUE ); //ball2画像の描画
}
}
}
//----------[ メイン関数 ]----------------------------------------------
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
File_load();//画像ロード
Ini_Game();//初期値
//----------[ メインループ ]----------------------------------------------
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア,ESCAPEで終了 )
while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
GetMousePoint( &mx, &my );//マウスの入力状態更新
BackGround();//背景描画
DrawGround();//地面描画
Shot_Hantei();//ボール発射判定
Moveball();//ボール移動
Drawball();//ボール描画
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}