DXライブラリ ゲーム作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nakada
記事: 12
登録日時: 9年前

DXライブラリ ゲーム作成について

#1

投稿記事 by nakada » 9年前

現在簡単な横スクロールのゲームを作成しているものです

キャラから弾を発射させるつもりがキャラが発射されます。
どこがおかしいのか分かりません。

またキャラに合わせてマップを動かしたいのですが
マップのプログラムをどう作成すればよいのか分かりません。
よろしければこのプログラムに合ったマップのプログラムを作ってほしいです。
マップは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]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ ゲーム作成について

#2

投稿記事 by みけCAT » 9年前

nakada さんが書きました:キャラから弾を発射させるつもりがキャラが発射されます。
本当ですか?
キャラに擬態した弾が発射されているだけじゃないですか?
nakada さんが書きました:どこがおかしいのか分かりません。
少なくとも、、
  • ショットっぽい物にPlayerクラスを使っている
  • marimo2のショット情報を初期化していない
  • shot関数において、
    • 引数のKeyをいきなりぶっ壊してただのローカル変数として使っている
    • コメントに反してOldkeyに前のキー入力状態を保存していない
    • 「位置を上にずらす」というコメントに反して位置を右にずらす処理が書かれている
    • 「画面外に出ていたらショットデータを無効にする」というコメントに反して、オーバーフローするまでショットデータを無効にしない可能性がある
という所がおかしいですね。
nakada さんが書きました: よろしければこのプログラムに合ったマップのプログラムを作ってほしいです。
すみませんが、さすがに自分にとってはよろしくないです。
作ってくれるおせっかいさんがいるといいですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る