このプログラムについて
前回みけCATさんが教えて下さった明らかな間違いを具体的にどこを直せばいいか教えて欲しいです。
また背景に画像を表示してキャラに合わせて横にスクロールするプログラム作成方法が分かりません。よろしければサンプルプログラムを作っていただけるとありがたいです。
勉強不足ですみません。
よろしくお願いします。
#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include "DxLib.h"
#include <math.h>
#include <string.h>
// ショットの最大数
#define MAX_SHOT 10000
struct Player
{
int x;
int y;
int JumpPower;
int shot;
int img;
int shotx[MAX_SHOT];//ショットの位置
int shoty[MAX_SHOT];//ショットの位置
int ShotValid[MAX_SHOT]; // ショットが存在するか、フラグ
};
//プロトタイプ宣言
void GameInit(Player *pz, int x, int y,const char *name);
void Update(Player *pz);
void Jump(Player *pz, int Key);
void shot(Player *pz, int Key);
void GameInit2(Player *pz, int x, int y, const char *name2);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
// 警告避け
(void)hInstance; (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow;
//変数宣言
Player marimo2;
Player ビーム2;
SetGraphMode(640, 480, 16);
SetWaitVSyncFlag(FALSE); //画面更新が遅くならないようにする
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK);
//ゲームの初期化
GameInit(&marimo2, 30, 400, "marimo2.jpg");
GameInit2(&ビーム2, 30, 400, "ビーム2.jpg");
// ループ
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
ClsDrawScreen();//画面消去
//キャラクター更新(位置、速度、球数etc)
Update(&marimo2);
Update(&ビーム2);
ScreenFlip();//画面更新
//待ち時間
WaitTimer(10);
}
DxLib_End();// DXライブラリ使用の終了処理
return 0;// ソフトの終了
}
//初期化
void GameInit(Player *pz, int x, int y, const char *name)
{
//初期値を設定
pz->x = x;
pz->y = y;
pz->JumpPower = 0;
//画像ファイルの読み込み
pz->img = LoadGraph(name);
}
void GameInit2(Player *pz, int x, int y, const char *name2)
{
int i;
// ショットの存在を初期化する
for (i = 0; i < MAX_SHOT; i++)
pz->ShotValid[i] = 0;
//画像ファイルの読み込み
pz->img = LoadGraph(name2);
}
//更新
void Update(Player *pz)
{
int j;
// キー入力取得
int Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
//位置の更新
if (Key & PAD_INPUT_RIGHT)
{
pz->x += 1; // 右を押していたら右に進む
}
else if (Key & PAD_INPUT_LEFT)
{
pz->x -= 1; // 左を押していたら左に進む
}
Jump(pz, Key);
shot(pz, Key);
//描画処理
DrawGraph(pz->x, pz->y, pz->img, TRUE);
// ショットを描画する
for (j = 0; j < MAX_SHOT; j++)
{
// ショットデータが有効な時のみ描画
if (pz->ShotValid[j] == 1)
{
DrawGraph(pz->shotx[j], pz->shoty[j], pz->img, TRUE);
}
}
}
//ジャンプ処理
void Jump(Player *pz, int Key)
{
//落下処理
pz->y -= pz->JumpPower;
//落下速度を与える
pz->JumpPower -= 1;
// もし地面についていたら止まる
if (pz->y > 400)
{
pz->y = 400;
pz->JumpPower = 0;
}
// ジャンプボタンを押していて、地面についていたらジャンプ
if ((Key & PAD_INPUT_B) && pz->y == 400) pz->JumpPower = 22;
}
//ショット処理
void shot(Player *pz,int Key)
{
int j;
int OldKey;//前のキー入力状態
// キー入力取得
Key = 0;
OldKey = Key;
Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
// ショットの移動処理
for (j = 0; j < MAX_SHOT; j++)
{
// ショットデータが無効だったらスキップ
if (pz->ShotValid[j] == 0) continue;
// 位置を上にずらす
pz->shotx[j] += 8;
// 画面外に出ていたらショットデータを無効にする
if (pz->shotx[j] < -32) pz->ShotValid[j] = 0;
}
// ショットボタンを押していたらショットを出す
// 一つ前のループでショットボタンを押していたらショットは出さない
if ((Key & ~OldKey) & PAD_INPUT_A)
{
// 使われていないショットデータを探す
for (j = 0; j < MAX_SHOT; j++)
{
if (pz->ShotValid[j] == 0) break;
}
// もし使われていないショットデータがあったらショットを出す
if (j != MAX_SHOT)
{
// ショットの位置を設定
pz->shotx[j] = pz->x + 50;
pz->shoty[j] = pz->y + 16;
// ショットデータを使用中にセット
pz->ShotValid[j] = 1;
}
}
}