質問編集履歴

2

2019/08/09 21:51

投稿

carnage0216
carnage0216

スコア194

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,48 @@
1
1
  ```
2
2
 
3
+ #include "DxLib.h"
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ int Key[256]; // キーが押されているフレーム数を格納する
12
+
13
+
14
+
15
+ // キーの入力状態を更新する
16
+
17
+ int gpUpdateKey() {
18
+
19
+ char tmpKey[256]; // 現在のキーの入力状態を格納する
20
+
21
+ GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
22
+
23
+ for (int i = 0; i < 256; i++) {
24
+
25
+ if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
26
+
27
+ Key[i]++; // 加算
28
+
29
+ }
30
+
31
+ else { // 押されていなければ
32
+
33
+ Key[i] = 0; // 0にする
34
+
35
+ }
36
+
37
+ }
38
+
39
+ return 0;
40
+
41
+ }
42
+
43
+
44
+
3
- // プログラムは WinMain から始まります
45
+ // プログラムは WinMain から始まります
4
46
 
5
47
  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
6
48
 
@@ -42,19 +84,179 @@
42
84
 
43
85
 
44
86
 
87
+ int playerX = 0; // キャラのX座標
88
+
89
+ int playerY = 300; // キャラのY座表
90
+
91
+ //double a[2][2];//移動制限のための配列の変数
92
+
93
+ int x = 0;
94
+
95
+ int y = 0;
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ //グラフィックハンドル格納用配列
104
+
105
+ int gh[12];
106
+
107
+ LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
108
+
109
+ DrawGraph(playerX, playerY, gh[8], FALSE);// プレイヤーの画像を描画
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ while (ScreenFlip() == 0 && ProcessMessage() == 0&& gpUpdateKey() == 0) {
118
+
119
+
120
+
45
- int 加算=40;
121
+ int 加算=40;
46
-
122
+
47
- int a ;
123
+ int b = 40;
124
+
125
+
126
+
127
+
128
+
48
-
129
+ // カーソルキーの右が押されている
130
+
131
+ if (Key[KEY_INPUT_RIGHT] == 1) {
132
+
133
+
134
+
135
+
136
+
137
+
138
+
49
- for(int x=0;x<3;x++){
139
+ for (int x = 0; x < 3; x++) {
50
-
140
+
51
- a=a+加算;
141
+ playerX = playerX +加算;
142
+
52
-
143
+ if (playerX == x && playerY == y) {
144
+
145
+
146
+
53
-
147
+ // プレイヤーのX座標を加算//左だけplayerX2とするとfor文ではないので、一回しか起きない、playerXだとplayerX = playerX + 加算より、加算されたあとのplayerXが再び右辺のplayerXに入り加算されるを繰り返すため∞に右に行けるのだ
148
+
54
-
149
+ // 画面に出力
150
+
151
+ ScreenFlip();
152
+
153
+ // 画面をクリア
154
+
155
+ ClearDrawScreen();
156
+
157
+ // プレイヤーの画像を描画
158
+
159
+
160
+
161
+ DrawGraph(playerX, playerY, gh[2], true);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。
162
+
55
- }
163
+ }
56
-
164
+
57
- }
165
+ }
166
+
167
+
168
+
169
+ }
170
+
171
+
172
+
173
+ else { while (DrawGraph(playerX, playerY, gh[8], true)); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
174
+
175
+
176
+
177
+ if (Key[KEY_INPUT_UP] == 1) {
178
+
179
+ playerY = playerY - b; // プレイヤーのY座標を加算
180
+
181
+
182
+
183
+ // 画面に出力
184
+
185
+ ScreenFlip();
186
+
187
+ // 画面をクリア
188
+
189
+ ClearDrawScreen();
190
+
191
+ // プレイヤーの画像を描画
192
+
193
+ DrawGraph(playerX, playerY, gh[5], true);
194
+
195
+ }
196
+
197
+
198
+
199
+
200
+
201
+ if (Key[KEY_INPUT_LEFT] == 1){
202
+
203
+ playerX = playerX - 加算; // プレイヤーのX座標を加算
204
+
205
+
206
+
207
+
208
+
209
+ // 画面をクリア
210
+
211
+ ClearDrawScreen();
212
+
213
+ // プレイヤーの画像を描画
214
+
215
+ DrawGraph(playerX, playerY, gh[1], true);
216
+
217
+
218
+
219
+ }
220
+
221
+
222
+
223
+
224
+
225
+ if (Key[KEY_INPUT_DOWN] == 1) {
226
+
227
+ playerY = playerY + b; // プレイヤーのY座標を加算
228
+
229
+
230
+
231
+ // 画面に出力
232
+
233
+ ScreenFlip();
234
+
235
+ // 画面をクリア
236
+
237
+ ClearDrawScreen();
238
+
239
+ // プレイヤーの画像を描画
240
+
241
+ DrawGraph(playerX, playerY, gh[11], true);
242
+
243
+ }
244
+
245
+
246
+
247
+ }
248
+
249
+
250
+
251
+ DxLib_End(); // DXライブラリ使用の終了処理
252
+
253
+
254
+
255
+ return 0; // ソフトの終了
256
+
257
+
258
+
259
+ }
58
260
 
59
261
  ```
60
262
 
@@ -69,3 +271,11 @@
69
271
  どうもfor文のxを使い加算する回数を2回で、かつ、[0]〜[2]のx座標内の範囲に出来ないため困っています。
70
272
 
71
273
  どうか教えてください。
274
+
275
+
276
+
277
+ 編集
278
+
279
+ もしかしたらint 加算=40;なしに3*3のマスのプロラグムが作れるかもしれません。
280
+
281
+ 要は画像の最初の位置は[1][1]なので、if (Key[KEY_INPUT_RIGHT] == 1)より右のキーが押されたら[2][1]に進むように作りたいです。

1

編集

2019/08/09 21:51

投稿

carnage0216
carnage0216

スコア194

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