横スクロール 背景について

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

横スクロール 背景について

#1

投稿記事 by nakada » 8年前

何度も質問すみません。

このプログラムについて
前回みけ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;
		}
	}
}
最後に編集したユーザー nakada on 2016年1月12日(火) 22:44 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 8年前

前回のトピックが解決しておりませんので、前回のトピックをお使い下さいね。
トピックが乱立すると、まだ新しい他の人の質問が別ページに行ってしまったり、nakadaさんの質問と回答を追いかけるのが大変だったり、色々と悪影響が出ます。
他の人が回答を参考にするときに困りますし。

【補足】
同じテーマなら1トピックが理想です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nakada
記事: 12
登録日時: 8年前

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

#3

投稿記事 by nakada » 8年前

softya(ソフト屋) さんが書きました:前回のトピックが解決しておりませんので、前回のトピックをお使い下さいね。
トピックが乱立すると、まだ新しい他の人の質問が別ページに行ってしまったり、nakadaさんの質問と回答を追いかけるのが大変だったり、色々と悪影響が出ます。
他の人が回答を参考にするときに困りますし。

【補足】
同じテーマなら1トピックが理想です。

前回のトピックを削除すればよいですか?
その方法で良いのなら削除の仕方を教えてください。

一応件名を変えました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 8年前

削除するのは回答者に失礼です。
それに、「他の人が回答を参考にするときに困りますし。」の問題を無視することになります。
回答と質問の流れが分かりやすく1つのトピックで続いていくことが必要です。
なので、前回のトピックを完全に解決するまで使ってください。
もし質問テーマが大きく変わる時ならば、新しいトピックを立ててください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 横スクロール 背景について

#5

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

nakada さんが書きました:このプログラムについて
前回みけCATさんが教えて下さった明らかな間違いを具体的にどこを直せばいいか教えて欲しいです。
前回って何ですか?
リンクを貼ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)


閉鎖

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