今、自機の弾の発射のプログラムを組んでいます。
spaceきーを押すと弾が現れ、まっすぐに画面の上に飛んでいきます。
しかし、弾が現れる位置が自機の右に出現してしまいます。
作成したプロジェクトをそのまま書きます。
include "DxLib.h"
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 WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int x=320, y=320;
int Handle = LoadGraph("画像/キャラクタ01.png");
int X = 320, Y = 30;
int NUM = LoadGraph("画像/キャラクタ01.png");
int NUMMuki = 1;
int ShotX,ShotY,ShotFlag;
int ShotGraph = LoadGraph("画像/弾00.png");
ShotFlag = 0;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Key[KEY_INPUT_ESCAPE] == 0){
//自機の制御
{
if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ // 右キーが押されていたら
x++; // 右へ移動
}
if( Key[ KEY_INPUT_DOWN ] >= 1 ){ // 下キーが押されていたら
y++; // 下へ移動
}
if( Key[ KEY_INPUT_LEFT ] >= 1 ){ // 左キーが押されていたら
x--; // 左へ移動
}
if( Key[ KEY_INPUT_UP ] >= 1 ){ // 上キーが押されていたら
y--; // 上へ移動
}
if(CheckHitKey( KEY_INPUT_SPACE ) == 1 && ShotFlag == 0){
int Hw,Hh,Sw,Sh;
GetGraphSize( Handle,&Hw,&Hh);
GetGraphSize(ShotGraph,&Sw,&Sh);
ShotX = (Hw-Sw)/2+x;
ShotY = (Hh-Sh)/2+y;
ShotFlag = 1;
}
DrawRotaGraph( x, y, 1.0, 0.0, Handle, TRUE ); // x,y の位置にキャラを描
}
//自機の移動ルーチン
if( ShotFlag == 1 )
{
// 弾を16ドット上に移動させる
ShotY -= 16 ;
// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
if( ShotY < -80 )
{
ShotFlag = 0 ;
}
// 画面に弾を描画する
DrawRotaGraph( ShotX , ShotY ,1.0 , 0.0 , ShotGraph , TRUE ) ;
}
//敵の移動ルーチン
{
if(NUMMuki == 1){
X += 3;
}
if(NUMMuki == 0){
X -= 3;
}
if(X>576){
X = 576;
NUMMuki = 0;
}
if(X<0){
X = 0;
NUMMuki = 1;
}
DrawRotaGraph(X,Y,1.0,0.0,NUM,TRUE);
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
間違っている部分などが有りましたら、ご指摘お願いします。