プレイヤー移動について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ろりがみ

プレイヤー移動について

#1

投稿記事 by ろりがみ » 5年前

初めまして。ろりがみといいます
今、東方風の縦シューティングを作っています。
なんとか画像表示ができ、動かせるようにはできました。
そこで質問なのですが、移動の際、移動する方向に傾くようにするにはどうすればよいのでしょうか?
一応ソースを貼っておきます

#include "DxLib.h"

typedef struct {
int x, y, img, muki, walking_flag;
} ch_t;

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {

int image[24];
char Key[256]; //キーが押されているフレーム数を格納
ch_t ch;

if ( ChangeWindowMode( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
//ウィンドウ化と初期化処理


int flag = 0;
int w = 0;
int i = 0;
int z = 0;
ch.x = 320;
ch.y = 160;
ch.walking_flag = 0;
ch.muki = 3;

SetDrawScreen( DX_SCREEN_BACK );
LoadDivGraph( "画像/sakuya.png", 24, 8, 3, 32, 47, image ); //画像分割読み込み

//メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
while( !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] ) {

if( flag == 0 ) {
ch.walking_flag = 1; //歩くフラグ
if ( Key[KEY_INPUT_UP] == 1 ) //上
ch.muki = 0;
else if ( Key[KEY_INPUT_LEFT] == 1 ) //左
ch.muki = 1;
else if ( Key[KEY_INPUT_DOWN] == 1 ) //↓
ch.muki = 2;
else if ( Key[KEY_INPUT_RIGHT] == 1 ) //右
ch.muki = 3;
else
ch.walking_flag = 0;

}
if( ch.walking_flag == 1 ) {
if ( ch.muki == 0 ) { //上
ch.img = image[w % 8];
ch.y--;
i++;
if( i > 8 ) {
w++;
i = 0;
}
} else if ( ch.muki == 1 ) { //左

w = 11;
if( w == 16 ) {
ch.img = image[w % 21];
}
w++;
ch.x--;
} else if ( ch.muki == 2 ) { //↓
ch.img = image[w % 8];
ch.y++;
i++;
if( i > 8 ) {
w++;
i = 0;
}
} else if ( ch.muki == 3 ) { //右
ch.img = image[w % 8];
ch.x++;
i++;
if( i > 8 ) {
w++;
i = 0;
}
}

}

ch.img = image[w];
DrawGraph( ch.x, ch.y, ch.img, TRUE ); //画像描画

ScreenFlip(); //裏画面を表画面に反映
}
DxLib_End(); //DXライブラリ終了処理
return 0;
}

このソースは、このサイトの、他のスレから取ったものです。
なお、そのスレは未解決のまま止まっていました。
このソースだと、勝手に消えたりするのです。
どうすれば良いのでしょうか?ご回答お願いします

ろりがみ

Re: プレイヤー移動について

#2

投稿記事 by ろりがみ » 5年前

コード:

#include "DxLib.h"
 
typedef struct {
    int x, y, img, muki, walking_flag;
} ch_t;
 
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
 
    int image[24];
    char Key[256]; //キーが押されているフレーム数を格納
    ch_t ch;
 
    if ( ChangeWindowMode( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    //ウィンドウ化と初期化処理
 
 
    int flag = 0;
    int w = 0;
    int i = 0;
    int z = 0;
    ch.x   = 320;
    ch.y   = 160;
    ch.walking_flag = 0;
    ch.muki = 3;
 
    SetDrawScreen( DX_SCREEN_BACK );
    LoadDivGraph( "画像/sakuya.png", 24, 8, 3, 32, 47, image ); //画像分割読み込み
 
    //メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
    while( !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] ) {
 
        if( flag == 0 ) {
            ch.walking_flag = 1;             //歩くフラグ
            if         ( Key[KEY_INPUT_UP] == 1 ) //上
                ch.muki = 0;
            else if    ( Key[KEY_INPUT_LEFT] == 1 ) //左
                ch.muki = 1;
            else if    ( Key[KEY_INPUT_DOWN] == 1 ) //↓
                ch.muki = 2;
            else if    ( Key[KEY_INPUT_RIGHT] == 1 ) //右
                ch.muki = 3;
            else
                ch.walking_flag = 0;
 
        }
        if( ch.walking_flag == 1 ) {               //ここからが問題かなと思っています
            if         ( ch.muki == 0 ) { //上
                ch.img = image[w % 8];
                ch.y--;
                i++;
                if( i > 8 ) {
                    w++;
                    i = 0;
                }
            } else if    ( ch.muki == 1 ) { //左
 
                w = 11;
                if( w == 16 ) {
                    ch.img = image[w % 21];
                }
                w++;
                ch.x--;
            } else if    ( ch.muki == 2 ) { //↓
                ch.img = image[w % 8];
                ch.y++;
                i++;
                if( i > 8 ) {
                    w++;
                    i = 0;
                }
            } else if    ( ch.muki == 3 ) { //右
                ch.img = image[w % 8];
                ch.x++;
                i++;
                if( i > 8 ) {
                    w++;
                    i = 0;
                }
            }
 
        }
 
        ch.img = image[w];
        DrawGraph( ch.x, ch.y, ch.img, TRUE ); //画像描画
 
        ScreenFlip(); //裏画面を表画面に反映
    }
    DxLib_End(); //DXライブラリ終了処理
    return 0;
}
申し訳ありません、こちらが正しいですね

アバター
usao
記事: 1566
登録日時: 6年前

Re: プレイヤー移動について

#3

投稿記事 by usao » 5年前

>傾く
…って何ですか?
何が どのように どれだけ 傾くのでしょうか?

ろん
記事: 18
登録日時: 8年前

Re: プレイヤー移動について

#4

投稿記事 by ろん » 5年前

57~59行目がおかしいように見受けられます。
wに11を入れて、次のif文で16と同じかを判断してますね。
59行も他の3方向では %8 の8パターンで回しているのに21で剰余してます。
(コピペミスでしょうか?)
傾きに関しては24分割して読み込んでいるpngファイルに傾いているように見えるチップが無いと出来ないとしか言い様がありません。

w = 11;
if( w == 16 ) {
ch.img = image[w % 21];

ろりがみ

Re: プレイヤー移動について

#5

投稿記事 by ろりがみ » 5年前

[img]R:\とーほーしかこーさい\GameProg_2012\画像\sakuya.png[/img]
画像これです
みれるかな

ろりがみ

Re: プレイヤー移動について

#6

投稿記事 by ろりがみ » 5年前

あ、見れない・・・
R:\とーほーしかこーさい\GameProg_2012\画像\sakuya.png
↑これコピーしてアドレスに張れば見れるはずです

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: プレイヤー移動について

#7

投稿記事 by へにっくす » 5年前

ろりがみ さんが書きました:あ、見れない・・・
R:\とーほーしかこーさい\GameProg_2012\画像\sakuya.png
↑これコピーしてアドレスに張れば見れるはずです
見れません
そのフォルダはあなたのPCでしか存在しないのです。

投稿するときに、以下のイメージのように、ファイル添付タブを押して、画像をあげてください。
添付ファイル
dixq_net_forum_3_t15768_image_1.png
dixq_net_forum_3_t15768_image_1.png (22.24 KiB) 閲覧数: 3064 回
written by へにっくす

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

Re: プレイヤー移動について

#8

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

ろりがみ さんが書きました:あ、見れない・・・
R:\とーほーしかこーさい\GameProg_2012\画像\sakuya.png
↑これコピーしてアドレスに張れば見れるはずです
「アドレスに張る」とはどのような操作ですか?
へにっくす さんが書きました:投稿するときに、以下のイメージのように、ファイル添付タブを押して、画像をあげてください。
その機能は登録(し、ログイン状態である)ユーザーしか使えなかったと思います。
使えない場合は、適当なアップローダーに画像を上げるといいと思います。
アップローダーの例:http://www.axfc.net/uploader/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ろりがみ

Re: プレイヤー移動について

#9

投稿記事 by ろりがみ » 5年前

すみません、レス遅れました
なぜか画像が投稿できなかったのでアップローダにアップしておきました
http://www1.axfc.net/u/3337919

ろん
記事: 18
登録日時: 8年前

Re: プレイヤー移動について

#10

投稿記事 by ろん » 5年前

 何で前回ソース見た時に気づかなかったんだろう
全ての元凶はint wだと思う、w++でインクリメントしっぱなしになってますが仕様ですか?

int wには手を入れずに左右の処理を下記のように修正してデバッグしてみて下さい。
左右キーを押し始めた最初の8フレームだけは意図した感じに表示されるはずです。

左処理: ch.img = image[w % 8 + 8]; //8~16 昇順でループ
右処理: ch.img = image[w % 8 + 16]; //17~23 昇順でループ

そこからは意図した通りのグラフィックが描画されるようint wの中身(もしくはimageの添え字)を操作出来るようにソースに追加していけばよいのではないでしょうか。

 追記
左右キーを押しっぱなしの状態で描画領域両端or障害物に衝突した場合、グラを傾き状態のままにするか中立状態に戻すのか
操作キーを離した時、傾きは徐々に戻すのか?戻すとしたら、戻す早さは傾く時と同じでいいのか?を考えないと何度もソースを書き直すはめになります。

ろりがみ

Re: プレイヤー移動について

#11

投稿記事 by ろりがみ » 5年前

 追記
左右キーを押しっぱなしの状態で描画領域両端or障害物に衝突した場合、グラを傾き状態のままにするか中立状態に戻すのか
操作キーを離した時、傾きは徐々に戻すのか?戻すとしたら、戻す早さは傾く時と同じでいいのか?を考えないと何度もソースを書き直すはめになります。
画面か衝突した場合、グラは傾き状態のままでいいです
操作キーを離した時は、傾くときと同じ早さで問題ないです。
 何で前回ソース見た時に気づかなかったんだろう
全ての元凶はint wだと思う、w++でインクリメントしっぱなしになってますが仕様ですか?

int wには手を入れずに左右の処理を下記のように修正してデバッグしてみて下さい。
左右キーを押し始めた最初の8フレームだけは意図した感じに表示されるはずです。

左処理: ch.img = image[w % 8 + 8]; //8~16 昇順でループ
右処理: ch.img = image[w % 8 + 16]; //17~23 昇順でループ

そこからは意図した通りのグラフィックが描画されるようint wの中身(もしくはimageの添え字)を操作出来るようにソースに追加していけばよいのではないでしょうか。
えーと・・・初心者なのでまったく理解できません
お手数ですがもう一度コードを書き直してもらってもよろしいでしょうか?

ろりがみ

Re: プレイヤー移動について

#12

投稿記事 by ろりがみ » 5年前

画面か衝突した場合
「画面端か障害物に衝突した場合」の間違えです

ろん
記事: 18
登録日時: 8年前

Re: プレイヤー移動について

#13

投稿記事 by ろん » 5年前

自分でもソースいじってみたら前回指摘した所だけ修正しても動きませんでした。
同時押しした際の挙動が怪しかったのと、操作開始してからしばらく経つとキャラが表示されなくなる挙動をこちらでも確認出来たので色々と書き換えました。
とりあえずコレを理解して、それでも分からない所があったらトピック立て直して質問し直した方が良いと思われます。

後はint wから左右の傾きを求めず左右独立した変数(ch.left,ch.right)を追加して
それぞれ8~15、16~23の範囲で増減を操作出来るようソースを追加するだけなんですが
一度に全部やっちゃうとわけわからなくなるので少しずつ理解していってください。

余裕があったら良書なのでこちらの購入をお勧めします。
著者:大槻有一郎 ISBN978-4-89977-411-2
14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013偏

初期化変数3行、変更&追加

コード:

ch.muki = 0; //初期化値 0へ変更
ch.muki = 0;
ch.img = image[0];
・変更点
フラグ判定順を上>下>左>右に。
4方向のフラグを1個の変数で管理する為、2進数ビット比較に。
デバッグ中、操作キャラを初期位置へ戻したい時もあるかと思いJキー機能追加(必要なくなったら消してください)

コード:

{

		if (flag == 0) {
			ch.walking_flag = 1;             //歩くフラグ
			if (Key[KEY_INPUT_UP] != 0){ //上
				ch.muki = ch.muki | 2;
			}
			if (Key[KEY_INPUT_DOWN] != 0){ //下
				ch.muki = ch.muki | 4;
			}
			if (Key[KEY_INPUT_LEFT] != 0){ //左
				ch.muki = ch.muki | 8;
			}
			if (Key[KEY_INPUT_RIGHT] != 0){//右
				ch.muki = ch.muki | 16;
			}
		}
		if (ch.walking_flag == 1) {
			if (ch.muki & 2) { //上
				ch.img = image[w % 8];
				ch.y--;
				ch.muki = ch.muki ^ 2;
			}
			if (ch.muki & 4) { //下
				ch.img = image[w % 8];
				ch.y++;
				ch.muki = ch.muki ^ 4;
			}
			if (ch.muki & 8) { //左
				ch.img = image[w % 8 + 8];
				ch.x--;
				ch.muki = ch.muki ^ 8;
			}
			if (ch.muki & 16) { //右
				ch.img = image[w % 8 + 16];
				ch.x++;
				ch.muki = ch.muki ^ 16;
			}
			i++;
			ch.walking_flag = 0;
		}
		if (Key[KEY_INPUT_J] != 0){ // 操作キャラの出現位置初期化
			ch.x = 320;
			ch.y = 120;
		}
		DrawGraph(ch.x, ch.y, ch.img, TRUE); //画像描画
		if (i > 8) {
			w++;
			i = 0;
		}
	}

ろりがみ

Re: プレイヤー移動について

#14

投稿記事 by ろりがみ » 5年前

新しく作成してもらったコードを使うと以下のエラーが発生しました。

・エラー 1 error C1075: 左側 中かっこ '{' に対応するものが 'r:\とーほーしかこーさい\gameprog_2012\test.cpp(32)' で見つかる前に EOF が検出されました。 r:\とーほーしかこーさい\gameprog_2012\test.cpp 85 1 GameProg_2012

・エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません r:\とーほーしかこーさい\gameprog_2012\source.cpp 84 1 GameProg_2012

・エラー 3 error C2059: 構文エラー : 'return' r:\とーほーしかこーさい\gameprog_2012\source.cpp 85 1 GameProg_2012

・エラー 4 error C2059: 構文エラー : '}' r:\とーほーしかこーさい\gameprog_2012\source.cpp 86 1 GameProg_2012

・エラー 5 error C2143: 構文エラー : ';' が '}' の前にありません。 r:\とーほーしかこーさい\gameprog_2012\source.cpp 86 1 GameProg_2012

・エラー 6 IntelliSense: 明示的な型がありません ('int' が想定されます) r:\とーほーしかこーさい\GameProg_2012\Source.cpp 84 5 GameProg_2012

・エラー 7 IntelliSense: 宣言が必要です r:\とーほーしかこーさい\GameProg_2012\Source.cpp 85 5 GameProg_2012

・エラー 8 IntelliSense: 宣言が必要です r:\とーほーしかこーさい\GameProg_2012\Source.cpp 86 1 GameProg_2012

ろりがみ

Re: プレイヤー移動について

#15

投稿記事 by ろりがみ » 5年前

なお、コードはこのような感じです

コード:

#include "DxLib.h"
 
typedef struct {
    int x, y, img, muki, walking_flag;
} ch_t;
 
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
 
    int image[24];
    char Key[256]; //キーが押されているフレーム数を格納
    ch_t ch;
 
    if ( ChangeWindowMode( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    //ウィンドウ化と初期化処理
 
 
    int flag = 0;
    int w = 0;
    int i = 0;
    int z = 0;
    ch.x   = 320;
    ch.y   = 160;
    ch.walking_flag = 0;
    ch.muki = 3;
 
    SetDrawScreen( DX_SCREEN_BACK );
    LoadDivGraph( "画像/sakuya.png", 24, 8, 3, 32, 47, image ); //画像分割読み込み
 
    //メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
    while( !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] ){
 
        if (flag == 0) {
            ch.walking_flag = 1;             //歩くフラグ
            if (Key[KEY_INPUT_UP] != 0){ //上
                ch.muki = ch.muki | 2;
            }
            if (Key[KEY_INPUT_DOWN] != 0){ //下
                ch.muki = ch.muki | 4;
            }
            if (Key[KEY_INPUT_LEFT] != 0){ //左
                ch.muki = ch.muki | 8;
            }
            if (Key[KEY_INPUT_RIGHT] != 0){//右
                ch.muki = ch.muki | 16;
            }
        }
        if (ch.walking_flag == 1) {
            if (ch.muki & 2) { //上
                ch.img = image[w % 8];
                ch.y--;
                ch.muki = ch.muki ^ 2;
            }
            if (ch.muki & 4) { //下
                ch.img = image[w % 8];
                ch.y++;
                ch.muki = ch.muki ^ 4;
            }
            if (ch.muki & 8) { //左
                ch.img = image[w % 8 + 8];
                ch.x--;
                ch.muki = ch.muki ^ 8;
            }
            if (ch.muki & 16) { //右
                ch.img = image[w % 8 + 16];
                ch.x++;
                ch.muki = ch.muki ^ 16;
            }
            i++;
            ch.walking_flag = 0;
        }
        if (Key[KEY_INPUT_J] != 0){ // 操作キャラの出現位置初期化
            ch.x = 320;
            ch.y = 120;
        }
        DrawGraph(ch.x, ch.y, ch.img, TRUE); //画像描画
        if (i > 8) {
            w++;
            i = 0;
        }
    }
 
        ScreenFlip(); //裏画面を表画面に反映
    }
    DxLib_End(); //DXライブラリ終了処理
    return 0;
}

ろん
記事: 18
登録日時: 8年前

Re: プレイヤー移動について

#16

投稿記事 by ろん » 5年前

 自分のいじってるソースに組み込む形で編集していた為、相違点がいくつかありましたので独立したソースにて手直し致しました。大変、失礼しました。
ソース全文載せましたのでこれで、動くはずです。

分割読み込みした画像の添え字を初期化する為、LoadDivGraphの位置をそれより前に行移動しましたのでお気を付けください。

コード:

#include "DxLib.h"

typedef struct {
	int x, y, img, muki, walking_flag;
} ch_t;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

	int image[24];
	char Key[256]; //キーが押されているフレーム数を格納
	ch_t ch;

	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1) return -1;
	//ウィンドウ化と初期化処理

	LoadDivGraph("画像/sakuya.png", 24, 8, 3, 32, 47, image); //画像分割読み込み

	int flag = 0;
	int w = 0;
	int i = 0;
	int z = 0;
	ch.x = 320;
	ch.y = 160;
	ch.walking_flag = 0;
	ch.muki = 0;
	ch.img = image[0];  //分割画像:添え字初期位置

	SetDrawScreen(DX_SCREEN_BACK);
	

	//メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
	while (!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) && !Key[KEY_INPUT_ESCAPE]) {

		if (flag == 0) {
			ch.walking_flag = 1;             //歩くフラグ
			if (Key[KEY_INPUT_UP] != 0){ //上
				ch.muki = ch.muki | 2;
			}
			if (Key[KEY_INPUT_DOWN] != 0){ //下
				ch.muki = ch.muki | 4;
			}
			if (Key[KEY_INPUT_LEFT] != 0){ //左
				ch.muki = ch.muki | 8;
			}
			if (Key[KEY_INPUT_RIGHT] != 0){//右
				ch.muki = ch.muki | 16;
			}
			if (ch.muki == 0){
				ch.img = image[w % 8];
			}
		}
		if (ch.walking_flag == 1) {
			if (ch.muki & 2) { //上
				ch.img = image[w % 8];
				ch.y--;
				ch.muki = ch.muki ^ 2;
			}
			if (ch.muki & 4) { //下
				ch.img = image[w % 8];
				ch.y++;
				ch.muki = ch.muki ^ 4;
			}
			if (ch.muki & 8) { //左
				ch.img = image[w % 8 + 8];
				ch.x--;
				ch.muki = ch.muki ^ 8;
			}
			if (ch.muki & 16) { //右
				ch.img = image[w % 8 + 16];
				ch.x++;
				ch.muki = ch.muki ^ 16;
			}
			i++;
			ch.walking_flag = 0;
		}
		if (Key[KEY_INPUT_J] != 0){ // 操作キャラの出現位置初期化
			ch.x = 320;
			ch.y = 120;
		}
		DrawGraph(ch.x, ch.y, ch.img, TRUE); //画像描画
		if (i > 8) {
			w++;
			i = 0;
		}
		ScreenFlip(); //裏画面を表画面に反映
	}
	DxLib_End(); //DXライブラリ終了処理
	return 0;
}

ろりがみ

Re: プレイヤー移動について

#17

投稿記事 by ろりがみ » 5年前

レス遅れました
えっと、何とか動くようにはなりました。
ちゃんとアニメーションもしています。

ですが、横にずっと動かすと傾きを繰り返してしまいます
なぜでしょうか?
うまく文字で表せないのですが、一定傾くとまた戻って、また傾き始める、といった感じです

Rittai_3D
記事: 524
登録日時: 7年前

Re: プレイヤー移動について

#18

投稿記事 by Rittai_3D » 5年前

DrawFormatString() や printfDx() などを利用して数値をみて見れば分かるはずです。
ソースコードをよく読んでいないのですが、ch.imgの値を見てみましょう。
初心者です

LL

Re: プレイヤー移動について

#19

投稿記事 by LL » 5年前

質問に直接関係ありませんが、Axfc Uploaderはアダルトサイトのバナーが大量に出るのでこの質問サイトには不向きかと思われるのですが・・・
前にもAxfc Uploaderでアップロードした質問者が管理人副管理人に、小学生もこのサイトを閲覧する可能性がある以上アダルトサイトへのリンクの可能性があるために
対象のリンクを削除された事案を見たのですが・・・
ファイルをあげるのであれば、それらの不健全なバナーが表示されないアップローダーにあげるべきだと思います。
例えばgoogle driveやDropBox等・・・

LL

Re: プレイヤー移動について

#20

投稿記事 by LL » 5年前

先ほどお伝えしたAxfc Uploaderの件ですが
下記↓のトピックにて
http://dixq.net/forum/viewtopic.php?f=3&t=15832
ソフト屋さんが規制していました。

と言うか、 みけCATさん程のお人がこの手のサイトを他の方にお勧めしてはダメでしょう・・・

閉鎖

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