質問編集履歴

4

編集

2020/06/18 10:23

投稿

KZK13
KZK13

スコア43

test CHANGED
File without changes
test CHANGED
@@ -657,3 +657,7 @@
657
657
 
658
658
 
659
659
  ```
660
+
661
+
662
+
663
+ [epistemeさんのおかげで解決しました。こちらに正しいコードが載っています。](https://teratail.com/questions/270866)

3

編集

2020/06/18 10:23

投稿

KZK13
KZK13

スコア43

test CHANGED
File without changes
test CHANGED
@@ -265,3 +265,395 @@
265
265
  コード
266
266
 
267
267
  ```
268
+
269
+
270
+
271
+ 解決のための参考になると思いこちらの[サイト](https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=past&no=1467)から
272
+
273
+ ```
274
+
275
+ include "DxLib.h"
276
+
277
+ #include <string.h>
278
+
279
+
280
+
281
+ int InputHandle ; // 入力ハンドル
282
+
283
+
284
+
285
+ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
286
+
287
+ LPSTR lpCmdLine, int nCmdShow )
288
+
289
+ {
290
+
291
+
292
+
293
+ // ウィンドウモードで起動
294
+
295
+ ChangeWindowMode( TRUE );
296
+
297
+
298
+
299
+ // DXライブラリ初期化
300
+
301
+ if( DxLib_Init() == -1 )
302
+
303
+ {
304
+
305
+ return -1 ;
306
+
307
+ }
308
+
309
+
310
+
311
+ // 入力領域と文字出力領域との境界線を引く
312
+
313
+ DrawLine( 0 , 320 , 640 , 320 , GetColor( 255 , 255 , 255 ) ) ;
314
+
315
+
316
+
317
+
318
+
319
+ // 文字列入力ハンドルを作成する
320
+
321
+ InputHandle = MakeKeyInput( 80 , FALSE , FALSE , FALSE ) ;
322
+
323
+
324
+
325
+ // 作成した入力ハンドルをアクティブにする
326
+
327
+ SetActiveKeyInput( InputHandle ) ;
328
+
329
+
330
+
331
+ SetKeyInputString( "ここに文章を入力してください" , InputHandle ) ;
332
+
333
+
334
+
335
+ // チャットループ
336
+
337
+ while( !ProcessMessage() )
338
+
339
+ {
340
+
341
+ // 文字列の入力が終っている場合
342
+
343
+ if( CheckKeyInput( InputHandle ) == 1 )
344
+
345
+ {
346
+
347
+ char Message[ 81 ] ;
348
+
349
+
350
+
351
+ // 入力された文字列を取得する
352
+
353
+ GetKeyInputString( Message , InputHandle ) ;
354
+
355
+
356
+
357
+ // 文字列表示域を黒で塗りつぶす
358
+
359
+ DrawBox( 0 , 0 , 640 , 320 , 0 , TRUE ) ;
360
+
361
+
362
+
363
+ // 入力した文字を描写する
364
+
365
+ DrawString( 0 , 0 , Message , GetColor( 255 , 255 , 255 ) ) ;
366
+
367
+
368
+
369
+ // 再度インプットハンドルをアクティブにする
370
+
371
+ SetActiveKeyInput( InputHandle ) ;
372
+
373
+
374
+
375
+ // 入力文字列を初期化する
376
+
377
+ SetKeyInputString( "" , InputHandle ) ;
378
+
379
+
380
+
381
+ }
382
+
383
+
384
+
385
+ // 画面に入力中の文字列を描画する
386
+
387
+ DrawBox( 0 , 320 + 2 , 640 , 480 , 0 , TRUE ) ;
388
+
389
+ DrawKeyInputString( 0 , 320 + 2 , InputHandle ) ;
390
+
391
+ DrawKeyInputModeString( 640 , 480 ) ;
392
+
393
+ }
394
+
395
+
396
+
397
+ // 時間待ち
398
+
399
+ WaitTimer( 3000 ) ;
400
+
401
+
402
+
403
+ DxLib_End() ; // DXライブラリ使用の終了処理
404
+
405
+
406
+
407
+ return 0 ; // ソフトの終了
408
+
409
+ }
410
+
411
+ コード
412
+
413
+ ```
414
+
415
+ を参考にしました。ループが終わった際に再び文字入力を行うことでループから出ない?ようにしていると読み取れたのですが、while( !ProcessMessage() )はエラーが起きたらループから抜けるという部分で合っていますか?
416
+
417
+
418
+
419
+ 過程段階ではありますが、以下のようにサイトを参考にして修正しました。
420
+
421
+ ```
422
+
423
+ #include "DxLib.h"
424
+
425
+ #include "string.h" //strcmp、strncmp関数を使うために必要
426
+
427
+
428
+
429
+ int konnnitiwasound = 0;
430
+
431
+ int situreisimasitasound = 0;
432
+
433
+
434
+
435
+ int Key[256]; // キーが押されているフレーム数を格納する
436
+
437
+
438
+
439
+ // キーの入力状態を更新する
440
+
441
+ int gpUpdateKey() {
442
+
443
+ char tmpKey[256]; // 現在のキーの入力状態を格納する
444
+
445
+ GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
446
+
447
+ for (int i = 0; i < 256; i++) {
448
+
449
+ if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
450
+
451
+ Key[i]++; // 加算
452
+
453
+ }
454
+
455
+ else { // 押されていなければ
456
+
457
+ Key[i] = 0; // 0にする
458
+
459
+ }
460
+
461
+ }
462
+
463
+ return 0;
464
+
465
+ }
466
+
467
+
468
+
469
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
470
+
471
+ {
472
+
473
+
474
+
475
+ // 使用する文字コードを UTF-8 に設定
476
+
477
+ ///SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);
478
+
479
+ char String[256];
480
+
481
+ int InputHandle;
482
+
483
+
484
+
485
+ SetGraphMode(700, 780, 32); // ウィンドウの大きさを指定
486
+
487
+ ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用
488
+
489
+ if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理
490
+
491
+ SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定
492
+
493
+ SetFontSize(64); //サイズを64に変更
494
+
495
+
496
+
497
+ // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
498
+
499
+ InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE);
500
+
501
+
502
+
503
+ // 作成したキー入力ハンドルをアクティブにする
504
+
505
+ SetActiveKeyInput(InputHandle);
506
+
507
+
508
+
509
+
510
+
511
+ // キー入力終了待ちループ
512
+
513
+ // (ProcessMessageをループごとに行う)
514
+
515
+ while (!ProcessMessage())
516
+
517
+ {
518
+
519
+ // 入力が終了している場合は終了
520
+
521
+ if (CheckKeyInput(InputHandle) != 0) {
522
+
523
+ // 入力された文字列を取得する
524
+
525
+ GetKeyInputString(String, InputHandle);
526
+
527
+
528
+
529
+
530
+
531
+ // 入力した文字を描写する
532
+
533
+ DrawString(0, 0,String, GetColor(255, 255, 255));
534
+
535
+
536
+
537
+ // 再度インプットハンドルをアクティブにする
538
+
539
+ SetActiveKeyInput(InputHandle);
540
+
541
+
542
+
543
+ }
544
+
545
+
546
+
547
+ // 画面の初期化
548
+
549
+ ClearDrawScreen();
550
+
551
+
552
+
553
+ // 入力モードを描画
554
+
555
+ DrawKeyInputModeString(640, 480);
556
+
557
+
558
+
559
+ // 入力途中の文字列を描画
560
+
561
+ DrawKeyInputString(0, 0, InputHandle);
562
+
563
+
564
+
565
+ // 裏画面の内容を表画面に反映させる
566
+
567
+ ScreenFlip();
568
+
569
+ }
570
+
571
+
572
+
573
+ // 入力された文字列を取得
574
+
575
+ GetKeyInputString(String, InputHandle);
576
+
577
+
578
+
579
+ // 用済みのインプットハンドルを削除する
580
+
581
+ DeleteKeyInput(InputHandle);
582
+
583
+
584
+
585
+ // 画面の初期化
586
+
587
+ ClearDrawScreen();
588
+
589
+
590
+
591
+ // 入力された文字列を画面に表示する
592
+
593
+ ///DrawString(0, 0, "あなたが入力した文字列は", GetColor(255, 255, 255));
594
+
595
+ DrawString(0, 0, String, GetColor(255, 255, 255));
596
+
597
+
598
+
599
+ //StringはUFT-8方式で作られたので、UFT-8方式で処理されて正常に表示される
600
+
601
+ DrawString(0, 0, String, GetColor(255, 255, 255));
602
+
603
+ //比較文字列同士の文字コードが異なるのでTRUEが帰ることはない
604
+
605
+ if (strcmp(String, "hello") == 0)
606
+
607
+ {
608
+
609
+ //そもそもここは通れない。
610
+
611
+ //"あいうえおおおおおおおおアインシュタイン!"はShift-JISなので、UFT-8方式で処理しようとしてもうまく行かない
612
+
613
+ DrawString(100, 500, "hello! my friend!!", GetColor(200, 200, 255));
614
+
615
+ konnnitiwasound = LoadSoundMem("line-girl1-konnichiha1.mp3");
616
+
617
+ PlaySoundMem(konnnitiwasound, DX_PLAYTYPE_BACK);
618
+
619
+ }
620
+
621
+ else {
622
+
623
+ situreisimasitasound = LoadSoundMem("line-girl1-moushiwakegozamasen1.mp3");
624
+
625
+ PlaySoundMem(situreisimasitasound, DX_PLAYTYPE_BACK);
626
+
627
+ }
628
+
629
+
630
+
631
+
632
+
633
+ // 裏画面の内容を表画面に反映させる
634
+
635
+ ScreenFlip();
636
+
637
+
638
+
639
+ // キー入力待ち
640
+
641
+ WaitKey();
642
+
643
+
644
+
645
+ // DXライブラリの使用終了
646
+
647
+ DxLib_End();
648
+
649
+
650
+
651
+ // 終了
652
+
653
+ //return 0;
654
+
655
+ }
656
+
657
+
658
+
659
+ ```

2

偏執

2020/06/17 02:43

投稿

KZK13
KZK13

スコア43

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  環境はWindows10、DXライブラリ、VS2019です。
4
4
 
5
- **キー入力を行ってもウィンドウが閉じることなく、続けて文字を入力できるようにしたい。**
5
+ **キー入力を行ってもウィンドウが閉じることなく、前回入力した文字がリセットされ、新しく文字を入力できるようにしたい。**
6
6
 
7
7
 
8
8
 

1

修正

2020/06/16 15:27

投稿

KZK13
KZK13

スコア43

test CHANGED
File without changes
test CHANGED
@@ -62,6 +62,38 @@
62
62
 
63
63
 
64
64
 
65
+ int Key[256]; // キーが押されているフレーム数を格納する
66
+
67
+
68
+
69
+ // キーの入力状態を更新する
70
+
71
+ int gpUpdateKey() {
72
+
73
+ char tmpKey[256]; // 現在のキーの入力状態を格納する
74
+
75
+ GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
76
+
77
+ for (int i = 0; i < 256; i++) {
78
+
79
+ if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
80
+
81
+ Key[i]++; // 加算
82
+
83
+ }
84
+
85
+ else { // 押されていなければ
86
+
87
+ Key[i] = 0; // 0にする
88
+
89
+ }
90
+
91
+ }
92
+
93
+ return 0;
94
+
95
+ }
96
+
65
97
 
66
98
 
67
99
  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
@@ -116,7 +148,7 @@
116
148
 
117
149
  // 入力が終了している場合は終了
118
150
 
119
- if (CheckKeyInput(InputHandle) == 0) break;
151
+ if (CheckKeyInput(InputHandle) != 0) break;
120
152
 
121
153
 
122
154
 
@@ -184,7 +216,7 @@
184
216
 
185
217
  //そもそもここは通れない。
186
218
 
187
- //Shift-JISなので、UFT-8方式で処理しようとしてもうまく行かない
219
+ //"あいうえおおおおおおおおアインシュタイン!"はShift-JISなので、UFT-8方式で処理しようとしてもうまく行かない
188
220
 
189
221
  DrawString(100, 500, "hello! my friend!!", GetColor(200, 200, 255));
190
222