考え方としては弾の座標がx<=0,y<=0,x>=640,y>=480のどれかを満たしたとき、座標を画面内に戻し角度を変えるというものですが、弾がy>=480を満たすと角度が絶え間なく変わってしまい、跳ね返る軌道を描いてくれません。それと最初に中央にある自機が何故か左側に動きません。一体どうしたら弾は跳ね返ってくれるのでしょうか?
プログラムソースは次の通りです。
#include "DxLib.h"
#include <math.h>
#define tsx 640//弾の初期x座標
#define tsy 240//弾の初期y座標
#define tsa 1.25//弾の初期角度
#define tss 5//弾の初期速度
#define maxx 640//弾の移動領域の右端
#define minx 0//弾の移動領域の左端
#define miny 0//弾の移動領域の上端
#define maxy 480//弾の移動領域の右端
#define zsx 320//自機の初期x座標
#define zsy 480//自機の初期y座標
#define zss 1//自機の初期スピード
#define PI 3.1415926f//円周率
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;
}
typedef struct{
float x,y,ang,sp;//x,y座標,角度,スピード
int img;//画像
}TamaPara_t;
TamaPara_t TP;
typedef struct{
float x,y,sp;//x,y座標,スピード
int img;//画像
}ZikiPara_t;
ZikiPara_t ZP;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int cnt;//カウンター
TP.img = LoadGraph("img/tama.png");//画像をロード
ZP.img = LoadGraph("img/ziki.png");//画像をロード
cnt=0;
TP.x = tsx;
TP.y = tsy;
TP.ang = tsa;
TP.sp = tss;
ZP.x = zsx;
ZP.y = zsy;
ZP.sp = zss;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
//計算フェイズ
if( Key[ KEY_INPUT_RIGHT ] >= 1 && ZP.x<maxx ){ // 移動領域の中で右キーが押されていたら
ZP.x+=zss;
}
if( Key[ KEY_INPUT_LEFT ] >= 1 && ZP.x<minx ){ // 移動領域の中で左キーが押されていたら
ZP.x-=zss;
}
TP.x += cos(TP.ang)*TP.sp;//x座標を更新
TP.y += sin(TP.ang)*TP.sp;//y座標を更新
if(TP.x>=maxx || TP.x<=minx || TP.y>=maxy || TP.y<=miny || cnt!=0 ){
if(TP.x>=maxx){
TP.x-=(TP.x-maxx)*2;
if(TP.ang >=1.0 || TP.ang <2.0){
TP.ang=3-TP.ang;
}
else{
TP.ang=1-TP.ang;
}
}
else if(TP.x<=minx){
TP.x+=(minx-TP.x)*2;
if(TP.ang >=1.0 || TP.ang <2.0){
TP.ang=3-TP.ang;
}
else{
TP.ang=1-TP.ang;
}
}
else if(TP.y>=maxy){//異常
TP.y-=(TP.y-maxy)*2;
TP.ang=2-TP.ang;
}
else if(TP.y<=miny){//異常
TP.y+=(miny-TP.y)*2;
TP.ang=2-TP.ang;
}
//TP.ang -= 0.50;
if(TP.ang>=2.00){
TP.ang -= 2.00;
}
else if(TP.ang<0){
TP.ang += 2.00;
}
}
//自機の画像は横
//作画フェイズ
DrawRotaGraph(TP.x,TP.y,1.0,0.0,TP.img,TRUE);
DrawRotaGraph(ZP.x,ZP.y,1.0,0.0,ZP.img,TRUE);
DrawFormatString(0,0,GetColor(255,255,255),"%7.2f",TP.ang);
cnt+=1;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}