現在簡単な横スクロールのゲームを作成しているものです
キャラから弾を発射させるつもりがキャラが発射されます。
どこがおかしいのか分かりません。
またキャラに合わせてマップを動かしたいのですが
マップのプログラムをどう作成すればよいのか分かりません。
よろしければこのプログラムに合ったマップのプログラムを作ってほしいです。
マップはW;3352 H;478のサイズのステージを使うつもりです
よろしくお願いします。
[code=C]
#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 = 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 = 20;
}
//ショット処理
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;
}
}
}
[/code]
DXライブラリ ゲーム作成について
Re: DXライブラリ ゲーム作成について
本当ですか?nakada さんが書きました:キャラから弾を発射させるつもりがキャラが発射されます。
キャラに擬態した弾が発射されているだけじゃないですか?
少なくとも、、nakada さんが書きました:どこがおかしいのか分かりません。
- ショットっぽい物にPlayerクラスを使っている
- marimo2のショット情報を初期化していない
- shot関数において、
- 引数のKeyをいきなりぶっ壊してただのローカル変数として使っている
- コメントに反してOldkeyに前のキー入力状態を保存していない
- 「位置を上にずらす」というコメントに反して位置を右にずらす処理が書かれている
- 「画面外に出ていたらショットデータを無効にする」というコメントに反して、オーバーフローするまでショットデータを無効にしない可能性がある
すみませんが、さすがに自分にとってはよろしくないです。nakada さんが書きました: よろしければこのプログラムに合ったマップのプログラムを作ってほしいです。
作ってくれるおせっかいさんがいるといいですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)