teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

2019/08/09 21:51

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,26 @@
1
1
  ```
2
+ #include "DxLib.h"
3
+
4
+
5
+
6
+ int Key[256]; // キーが押されているフレーム数を格納する
7
+
8
+ // キーの入力状態を更新する
9
+ int gpUpdateKey() {
10
+ char tmpKey[256]; // 現在のキーの入力状態を格納する
11
+ GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
12
+ for (int i = 0; i < 256; i++) {
13
+ if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
14
+ Key[i]++; // 加算
15
+ }
16
+ else { // 押されていなければ
17
+ Key[i] = 0; // 0にする
18
+ }
19
+ }
20
+ return 0;
21
+ }
22
+
2
- // プログラムは WinMain から始まります
23
+ // プログラムは WinMain から始まります
3
24
  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
4
25
  {
5
26
  SetGraphMode(1600, 680, 32); // ウィンドウの大きさを指定
@@ -20,17 +41,101 @@
20
41
  {0, 0, 0 }
21
42
  };
22
43
 
44
+ int playerX = 0; // キャラのX座標
45
+ int playerY = 300; // キャラのY座表
46
+ //double a[2][2];//移動制限のための配列の変数
23
- int 加算=40;
47
+ int x = 0;
24
- int a ;
48
+ int y = 0;
25
- for(int x=0;x<3;x++){
26
- a=a+加算;
27
49
 
50
+
51
+
52
+ //グラフィックハンドル格納用配列
53
+ int gh[12];
54
+ LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
55
+ DrawGraph(playerX, playerY, gh[8], FALSE);// プレイヤーの画像を描画
56
+
57
+
58
+
59
+ while (ScreenFlip() == 0 && ProcessMessage() == 0&& gpUpdateKey() == 0) {
60
+
61
+ int 加算=40;
62
+ int b = 40;
63
+
64
+
65
+ // カーソルキーの右が押されている
66
+ if (Key[KEY_INPUT_RIGHT] == 1) {
67
+
68
+
69
+
70
+ for (int x = 0; x < 3; x++) {
71
+ playerX = playerX +加算;
72
+ if (playerX == x && playerY == y) {
73
+
74
+ // プレイヤーのX座標を加算//左だけplayerX2とするとfor文ではないので、一回しか起きない、playerXだとplayerX = playerX + 加算より、加算されたあとのplayerXが再び右辺のplayerXに入り加算されるを繰り返すため∞に右に行けるのだ
75
+ // 画面に出力
76
+ ScreenFlip();
77
+ // 画面をクリア
78
+ ClearDrawScreen();
79
+ // プレイヤーの画像を描画
80
+
81
+ DrawGraph(playerX, playerY, gh[2], true);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。
28
- }
82
+ }
29
- }
83
+ }
84
+
85
+ }
86
+
87
+ else { while (DrawGraph(playerX, playerY, gh[8], true)); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
88
+
89
+ if (Key[KEY_INPUT_UP] == 1) {
90
+ playerY = playerY - b; // プレイヤーのY座標を加算
91
+
92
+ // 画面に出力
93
+ ScreenFlip();
94
+ // 画面をクリア
95
+ ClearDrawScreen();
96
+ // プレイヤーの画像を描画
97
+ DrawGraph(playerX, playerY, gh[5], true);
98
+ }
99
+
100
+
101
+ if (Key[KEY_INPUT_LEFT] == 1){
102
+ playerX = playerX - 加算; // プレイヤーのX座標を加算
103
+
104
+
105
+ // 画面をクリア
106
+ ClearDrawScreen();
107
+ // プレイヤーの画像を描画
108
+ DrawGraph(playerX, playerY, gh[1], true);
109
+
110
+ }
111
+
112
+
113
+ if (Key[KEY_INPUT_DOWN] == 1) {
114
+ playerY = playerY + b; // プレイヤーのY座標を加算
115
+
116
+ // 画面に出力
117
+ ScreenFlip();
118
+ // 画面をクリア
119
+ ClearDrawScreen();
120
+ // プレイヤーの画像を描画
121
+ DrawGraph(playerX, playerY, gh[11], true);
122
+ }
123
+
124
+ }
125
+
126
+ DxLib_End(); // DXライブラリ使用の終了処理
127
+
128
+ return 0; // ソフトの終了
129
+
130
+ }
30
131
  ```
31
132
  以上のプログラムは合っているかわかりませんが、何を行いたいのか明確に書かせて頂きます。
32
133
  int型の関数aの横移動(横に40加算する)をfor(int x=0;x<3;x++)により横には2回しか[0][0]と[1][0]と進み、その先の[2][0]に演算後a(=80)を代入したいです。
33
134
 
34
135
 
35
136
  どうもfor文のxを使い加算する回数を2回で、かつ、[0]〜[2]のx座標内の範囲に出来ないため困っています。
36
- どうか教えてください。
137
+ どうか教えてください。
138
+
139
+ 編集
140
+ もしかしたらint 加算=40;なしに3*3のマスのプロラグムが作れるかもしれません。
141
+ 要は画像の最初の位置は[1][1]なので、if (Key[KEY_INPUT_RIGHT] == 1)より右のキーが押されたら[2][1]に進むように作りたいです。

1

編集

2019/08/09 21:51

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -1,18 +1,36 @@
1
- ```ここに言語を入力
1
+ ```
2
+ // プログラムは WinMain から始まります
3
+ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
4
+ {
5
+ SetGraphMode(1600, 680, 32); // ウィンドウの大きさを指定
6
+ ChangeWindowMode(TRUE);
7
+
8
+ if (DxLib_Init() == -1) // DXライブラリ初期化処理
9
+ {
10
+ return -1; // エラーが起きたら直ちに終了
11
+ }
12
+
13
+
14
+ //キー取得用配列
15
+ //char key[256];
16
+ //1. 3x3マスの2次元配列
2
- 配列[2][2]として
17
+ int pos[][3] = {
18
+ {0, 0, 0 },
19
+ {0, 0, 0 },
20
+ {0, 0, 0 }
21
+ };
22
+
3
23
  int 加算=40;
4
- int b ;
5
24
  int a ;
6
25
  for(int x=0;x<3;x++){
7
- for(int y=0;y<3;x++){
8
26
  a=a+加算;
9
- if(a==x&& b==y)
27
+
10
28
  }
11
29
  }
12
30
  ```
13
31
  以上のプログラムは合っているかわかりませんが、何を行いたいのか明確に書かせて頂きます。
14
- aに加算=40を2回だけ行い.その時のaのある場所の座標を[2][0]にしたいです。
15
- そして、if(a==x&& b==y)よりaが必ず[0][2]のx座標内範囲あるようにしたいです。できればbも同じ要領でプログラムを作りたいです。
32
+ int型の関数aの横移動(横に40加算する)をfor(int x=0;x<3;x++)より横には2回しか[0][0]と[1][0]と進み、そ[2][0]演算後a(=80)を代入したいです。
16
33
 
34
+
17
35
  どうもfor文のxを使い加算する回数を2回で、かつ、[0]〜[2]のx座標内の範囲に出来ないため困っています。
18
36
  どうか教えてください。