改変前のソース
#include "DxLib.h"
#include <math.h>
#define g 9.8067//定数:重力加速度
#define e 0.85//反発係数
#define y_max 2.000//定数
#define max_x 640//玉の移動範囲:右端
#define min_x 0//玉の移動範囲:左端
#define max_y 480//玉の移動範囲:床(ただし計算途中では天井)
#define min_y 0//玉の移動範囲:天井(ただし計算途中では床)
//#define maxy 400.000//玉の軌道の最高点
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int i;//forループ用変数(使用関数:全て)
int TRAM_x=640, TRAM_y=0, TRAM_flag=0, TRAM_q=0, TRAM_time1, TRAM_time2;//(使用関数:TamaRifAndMove())
double TRAM_m=1.000, TRAM_t, TRAM_v0, TRAM_sy, TRAM_ssy, TRAM_zmaxy;//玉の向き上下判定, 経過時間, 初速度, 発射地点のy座標, 床を跳ねた時の発射地点のy座標, 玉の飛び上がる高さ(使用関数:TamaRifAndMove())
typedef struct{
int x,y,image;
double xsp,at,maxy;//x方向のスピード,当たり判定の半径,現在の軌道の最高点
}TamaPara_t;TamaPara_t TP;
typedef struct{
int x,y,img;
double sp,at;
}ZikiPara_t;ZikiPara_t ZP;
int ZP_img[4];
void TamaRifAndMove(){
if( TRAM_flag==0 || TRAM_flag==2 ){ //床の当たり判定1
TRAM_time1 = GetNowCount(); //time1にエンターが押された時の時間を格納
TRAM_sy=TRAM_y;
if(TRAM_flag==0){
TRAM_ssy=TRAM_y;
}
TRAM_zmaxy=TP.maxy-TRAM_ssy;
TRAM_flag=1; //飛び上がりフラグを立てる。
}
else if(TRAM_flag==1){
TRAM_time2 = GetNowCount() ; // 現在経過時間を得る
TRAM_t = (double)(TRAM_time2 - TRAM_time1) / 1000.000; // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
TRAM_v0 = sqrt ( 2.000 * g * y_max);
if(TRAM_m==-1.000){
TRAM_v0 = TRAM_v0-g*TRAM_t;
}
for(i=0;i<TRAM_q;i++){
TRAM_v0 *=e;
}
TRAM_y = TRAM_sy+(TRAM_m*TRAM_v0 * TRAM_t - 0.500 * g * TRAM_t * TRAM_t ) * TRAM_zmaxy / y_max;//yの計算
TRAM_x=(TRAM_x+TP.xsp);//xの計算
if(TRAM_y<(min_y+TP.at)){//床の当たり判定2
TRAM_y=min_y+TP.at;
TRAM_m=1.000;
TRAM_q+=1;
TRAM_flag=0;// 画面外に来ると、飛び上がりフラグを戻す
}
else if(TRAM_y>(max_y-TP.at)){//天井の当たり判定
TRAM_y=max_y-TP.at;
TRAM_m=-1.000;
TRAM_flag=2;
}
if(TRAM_x<(min_x+TP.at)){//左端の当たり判定&処理
TRAM_x=min_x+TP.at+1;
TP.xsp*=(-1);
}
else if(TRAM_x>(max_x-TP.at)){//右端の当たり判定&処理
TRAM_x=max_x-1-TP.at;
TP.xsp*=(-1);
}
TP.y=(int)(480-TRAM_y);//玉のy座標の更新
TP.x=(int)(TRAM_x);//玉のx座標の更新
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了
char Key[256];
SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
//初期化
TP.image=LoadGraph("img/tama.png");//玉の画像のロード
TP.at=5;//玉の当たり判定の設定
TP.xsp=-4.000;//x方向のスピード
TP.maxy=600.00;//現在の軌道の最高点の初期化
ZP.img=0;//LoadGraph("img/ziki.png");//自機の画像のロード
LoadDivGraph("img/ziki[4].png",4,1,4,25,29,ZP_img);//自機の画像の分割ロード
ZP.x=(max_x+min_x)/2;//自機のx座標の初期化
ZP.y=max_y-14;//自機のy座標の初期化
ZP.sp=4.000;
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
//ClearDrawScreen();//裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
TamaRifAndMove();
if( Key[ KEY_INPUT_RIGHT ] >= 1 && ZP.x<(max_x-12)){//左移動
ZP.x+=ZP.sp;
}
if( Key[ KEY_INPUT_LEFT ] >= 1 && ZP.x>(min_x+12)){//右移動
ZP.x-=ZP.sp;
}
if(Key[KEY_INPUT_A]>=1 && Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT ] <= 0){
ZP.img=3;
}
else if(Key[KEY_INPUT_A]>=1 && Key[ KEY_INPUT_RIGHT ] <= 0 && Key[ KEY_INPUT_LEFT ] >= 1){
ZP.img=2;
}
else if(Key[KEY_INPUT_A]>=1){
ZP.img=1;
}
else{
ZP.img=0;
}
DrawRotaGraph(ZP.x,ZP.y,1.0,0.0,ZP_img[ZP.img],TRUE);//自機の描画
DrawRotaGraph( TP.x , TP.y ,1.0,0.0, TP.image , TRUE );//玉の描画
DrawFormatString( 0, 0, GetColor(255,255,255), "%d",TP.y); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 20, GetColor(255,255,255), "%d",TRAM_y); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 40, GetColor(255,255,255), "%d",TRAM_flag); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 60, GetColor(255,255,255), "%d",TRAM_q); // x,0 の位置に白で ?! を描画
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break; //Escボタンが押されたらブレイク
//ScreenFlip() ; //裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
#include "DxLib.h"
#include <math.h>
#define g 9.8067//定数:重力加速度
#define e 0.85//定数:反発係数
#define PI 3.141592//定数:円周率
#define y_max 2.000//定数
#define x_max 2.000//定数
#define max_x 640//玉の移動範囲:右端
#define min_x 0//玉の移動範囲:左端
#define max_y 480//玉の移動範囲:床(ただし計算途中では天井)
#define min_y 0//玉の移動範囲:天井(ただし計算途中では床)
//#define maxy 400.000//玉の軌道の最高点
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int i;//forループ用変数(使用関数:全て)
int TRAM_x=640, TRAM_y=0, TRAM_flag=0, TRAM_q=0, TRAM_time1, TRAM_time2, TRAM_xtime1, TRAM_xtime2;//(使用関数:TamaRifAndMove())
double TRAM_m=1.000, TRAM_t, TRAM_v0, TRAM_sy, TRAM_ssy, TRAM_zmaxy, TRAM_sx, TRAM_xt, TRAM_xm=-1.000;//玉の向き上下判定, 経過時間, 初速度, 発射地点のy座標, 床を跳ねた時の発射地点のy座標, 玉の飛び上がる高さ(使用関数:TamaRifAndMove())
typedef struct{
int x,y,image;
double xsp,at,maxy,maxx;//x方向のスピード,当たり判定の半径,現在の軌道の最高点,現在の軌道の飛距離
}TamaPara_t;TamaPara_t TP;
typedef struct{
int x,y,img;
double sp,at;
}ZikiPara_t;ZikiPara_t ZP;
int ZP_img[4];
void TamaRifAndMove(){
if( TRAM_flag==0 || TRAM_flag==2 ){ //床の当たり判定1
TRAM_time1 = GetNowCount(); //time1にエンターが押された時の時間を格納
TRAM_xtime1 = GetNowCount();
TRAM_sy=TRAM_y;
TRAM_sx=TRAM_x;
if(TRAM_flag==0){
TRAM_ssy=TRAM_y;
}
TRAM_zmaxy=TP.maxy-TRAM_ssy;
TRAM_flag=1; //飛び上がりフラグを立てる。
}
else if(TRAM_flag==1){
TRAM_time2 = GetNowCount() ; // 現在経過時間を得る
TRAM_xtime2 = GetNowCount();
TRAM_t = (double)(TRAM_time2 - TRAM_time1) / 1000.000; // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
TRAM_xt = (double)(TRAM_xtime2 - TRAM_xtime1) / 1000.000;
TRAM_v0 = sqrt ( 2.000 * g * y_max);
TRAM_x=TRAM_sx+((g*x_max*TRAM_xt*TRAM_xm)/(2.000*TRAM_v0*sin(PI*0.25))*TP.maxx/x_max);
if(TRAM_m==-1.000){
TRAM_v0 = TRAM_v0-g*TRAM_t;
}
for(i=0;i<TRAM_q;i++){
TRAM_v0 *=e;
}
TRAM_y = TRAM_sy+(TRAM_m*TRAM_v0 * TRAM_t - 0.500 * g * TRAM_t * TRAM_t ) * TRAM_zmaxy / y_max;//yの計算
//TRAM_x=(TRAM_sx+TP.xsp*TRAM_xt*TRAM_xm);//xの計算
if(TRAM_y<(min_y+TP.at)){//床の当たり判定2
TRAM_y=min_y+TP.at;
TRAM_m=1.000;
TRAM_q+=1;
TRAM_flag=0;// 画面外に来ると、飛び上がりフラグを戻す
}
else if(TRAM_y>(max_y-TP.at)){//天井の当たり判定
TRAM_y=max_y-TP.at;
TRAM_m=-1.000;
TRAM_flag=2;
}
if(TRAM_x<(min_x+TP.at)){//左端の当たり判定&処理
TRAM_x=min_x+TP.at+1;
TRAM_sx=TRAM_x;
TRAM_xm=1.000;
TRAM_xtime2 = GetNowCount();
TP.xsp*=(-1);
}
else if(TRAM_x>(max_x-TP.at)){//右端の当たり判定&処理
TRAM_x=max_x-1-TP.at;
TRAM_sx=TRAM_x;
TRAM_xm=-1.000;
TRAM_xtime2 = GetNowCount();
TP.xsp*=(-1);
}
TP.y=(int)(480-TRAM_y);//玉のy座標の更新
TP.x=(int)(TRAM_x);//玉のx座標の更新
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了
char Key[256];
SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
//初期化
TP.image=LoadGraph("img/tama.png");//玉の画像のロード
TP.at=5;//玉の当たり判定の設定
TP.xsp=-400.000;//x方向のスピード
TP.maxy=600.00;//現在の軌道の最高点の初期化
TP.maxx=400.00;
ZP.img=0;//LoadGraph("img/ziki.png");//自機の画像のロード
LoadDivGraph("img/ziki[4].png",4,1,4,25,29,ZP_img);//自機の画像の分割ロード
ZP.x=(max_x+min_x)/2;//自機のx座標の初期化
ZP.y=max_y-14;//自機のy座標の初期化
ZP.sp=4.000;
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
//ClearDrawScreen();//裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; // すべてのキーの状態を得る
if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
TamaRifAndMove();
if( Key[ KEY_INPUT_RIGHT ] >= 1 && ZP.x<(max_x-12)){//左移動
ZP.x+=ZP.sp;
}
if( Key[ KEY_INPUT_LEFT ] >= 1 && ZP.x>(min_x+12)){//右移動
ZP.x-=ZP.sp;
}
if(Key[KEY_INPUT_A]>=1 && Key[ KEY_INPUT_RIGHT ] >= 1 && Key[ KEY_INPUT_LEFT ] <= 0){
ZP.img=3;
}
else if(Key[KEY_INPUT_A]>=1 && Key[ KEY_INPUT_RIGHT ] <= 0 && Key[ KEY_INPUT_LEFT ] >= 1){
ZP.img=2;
}
else if(Key[KEY_INPUT_A]>=1){
ZP.img=1;
}
else{
ZP.img=0;
}
DrawRotaGraph(ZP.x,ZP.y,1.0,0.0,ZP_img[ZP.img],TRUE);//自機の描画
DrawRotaGraph( TP.x , TP.y ,1.0,0.0, TP.image , TRUE );//玉の描画
DrawFormatString( 0, 0, GetColor(255,255,255), "%d",TP.x); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 20, GetColor(255,255,255), "%d",TRAM_x); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 40, GetColor(255,255,255), "%d",TRAM_flag); // x,0 の位置に白で ?! を描画
DrawFormatString( 0, 60, GetColor(255,255,255), "%f",TRAM_sx); // x,0 の位置に白で ?! を描画
if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break; //Escボタンが押されたらブレイク
//ScreenFlip() ; //裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}