画像をキー入力で移動

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

画像をキー入力で移動

#1

投稿記事 by garagara » 16年前

分割した画像をキー入力で画像を移動させるというのがプログラミングの館であったので、
自分で構造体を作り、自分で作成してみました。しかし、プログラミングの館を参考にしながら作成したにも
関わらず、正常に動作されません。(エラーは起きない。)


#include "DxLib.h"
#include "練習[主人公].h"

char Key[256];

int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{

if(DxLib_Init()==-1)return -1;
SetDrawScreen(DX_SCREEN_BACK);

while(ProcessMessage()==0)
{

ClsDrawScreen() ;

//◇◇◇プログラミング開始◇◇◇

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

if(Key[KEY_INPUT_RIGHT] == 1)
c_character.chief_x ++;


c_character.chief_image = image[11];

DrawGraph(c_character.chief_x , c_character.chief_y , c_character.chief_image , TRUE);



ScreenFlip();

if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;
}
DxLib_End();
return 0;

}



----------------------------------------------------------------------------------------------------

練習.h

#include "DxLib.h"

struct chief { //主人公の構造体

int chief_x; //主人公のX座標
int chief_y; //主人公のY座標
int chief_image;//主人公の画像(32x32)
int chief_up; //主人公の向き(上)
int chief_down; //主人公の向き(下)
int chief_left; //主人公の向き(左)
int chief_right;//主人公の向き(右)
int chief_stop; //主人公が止まっている
int chief_moves;//主人公が動いている

}c_character;



これで、正常に動作しない原因はなんでしょうか?また、解決法はどうすれば良いでしょうか?
構造体は、使用していない関数(?)があります。

チルチル

Re:画像をキー入力で移動

#2

投稿記事 by チルチル » 16年前

c_character.chief_x =100;
c_character.chief_y =100;

をループの前にしてはどうでしょうか?

チルチル

Re:画像をキー入力で移動

#3

投稿記事 by チルチル » 16年前

ちなみに正常に動作しないと言うのは具体的に何が起こっているのですか?



それから

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

if(Key[KEY_INPUT_RIGHT] == 1)
c_character.chief_x ++;


c_character.chief_image = image[11];

の範囲もループの前で行った方が良いと思います



if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;

は危ない気がするので条件式に加えるか

if( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;

としてはどうでしょうか?



あとKey[/url]とCheckHitKey()の2通りあるのはなぜですか?

それとKey[/url]に代入がされていない気がするのですが・・



>プログラミングの館を参考にしながら作成したにも関わらず

少し理解が不足しているようですね・・

kazuoni

Re:画像をキー入力で移動

#4

投稿記事 by kazuoni » 16年前

if(CheckHitKey(KEY_INPUT_LALT)==1) 
if (CheckHitKey(KEY_INPUT_F4)==1) 
break;
は大丈夫では?
特に問題ないかと思います。
まぁ、インデントしといたほうがあとが見やすいですけどね。


#余談
#include "練習[主人公].h"
あんまり日本語ファイル名のヘッダーってみないですよね。
自分だけかもしれないですけど・・・。^^;

Justy

Re:画像をキー入力で移動

#5

投稿記事 by Justy » 16年前

 本題からは外れますが、

> if(CheckHitKey(KEY_INPUT_LALT)==1)
> if (CheckHitKey(KEY_INPUT_F4)==1)
> break;

 ALT + F3とか Ctrl + Qとか他の組み合わせならわかるのですが、
ALT + F4ならこれ要らないですよね……。
 

garugaru

Re:画像をキー入力で移動

#6

投稿記事 by garugaru » 16年前

皆様返信ありがとうございます。



>ループの前にしてはどうでしょうか?

while(ProcessMessage()==0)
{
の前に入れてもダメでした。

>ちなみに正常に動作しないと言うのは具体的に何が起こっているのですか?

エラーは起こらず普通に起動はするのですが、右キーを押しても、画像が右に移動しません。
多分、if(Key[KEY_INPUT_RIGHT]==1)という部分が怪しいです。

>範囲もループの前で行った方が良いと思います

while(ProcessMessage()==0)
{
の前に入れてもダメでした。

>if( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;

if(CheckHitKey(KEY_INPUT_LALT)==1)
if (CheckHitKey(KEY_INPUT_F4)==1)
break;


をif( CheckHitKey(KEY_INPUT_LALT)==1 && CheckHitKey(KEY_INPUT_F4)==1 )break;
に書き直してもダメでした。

>あとKey[/url]とCheckHitKey()の2通りあるのはなぜですか?

CheckHitKey()はDXリファレンスを見てやったもので、Key[/url]のほうはプログラミング館にあったので2箇所になってしまいました・・・。また、if(CheckHitKey(KEY_INPUT_RIGHT)==1)
c_character.chief_x ++;
               とやってもほんの少しだけ動いただけで(カクッと)だめでした。


>それとKey[/url]に代入がされていない気がするのですが・・

if(Key[KEY_INPUT_RIGHT] == 1)の後に文章を表示する処理をしたところ、正常に表示されませんでした。
なので、   if(Key[KEY_INPUT_RIGHT] == 1)    の処理が間違っているように見えます。(一番怪しい箇所)
Key[/url]に代入がされていないとは、どういうことでしょうか。理解力なくてすみません・・・。

>あんまり日本語ファイル名のヘッダーってみないですよね。

英語より日本語のほうが分かるので、分かりやすい日本語にしてみました。"主人公.png"も分かりやすいので日本語です!


>ALT + F3とか Ctrl + Qとか他の組み合わせならわかるのですが、
ALT + F4ならこれ要らないですよね……。

確かにそうですよね・・・。
ALT F4は強制終了なので、一々そんな処理しなくても大丈夫ですよね・・・。

garugaru

Re:画像をキー入力で移動

#7

投稿記事 by garugaru » 16年前

すみません。今、プログラムとにらめっこして、間違っている部分を見つけました。

GetHitKeyStateAll( Key ) ; という部分が抜けていました・・・。本当に単純なミスでした・・。
しかし、これを加えても、押している間は、右にちょっと移動するのですが、離すとまた戻ってしまいます。

>それとKey[/url]に代入がされていない気がするのですが・・
この部分が理解できました。 GetHitKeyStateAll(Key)のことですよね。

sizuma

Re:画像をキー入力で移動

#8

投稿記事 by sizuma » 16年前

チルチルさんのアドバイスを実行してみてください。


>英語より日本語のほうが分かるので、分かりやすい日本語にしてみました。
僕も始めたときはそう思ってましたけど、普通はしないですね。
そのうち英語で慣れてきますよ。
今はかなり違和感があって見づらいです。たぶん普通のプログラマーの方もそうなんではないでしょうか。
別に誰にもコードを見せないならそれでいいと思いますけど・・・

チルチル

Re:画像をキー入力で移動

#9

投稿記事 by チルチル » 16年前

>押している間は、右にちょっと移動するのですが、離すとまた戻ってしまいます。
これは「押し続けている間は右にどんどん進んで行くけど、離した瞬間に初期位置に戻る」と言う事でしょうか?

違う場合はもしかしたら「ちょっと移動」と言うのは1ピクセルの事ではないでしょうか?

c_character.chief_x =100;
c_character.chief_y =100;

を現在でもループの前に置いてあるでしょうか?

ループの中に戻している場合は毎フレーム初期位置に戻されてしまいます
右を押している時は戻った後で右に1ピクセル動いているので
押している間だけ右に1ピクセル動くという現象が起きているのではないでしょうか?

あと下の処理はループの前で行ってください

int image[12];

c_character.chief_x =100;
c_character.chief_y = 100;

LoadDivGraph("主人公.png" , 12 , 3 , 4 , 32 , 32 , image);

c_character.chief_image = image[11];

見た目には変化が無いように見えますが
画像を毎フレーム読み込んでいるので重くなって行くと思います

garugaru

Re:画像をキー入力で移動

#10

投稿記事 by garugaru » 16年前

出来ました!ありがとうございます!

ループの中にあったので出来なかったのですか・・。

while(ProcessMessage()==0)
{
の外から行う処理もある・・・ 勉強になりました!

目的は、4方向に斜めありで処理することなので、出来るように頑張ります。

garugaru

Re:画像をキー入力で移動

#11

投稿記事 by garugaru » 16年前

解決押し忘れました。

Dixq (管理人)

Re:画像をキー入力で移動

#12

投稿記事 by Dixq (管理人) » 16年前

ファイルやファイルパスに全角を使うと自分が今使っている環境じゃないと動かないって可能性があるんですよね。
例えばLinuxで動かすとか、日本語に対応していないOSで使うとか・・。

現に龍神録は一部ファイルパスに全角が含まれていたので、
海外の方から龍神録が自分の環境で遊べないと苦情が何件か寄せられました。

何を思ったのか、練習の為に作ったセーブデータの暗号化ツールの書き出すファイル名が「セーブデータ.dat」だったんですが、面倒だからそのまま使いまわしました・・。

・・その結果がこれd・・・!・・でした^^;

garugaru

Re:画像をキー入力で移動

#13

投稿記事 by garugaru » 16年前

な、、なるほど!日本語に対応してないOSからですか!

本番(練習じゃないもの)になったら、また新しくファイルを作ろうと思ってるので、多分大丈夫だと思います!

閉鎖

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