合計 昨日 今日

シューティングゲームの作り方改

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 17:12
No: 1
(OFFLINE)

 シューティングゲームの作り方改

くばられたものなので、むだなところもあります
main cpp
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "main.h"
#include "player.h"
#include "./tama.h"
 
void Init(void);
void Uninit(void);
void Update(void);
void Draw(void);
void DispFPS(void);
 
#define DEBUG
int g_nCountFPS;                // FPSカウンタ
 
void main(void)
{
    // FPS計測するための変数
    DWORD dwExecLastTime;
    DWORD dwFPSLastTime;
    DWORD dwCurrentTime;
    int nCountFrame;
 
    // FPS計測の為の初期設定
    // 分解能を設定(何もしないとタイマの精度が悪くなるので設定)
    timeBeginPeriod(1);
 
    dwExecLastTime =
        dwFPSLastTime = timeGetTime();
    dwCurrentTime =
        nCountFrame = 0;
 
    Init();
 
    //printf("aaaaaaaaaaa");
    //getchar();
    //clrscr();
 
    do
    {
        dwCurrentTime = timeGetTime();
        if ((dwCurrentTime - dwFPSLastTime) >= 500) // 0.5秒ごとに実行(毎回実行するとチカチカするので)
        {
            g_nCountFPS = nCountFrame * 1000 / (dwCurrentTime - dwFPSLastTime);
            dwFPSLastTime = dwCurrentTime;
            nCountFrame = 0;
        }
 
        if ((dwCurrentTime - dwExecLastTime) >= (1000 / 60))// FPSを60にするために設定
        {
            dwExecLastTime = dwCurrentTime;
 
            Update();
 
            Draw();
 
#ifdef DEBUG
            // FPS表示
            DispFPS();
#endif
 
            nCountFrame++;
        }
    } while (!inport(PK_ESC));
 
    //終了処理
    Uninit();
 
    // 分解能を戻す
    timeEndPeriod(1);
}
//=============================================================================
// 初期化処理
//=============================================================================
void Init(void)
{
    // プレイヤーの初期化処理
    InitPlayer();
 
}
 
//=============================================================================
// 終了処理
//=============================================================================
void Uninit(void)
{
    // プレイヤーの終了処理
    UninitPlayer();
}
 
//=============================================================================
// 更新処理
//=============================================================================
void Update(void)
{
    // プレイヤーの更新処理
    UpdatePlayer();
 
    //弾
    tamaupdate();
}
 
//=============================================================================
// 描画処理
//=============================================================================
void Draw(void)
{
    // プレイヤーの描画処理
    DrawPlayer();
    //弾
    tamadrow();
}
 
#ifdef DEBUG
//=============================================================================
// FPS表示
//=============================================================================
void DispFPS(void)
{
    // 色設定
    textcolor(WHITE);
 
    gotoxy(1, 1);
    printf("FPS:%d", g_nCountFPS);
}
#endif


player.cpp
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//=============================================================================
//
// プレイヤー処理 [player.cpp]
//
//=============================================================================
#define CONIOEX
#include "conioex.h"
#include "main.h"
#include "player.h"
 
//*****************************************************************************
// マクロ定義
//*****************************************************************************
#define VALUE_MOVE_X            (0.75f)     // 地上での移動量X方向
#define VALUE_MOVE_X_AIR        (0.30f)     // 空中での移動量X方向
#define VALUE_RESIST_X          (0.50f)     // 地上での移動摩擦抵抗
#define LIMIT_LEFT              (2.0f)      // 移動範囲左端
#define LIMIT_RIGHT             (118.0f)        // 移動範囲右端
#define LIMIT_DOWN              (24.0f)     // 移動範囲下端
#define LIMIT_APP               (1.0f)
 
// ここから追加 ジャンプ追加処理
#define VALUE_JUMP              (0.80f)     // ジャンプ量
 
// ジャンプ処理を追加後
#define VALUE_RESIST_X_AIR      (0.35f)     // 空中での移動摩擦抵抗
#define VALUE_GRAVITY           (0.06f)     // 重力量
 
//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
 
 
//*****************************************************************************
// グローバル変数
//*****************************************************************************
PLAYER g_player;            // プレイヤーワー
SHOT gtama;
//=============================================================================
// プレイヤーの初期化処理
//=============================================================================
void InitPlayer(void)
{
    // プレイヤーワークのクリア
    g_player.fPosX = 20.0f;
    g_player.fPosY = 24.0f;
    g_player.fPosXOld = 20.0f;
    g_player.fPosYOld = 24.0f;
    g_player.fMoveX = 0.0f;
    g_player.fMoveY = 0.0f;
 
    gtama.fPosX = 20.0f;
    gtama.fPosY = 23.0f;
 
    // ジャンプ追加処理
    g_player.bJump = false;
    g_player.bMove = false;
}
 
//=============================================================================
// プレイヤーの終了処理
//=============================================================================
void UninitPlayer(void)
{
}
 
//=============================================================================
// プレイヤーの更新処理
//=============================================================================
void UpdatePlayer(void)
{
    // 前回の位置を保存
    g_player.fPosXOld = g_player.fPosX;
    g_player.fPosYOld = g_player.fPosY;
 
    if (inport(PK_A))
    {// 左移動
 
        // ジャンプ追加処理
        if (g_player.bJump)
        {
            g_player.fMoveX -= VALUE_MOVE_X_AIR;
        }
        else
        {
            g_player.fMoveX -= VALUE_MOVE_X;
        }
        g_player.bMove = true;
    }
 
    if (inport(PK_D))
    {// 右移動
 
        // ジャンプ追加処理
        if (g_player.bJump)
        {
            // 左移動追加後に考えさせる
            g_player.fMoveX += VALUE_MOVE_X_AIR;
        }
        else
        {
            g_player.fMoveX += VALUE_MOVE_X;
        }
        g_player.bMove = true;
 
    }
 
    if (inport(PK_P))
    {
        g_player.fMoveY = -VALUE_JUMP;
        g_player.fMoveY = -VALUE_JUMP;
        g_player.bJump = true;
    }
 
 
    // ジャンプ追加処理
    if (inport(PK_SP))
    {// ジャンプ
        if (!g_player.bJump)
        {
            g_player.fMoveY = -VALUE_JUMP;
            g_player.bJump = true;
        }
    }
 
    // ジャンプ追加処理
    if (g_player.bJump)
    {// ジャンプ中
        g_player.bMove = true;
 
        //ジャンプ処理を入れてから説明
        g_player.fMoveX += (0.0f - g_player.fMoveX) * VALUE_RESIST_X_AIR;       // 抵抗を加える
    }
    else
    {
        g_player.fMoveX += (0.0f - g_player.fMoveX) * VALUE_RESIST_X;           // 抵抗を加える
    }
 
    // 位置更新
    g_player.fPosX += g_player.fMoveX;
    if (g_player.fPosX < LIMIT_LEFT)
    {
        g_player.fPosX = LIMIT_LEFT;
    }
    if (g_player.fPosX > LIMIT_RIGHT)
    {
        g_player.fPosX = LIMIT_RIGHT;
    }
 
    // ジャンプ追加処理
 
    // ジャンプ処理を追加してから
    g_player.fMoveY += VALUE_GRAVITY;           // 重力を加える
 
    // 先にこちらの処理を入れる
    g_player.fPosY += g_player.fMoveY;
 
    // グラビティの処理後
    if (g_player.fPosY > LIMIT_DOWN)
    {// 地面にめり込んだ場合
        g_player.fPosY = LIMIT_DOWN;
        g_player.fMoveY = 0.0f;
        g_player.bJump = false;
    }
}
 
//=============================================================================
// プレイヤーの描画処理
//=============================================================================
void DrawPlayer(void)
{
    // 色設定
    //textcolor(RED);
 
    if (g_player.bMove)
    {// 移動した場合
     // 前回の位置でのプレイヤーを消去
        gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld - 1.0f));
        printf(" ");
 
        g_player.bMove = false;
    }
 
    // 現在の位置にプレイヤーを表示
    gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY));
    printf("■");
    gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY - 1.0f));
    printf("●");
 
    //足場で
 
    for (int i = 1; i < 118; i++)
    {
        textcolor(RED);
        gotoxy(i, 25);
        printf("-");
    }
}



tama.cpp
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "tama.h"
#include "player.h"
#define CONIOEX
#include "./conioex.h"
 
//static bool tama_flg = false;
int intime, stoptime, outtime, shottime;
bool sflag;
int scount;
 
void tamaupdate(void)
{
    gtama.fPosX = g_player.fPosX;
    gtama.time += 1;
 
    if (inport(PK_W))
    {
        if (gtama.flg == 0)
        {
            if (gtama.time < 60)
            {
                gtama.flg = 1;
                g_player.fPosX = gtama.fPosX;
                g_player.fPosY = gtama.fPosY;
            }
        }
    }
 
    if (gtama.flg == 1)
    {
        gotoxy(gtama.fPosX, gtama.fPosY - 1);
        printf("|");
        gtama.flg = 0;
    }
}
 
 
void tamadrow(void)
{
}


player.h
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//=============================================================================
//
// プレイヤー処理 [player.h]
//
//=============================================================================
 
#ifndef _PLAYER_H_  // 2重インクルード防止のマクロ定義
#define _PLAYER_H_
 
//*************************************
// プレイヤー構造体
//*************************************
typedef struct
{
    double fPosX;       // 現在の位置X
    double fPosY;       // 現在の位置Y
    double fPosXOld;        // 前回の位置X
    double fPosYOld;        // 前回の位置Y
    double fMoveX;      // 移動量X方向
    double fMoveY;      // 移動量Y方向
    bool bMove;         // 移動したかどうか(描画更新用)
    bool bJump;         // ジャンプしたかどうか(描画更新用)
} PLAYER;
 
 
typedef struct {
    double fPosX; //現在位置の座標(X座標)
    double fPosY;//現在位置の座標(Y座標)
    double tax;//ターゲットまでの距離
    double spd;//スピード
    int pattern;
    bool flg;
    int time=60;
}SHOT;
 
 
 
/*struct target_Val {
    bool flg; //フラグ
    double fPosX, fPosY;          //ポジション
 
}; struct target_Val ene;*/
 
 
//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
void InitPlayer(void);
void UninitPlayer(void);
void UpdatePlayer(void);
void DrawPlayer(void);
 
//*****************************************************************************
// グローバル変数
//*****************************************************************************
extern PLAYER g_player;         // プレイヤーワー
extern SHOT gtama;
 
#endif


tama.h
コード[C++]: 全て選択
1
2
3
4
5
#pragma once
void tamaupdate(void);
void tamadrow(void);
 
#define ENEMY_SNUM_50


配布コード
conioex.h
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
 */
#ifndef __CONIOEX_H
#define __CONIOEX_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <digitalv.h>
#pragma comment(lib, "winmm.lib")
 
#ifdef CONIOEX
#define CONIOEX_INST extern
#else /* !CONIOEX */
#define CONIOEX_INST
#endif /* CONIOEX */
 
#ifdef __BORLANDC__
#define NOCURSOR        _NOCURSOR
#define SOLIDCURSOR     _SOLIDCURSOR
#define NORMALCURSOR    _NORMALCURSOR
__inline void setcursortype(int cur_t) {_setcursortype(cur_t);}
__inline int _kbhit(void) {return kbhit();}
#else /* !__BORLANDC__ */
 
#pragma warning(disable:4996)
 
#define NOCURSOR        0
#define SOLIDCURSOR     1
#define NORMALCURSOR    2
 
#define _NOCURSOR       NOCURSOR
#define _SOLIDCURSOR    SOLIDCURSOR
#define _NORMALCURSOR   NORMALCURSOR
 
#ifndef __COLORS
#define __COLORS
enum COLORS {
    BLACK,          /* 黒      */
    BLUE,           /* 濃い青    */
    GREEN,          /* 緑      */
    CYAN,           /* 青緑       */
    RED,            /* 濃い赤    */
    MAGENTA,        /* 紫      */
    BROWN,          /* 濃い黄    */
    LIGHTGRAY,      /* 25%灰色    */
    DARKGRAY,       /* 50%灰色    */
    LIGHTBLUE,      /* 青      */
    LIGHTGREEN,     /* 明るい緑 */
    LIGHTCYAN,      /* 水色       */
    LIGHTRED,       /* 赤      */
    LIGHTMAGENTA,   /* ピンク    */
    YELLOW,         /* 黄      */
    WHITE           /* 白      */
};
#endif /* _COLORS */
 
CONIOEX_INST WORD   __conioex_h_wAttribute      /* 境界色 */
#ifndef CONIOEX
= LIGHTGRAY
#endif /* CONIOEX */
;
 
 
 
/**
 * @brief   水平方向のカーソル位置を取得
 *
 * @return  現在のカーソル位置のX座標(1~)
 */
int wherex(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.X - csbi.srWindow.Left + 1;
}
#endif /* CONIOEX */
 
/**
 * @brief   垂直方向のカーソル位置を取得
 *
 * @return  現在のカーソル位置のY座標(1~)
 */
int wherey(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.Y - csbi.srWindow.Top + 1;
}
#endif /* CONIOEX */
 
/**
 * @brief   カーソル位置の移動
 *
 * @param   x [入力] X座標(1~)
 * @param   y [入力] Y座標(1~)
 */
void gotoxy(int x, int y)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    COORD c;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    c.X = x - 1;
    c.Y = y - 1;
    if (GetConsoleScreenBufferInfo(h, &csbi))
        c.Y += csbi.srWindow.Top;
    SetConsoleCursorPosition(h, c);
}
#endif /* CONIOEX */
 
/**
 * @brief   行末まで消去
 */
void clreol(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    COORD   c;
    HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        DWORD num;
 
        c = csbi.dwCursorPosition;
        FillConsoleOutputAttribute(h, csbi.wAttributes,
            csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
        FillConsoleOutputCharacter(h, ' ',
            csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   画面消去
 */
void clrscr(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD num;
    COORD c = {0, 0};
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        __conioex_h_wAttribute = csbi.wAttributes;
        FillConsoleOutputAttribute(h, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), csbi.dwSize.X * csbi.dwSize.Y, c, &num);
        gotoxy(csbi.srWindow.Left + 1, csbi.srWindow.Top + 1);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   文字色高輝度化
 */
void highvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, csbi.wAttributes | FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */
 
/**
 * @brief   文字色低輝度化
 */
void lowvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, csbi.wAttributes & ~FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */
 
/**
 * @brief   既定文字色設定
 */
void normvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), LIGHTGRAY);
}
#endif /* CONIOEX */
 
void textbackground(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x00f0) | ((newcolor & 0x07) << 4));
}
#endif /* CONIOEX */
 
void textcolor(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x0f) | (newcolor & 0x0f));
}
#endif /* CONIOEX */
 
void textattr(int newattr)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), newattr);
}
#endif /* CONIOEX */
 
void setcursortype(int cur_t)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_CURSOR_INFO cci;
    static  int nSize = -1;
 
    if (nSize < 0) {
        if (GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci))
            nSize = (int)cci.dwSize;
        else
            nSize = 25;
    }
    cci.dwSize      = (cur_t < NORMALCURSOR) ? 100 : nSize;
    cci.bVisible    = (cur_t != NOCURSOR);
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
#endif /* CONIOEX */
__inline void _setcursortype(int cur_t) {setcursortype(cur_t);}
 
/**
 * @brief   現在行に挿入
 */
void insline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        COORD   c;
        DWORD   len;
        DWORD   num;
        LPTSTR  psz;
        LPWORD  pw;
 
        c.X = csbi.srWindow.Left;
        len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
        psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
        pw = (LPWORD)_alloca(len * sizeof(WORD));
        for (c.Y = csbi.srWindow.Bottom; c.Y > csbi.dwCursorPosition.Y; c.Y--) {
            c.Y--;
            ReadConsoleOutputAttribute(h, pw, len, c, &num);
            ReadConsoleOutputCharacter(h, psz, len, c, &num);
            c.Y++;
            WriteConsoleOutputAttribute(h, pw, len, c, &num);
            WriteConsoleOutputCharacter(h, psz, len, c, &num);
        }
        FillConsoleOutputAttribute(h, csbi.wAttributes, len, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   現在行の削除
 */
void delline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        DWORD   num;
        COORD   c;
        DWORD   len;
        LPTSTR  psz;
        LPWORD  pw;
 
        c.X = csbi.srWindow.Left;
        len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
        psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
        pw = (LPWORD)_alloca(len * sizeof(WORD));
        for (c.Y = csbi.dwCursorPosition.Y; c.Y < csbi.srWindow.Bottom; c.Y++) {
            c.Y++;
            ReadConsoleOutputAttribute(h, pw, len, c, &num);
            ReadConsoleOutputCharacter(h, psz, len, c, &num);
            c.Y--;
            WriteConsoleOutputAttribute(h, pw, len, c, &num);
            WriteConsoleOutputCharacter(h, psz, len, c, &num);
        }
        FillConsoleOutputAttribute(h, __conioex_h_wAttribute, len, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
    }
}
#endif /* CONIOEX */
 
#endif /* __BORLANDC__ */
 
__inline void setcaption(char *title) {SetConsoleTitleA(title);}
__inline int getcaption(char *title, int len) {return GetConsoleTitleA(title, len);}
__inline void msleep(unsigned long msecs) {Sleep(msecs);}
 
#define PK_ENTER                VK_RETURN
#define PK_ESC                  VK_ESCAPE
#define PK_F1                   VK_F1
#define PK_F2                   VK_F2
#define PK_F3                   VK_F3
#define PK_F4                   VK_F4
#define PK_F5                   VK_F5
#define PK_F6                   VK_F6
#define PK_F7                   VK_F7
#define PK_F8                   VK_F8
#define PK_F9                   VK_F9
#define PK_F10                  VK_F10
#define PK_F11                  VK_F11
#define PK_F12                  VK_F12
#define PK_SP                   VK_SPACE
#define PK_UP                   VK_UP
#define PK_DOWN                 VK_DOWN
#define PK_RIGHT                VK_RIGHT
#define PK_LEFT                 VK_LEFT
#define PK_SHIFT                VK_SHIFT
#define PK_CTRL                 VK_CONTROL
#define PK_ALT                  VK_MENU
#define PK_BS                   VK_BACK
#define PK_PAUSE                VK_PAUSE
#define PK_INS                  VK_INSERT
#define PK_DEL                  VK_DELETE
#define PK_TAB                  VK_TAB
#define PK_NFER                 VK_KANA     /* [無変換]  */
#define PK_XFER                 VK_CONVERT  /* [変換] */
#define PK_0                    0x30
#define PK_1                    0x31
#define PK_2                    0x32
#define PK_3                    0x33
#define PK_4                    0x34
#define PK_5                    0x35
#define PK_6                    0x36
#define PK_7                    0x37
#define PK_8                    0x38
#define PK_9                    0x39
#define PK_NUMPAD0              VK_NUMPAD0  /* テンキーの[0]   */
#define PK_NUMPAD1              VK_NUMPAD1  /* テンキーの[1]   */
#define PK_NUMPAD2              VK_NUMPAD2  /* テンキーの[2]   */
#define PK_NUMPAD3              VK_NUMPAD3  /* テンキーの[3]   */
#define PK_NUMPAD4              VK_NUMPAD4  /* テンキーの[4]   */
#define PK_NUMPAD5              VK_NUMPAD5  /* テンキーの[5]   */
#define PK_NUMPAD6              VK_NUMPAD6  /* テンキーの[6]   */
#define PK_NUMPAD7              VK_NUMPAD7  /* テンキーの[7]   */
#define PK_NUMPAD8              VK_NUMPAD8  /* テンキーの[8]   */
#define PK_NUMPAD9              VK_NUMPAD9  /* テンキーの[9]   */
#define PK_A                    0x41
#define PK_B                    0x42
#define PK_C                    0x43
#define PK_D                    0x44
#define PK_E                    0x45
#define PK_F                    0x46
#define PK_G                    0x47
#define PK_H                    0x48
#define PK_I                    0x49
#define PK_J                    0x4A
#define PK_K                    0x4B
#define PK_L                    0x4C
#define PK_M                    0x4D
#define PK_N                    0x4E
#define PK_O                    0x4F
#define PK_P                    0x50
#define PK_Q                    0x51
#define PK_R                    0x52
#define PK_S                    0x53
#define PK_T                    0x54
#define PK_U                    0x55
#define PK_V                    0x56
#define PK_W                    0x57
#define PK_X                    0x58
#define PK_Y                    0x59
#define PK_Z                    0x5A
 
#define PK_LT                   0x0BC       /* [,]  */
#define PK_GT                   0x0BE       /* [.]  */
#define PK_SLUSH                0x0BF       /* [?]  */
#define PK_DOT                  VK_DECIMAL  /* テンキーの[.]   */
#define PK_DIV                  VK_DIVIDE   /* テンキーの[/]   */
#define PK_BSLUSH               0x0E2       /* [_]  */
 
#define PK_SEMICOLON            0x0BB       /* [;]  */
#define PK_ADD                  VK_ADD      /* テンキーの[+]   */
#define PK_COLON                0x0BA       /* [:]  */
#define PK_MUL                  VK_MULTIPLY /* テンキーの[*]   */
#define PK_RBRACE               0x0DD       /* []]  */
 
#define PK_ATMARK               0x0C0       /* [@]  */
#define PK_LBRACE               0x0DB       /* [[]  */
 
#define PK_MINUS                0x0BD       /* [-]  */
#define PK_SUB                  VK_SUBTRACT /* テンキーの[-]   */
#define PK_XOR                  0x0DE       /* [^]  */
#define PK_YEN                  0x0DC       /* [\]  */
 
#define PK_KANJI                0x0F3       /* [半角/全角]  */
#define PK_CAPS                 0x0F0       /* [英数][ひらがな]   */
 
#define PM_LEFT                 VK_LBUTTON
#define PM_MID                  VK_MBUTTON
#define PM_RIGHT                VK_RBUTTON
#define PM_CURX                 0x0101
#define PM_CURY                 0x0102
 
#define PJ1_XPOS                0x0200
#define PJ1_YPOS                0x0201
#define PJ1_ZPOS                0x0202
#define PJ1_BTNS                0x0203
#define PJ2_XPOS                0x0210
#define PJ2_YPOS                0x0211
#define PJ2_ZPOS                0x0212
#define PJ2_BTNS                0x0213
#define PJ3_XPOS                0x0220
#define PJ3_YPOS                0x0221
#define PJ3_ZPOS                0x0222
#define PJ3_BTNS                0x0223
#define PJ4_XPOS                0x0230
#define PJ4_YPOS                0x0231
#define PJ4_ZPOS                0x0232
#define PJ4_BTNS                0x0233
#define PJ_XPOS                 PJ1_XPOS
#define PJ_YPOS                 PJ1_YPOS
#define PJ_ZPOS                 PJ1_ZPOS
#define PJ_BTNS                 PJ1_BTNS
 
CONIOEX_INST DWORD  __conioex_h_dwKeyMap[8]
#ifndef CONIOEX
= {0, 0, 0, 0, 0, 0, 0, 0}
#endif /* CONIOEX */
;
CONIOEX_INST COORD  __conioex_h_crdMouse
#ifndef CONIOEX
= {0, 0}
#endif /* CONIOEX */
;
 
/**
 * @brief   キー情報リセット
 *
 * @return  なし
 */
void reinport(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    int i;
    for(i = 0; i < 8; i++)
    {
        __conioex_h_dwKeyMap[i] = 0;
    }
}
#endif /* CONIOEX */
 
 
/**
 * @brief   各種リアルタイム入力
 *
 * @param   port [入力] ポート番号(P*_*)
 * @return  入力値
 */
int inport(int port)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    DWORD   dwEvent;
    HANDLE  h;
 
    /* ゲームパッド入力 */
    if ((port & 0xfe00) == 0x0200) {
        int     id = (port & 0x01f0) >> 4;
        int     func = port & 0x0f;
        JOYINFO ji;
 
        switch (func) {
        case 0: case 1: case 2: case 3:
            if (joyGetPos(id, &ji) != JOYERR_NOERROR)
                return -1;
            switch (func) {
            case 0:
                return ji.wXpos;
            case 1:
                return ji.wYpos;
            case 2:
                return ji.wZpos;
            case 3:
                return ji.wButtons;
            }
            break;
        default:
            break;
        }
        return 0;
    }
    // キー/マウス イベント チェック
    dwEvent = 0;
    h = GetStdHandle(STD_INPUT_HANDLE);
    if (GetNumberOfConsoleInputEvents(h, &dwEvent) && dwEvent) {
        DWORD           dwRead = 0;
        PINPUT_RECORD   pInpRec = (PINPUT_RECORD)_alloca(dwEvent * sizeof(INPUT_RECORD));
 
        if (ReadConsoleInput(h, pInpRec, dwEvent, &dwRead) && dwRead) {
            PINPUT_RECORD   pir = pInpRec;
            DWORD           dw;
            for (dw = 0; dw < dwRead; dw++, pir++) {
                switch (pir->EventType) {
                case KEY_EVENT: {
                    KEY_EVENT_RECORD*   pker = &pir->Event.KeyEvent;
                    if (pker->wVirtualKeyCode > 0x0FF)
                        break;
                    if (pker->bKeyDown)
                        __conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] |= (0x01 << (pker->wVirtualKeyCode & 31));
                    else
                        __conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] &= ~(0x01 << (pker->wVirtualKeyCode & 31));
                    if (pker->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
                        __conioex_h_dwKeyMap[VK_MENU >> 5] |= (0x01 << (VK_MENU & 31));
                    else
                        __conioex_h_dwKeyMap[VK_MENU >> 5] &= ~(0x01 << (VK_MENU & 31));
                    if (pker->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
                        __conioex_h_dwKeyMap[VK_CONTROL >> 5] |= (0x01 << (VK_CONTROL & 31));
                    else
                        __conioex_h_dwKeyMap[VK_CONTROL >> 5] &= ~(0x01 << (VK_CONTROL & 31));
                    if (pker->dwControlKeyState & SHIFT_PRESSED)
                        __conioex_h_dwKeyMap[VK_SHIFT >> 5] |= (0x01 << (VK_SHIFT & 31));
                    else
                        __conioex_h_dwKeyMap[VK_SHIFT >> 5] &= ~(0x01 << (VK_SHIFT & 31));
                    break;
                }
                case MOUSE_EVENT: {
                    MOUSE_EVENT_RECORD  *pmer = &pir->Event.MouseEvent;
                    __conioex_h_crdMouse = pmer->dwMousePosition;
                    if (pmer->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_LBUTTON >> 5] |= (0x01 << (VK_LBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_LBUTTON >> 5] &= ~(0x01 << (VK_LBUTTON & 31));
                    if (pmer->dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_MBUTTON >> 5] |= (0x01 << (VK_MBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_MBUTTON >> 5] &= ~(0x01 << (VK_MBUTTON & 31));
                    if (pmer->dwButtonState & RIGHTMOST_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_RBUTTON >> 5] |= (0x01 << (VK_RBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_RBUTTON >> 5] &= ~(0x01 << (VK_RBUTTON & 31));
                    break;
                }
                default:
                    break;
                }
            }
        }
    }
 
    // マウス座標を返す
    switch (port) {
    case PM_CURX:
        return __conioex_h_crdMouse.X + 1;
    case PM_CURY:
        return __conioex_h_crdMouse.Y + 1;
    default:
        break;
    }
    // キー状態を返す
    return (__conioex_h_dwKeyMap[(port & 0x0FF) >> 5] & (0x01 << (port & 31))) != 0;
}
#endif /* CONIOEX */
 
typedef struct {
    int             nDevType;
    MCIDEVICEID     wDeviceID;
    char            szPath[MAX_PATH];
    int             nRepeat;
} __conioex_h_SoundInfo;
 
/**
 * @brief   サウンド ファイルを開く
 *
 * @param   path [入力] ファイル名
 * @retval  非0    サウンド ハンドル
 * @retval  0   エラー
 */
int opensound(char *path)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    const char  szMidiExt[] = ".mid|.midi|.rmi";
    const char  szWaveExt[] = ".wav|.wave";
    const char  szMP3Ext[] = ".mp3";
    char        szExt[_MAX_EXT];
    union {
        MCI_WAVE_OPEN_PARMSA    wop;
        MCI_OPEN_PARMSA         op;
    } m;
    DWORD       dwCmd;
    __conioex_h_SoundInfo   *psi;
 
    psi = (__conioex_h_SoundInfo *)malloc(sizeof(__conioex_h_SoundInfo));
    if (psi == NULL)
        return 0;
    ZeroMemory(psi, sizeof(*psi));
 
    ZeroMemory(&m, sizeof(m));
    _splitpath(path, NULL, NULL, NULL, szExt);
    strlwr(szExt);
    dwCmd = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT;
    if (strstr(szMidiExt, szExt)) {
        psi->nDevType = MCI_DEVTYPE_SEQUENCER;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
        m.op.lpstrElementName = psi->szPath;
        dwCmd |= MCI_OPEN_TYPE_ID;
    } else if (strstr(szWaveExt, szExt)) {
        psi->nDevType = MCI_DEVTYPE_WAVEFORM_AUDIO;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.wop.lpstrDeviceType  = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
        m.wop.lpstrElementName = psi->szPath;
        dwCmd |= MCI_OPEN_TYPE_ID;
//      m.wop.dwBufferSeconds  = 60;
//      dwCmd |= MCI_WAVE_OPEN_BUFFER;
    } else if (strstr(szMP3Ext, szExt)) {
        psi->nDevType = MCI_DEVTYPE_DIGITAL_VIDEO;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.op.lpstrDeviceType = "MPEGVideo";
        m.op.lpstrElementName = psi->szPath;
    } else {
        free(psi);
        return 0;
    }
    if (mciSendCommandA(0, MCI_OPEN, dwCmd, (DWORD)&m)) {
        free(psi);
        return 0;
    }
    psi->wDeviceID = m.op.wDeviceID;
    return (int)psi;
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド ファイルを閉じる
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void closesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (psi->wDeviceID) {
        mciSendCommand(psi->wDeviceID, MCI_CLOSE, 0, 0);
        psi->wDeviceID = 0;
    }
    free(psi);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンドを再生する
 *
 * @param   hsound [入力] サウンド ハンドル
 * @param   repeat [入力] ループ有無
 */
void playsound(int hsound, int repeat)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    DWORD                   dwCmd;
    MCI_PLAY_PARMS          mpp;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    psi->nRepeat = repeat;
    ZeroMemory(&mpp, sizeof(mpp));
    dwCmd = 0;
    if (repeat) {
        switch (psi->nDevType) {
        case MCI_DEVTYPE_DIGITAL_VIDEO:
            dwCmd |= (MCI_FROM | MCI_DGV_PLAY_REPEAT);
            mpp.dwFrom = 0;
            break;
        case MCI_DEVTYPE_SEQUENCER:
        case MCI_DEVTYPE_WAVEFORM_AUDIO:
            break;
        default:
            break;
        }
    }
    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
    mciSendCommand(psi->wDeviceID, MCI_PLAY, dwCmd, (DWORD)&mpp);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド再生を停止する
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void stopsound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    psi->nRepeat = 0;
    mciSendCommand(psi->wDeviceID, MCI_STOP, MCI_WAIT, 0);
    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド再生状態の取得
 *
 * @param   hsound [入力] サウンド ハンドル
 * @return  再生中ならば 0 以外を返す。
 */
int checksound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    MCI_STATUS_PARMS        msp;
 
    if (!hsound)
        return 0;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return 0;
    ZeroMemory(&msp, sizeof(msp));
    msp.dwItem = MCI_STATUS_MODE;
    if (mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp))
        return 0;
    return msp.dwReturn == MCI_MODE_PLAY;
}
#endif /* CONIOEX */
 
/**
 * @brief   ループ再生の強制更新
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void updatesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    MCI_STATUS_PARMS        msp;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID || !psi->nRepeat)
        return;
    switch (psi->nDevType) {
    case MCI_DEVTYPE_DIGITAL_VIDEO:
        break;
    case MCI_DEVTYPE_SEQUENCER:
    case MCI_DEVTYPE_WAVEFORM_AUDIO:
        ZeroMemory(&msp, sizeof(msp));
        msp.dwItem = MCI_STATUS_MODE;
        if (!mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp)) {
            if (msp.dwReturn != MCI_MODE_PLAY) {
                if (psi->nRepeat > 0) {
                    psi->nRepeat = -1;
                    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
                    mciSendCommand(psi->wDeviceID, MCI_PLAY, 0, 0);
                }
            } else
                psi->nRepeat = 1;
        }
        break;
    default:
        break;
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   再生音量を設定する
 *
 * @param   hsound [入力] サウンド ハンドル
 * @param   percent [入力] 音量 (0 ~ 100)
 */
void setvolume(int hsound, int percent)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    switch (psi->nDevType) {
    case MCI_DEVTYPE_DIGITAL_VIDEO: {
        MCI_DGV_SETAUDIO_PARMS  mdsp;
 
        ZeroMemory(&mdsp, sizeof(mdsp));
        mdsp.dwItem = MCI_DGV_SETAUDIO_VOLUME;
        mdsp.dwValue = percent * 10;
        mciSendCommand(psi->wDeviceID, MCI_SETAUDIO,
            MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mdsp);
        break;
    }
    case MCI_DEVTYPE_SEQUENCER: {
        DWORD dwVolume;
 
        dwVolume = 0x0ffff * percent / 100;
        midiOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
        break;
    }
    case MCI_DEVTYPE_WAVEFORM_AUDIO: {
        DWORD dwVolume;
 
        dwVolume = 0x0ffff * percent / 100;
        waveOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
        break;
    }
    default:
        break;
    }
}
#endif /* CONIOEX */
 
#ifdef __cplusplus
}
#endif
 
#endif /* __CONIOEX_H */

Name: よもやま
[URL]
かけだし(2,484 ポイント)
Date: 2018年2月04日(日) 17:33
No: 2
(OFFLINE)

 Re: シューティングゲームの作り方改

visual stuzio2015 弾の移動と表示の仕方
と関連している話題ですよね。
でしたら複数のトピックを乱立するのではなく
visual stuzio2015 弾の移動と表示の仕方
に記載してください。

Name: みけCAT
[URL]
伝説なるハッカー(693,644 ポイント)
Date: 2018年2月04日(日) 17:45
No: 3
(ONLINE)

 Re: シューティングゲームの作り方改

gtama.time < 60という条件が偽であるために、弾が出ないことが考えられます。
また、なぜかプレイヤーの座標に弾の座標を代入しているのも不自然ですね。

よもやま さんが書きました:visual stuzio2015 弾の移動と表示の仕方
と関連している話題ですよね。
でしたら複数のトピックを乱立するのではなく
visual stuzio2015 弾の移動と表示の仕方
に記載してください。

その通りです。
同じ問題に関する質問は、1個のトピックでお願いします。
解決した後はお礼も忘れずに。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 17:52
No: 4
(OFFLINE)

 Re: シューティングゲームの作り方改

返信ありがとうございますm(__)m
偽ということは
なにかつけたしたほうがいいということでしょうか?

プレイヤー座標に弾座標を入れているのは
プレイヤーと弾の位置を同じにするためです
そうしないとプレイヤーの上から弾がでないと思うので。

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 20:39
No: 5
(OFFLINE)

 Re: シューティングゲームの作り方改

コンソールにprintfで表示を行っているものかと思います。このコンソールへの表示の仕様がどういうものかわからないのですが、仮にFPS60毎に表示がクリアされるのだとすると、gtama.flagが1の時に一瞬だけ”|”が表示されて以降は表示されないと思います。

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 20:50
No: 6
(OFFLINE)

 Re: シューティングゲームの作り方改

返信ありがとうございます
printfでは弾を表示しております。

printfで偽になってしまっているのでしょうか?

無知で申し訳ないのですが
なぜそのようになっているのか教えていただけないでしょうか?
またなにが足りないのでしょうか?

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 20:58
No: 7
(OFFLINE)

 Re: シューティングゲームの作り方改

tama.cpp中をいじってみましたが玉すらでないです
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void tamaupdate(void)
{
    gtama.fPosX = g_player.fPosX;
    gtama.time ++;
 
    if (inport(PK_N)&& gtama.time < 60)
    {
        //  if(gtama.flg == 0)
            //{
                gtama.flg = 1;
                g_player.fPosX = gtama.fPosX;
                g_player.fPosY = gtama.fPosY;
        //  }
    }
 
    if (gtama.flg == 1)
    {
        gotoxy(gtama.fPosX, gtama.fPosY - 1);
        printf("|");
        gtama.time = 0;
    }
    if (gtama.fPosY < 1)
    {
        gtama.flg = 0;
    }
}

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 21:45
No: 8
(OFFLINE)

 Re: シューティングゲームの作り方改

弾が表示されないのは下記の部分が間違っているためです。弾にプレイヤーの位置を教えないと正しい位置に表示されないです。
コード[C++]: 全て選択
1
2
3
4
5
g_player.fPosX = gtama.fPosX;
g_player.fPosY = gtama.fPosY;

gtama.fPosX = g_player.fPosX;
gtama.fPosY = g_player.fPosY;

gtamaはグローバル変数で1個だけ定義されているのですが、画面上に同時に表示される弾は1個だけという事であっていますでしょうか?ただ、gtama.timeはおそらく連射のインターバル調整のためだと思われますが、それだと変数を用意するところで間違ってしまっています。その場合は同時に発射可能な弾数分の変数が必要です。
コード[C++]: 全て選択
1
2
#define SHOT_MAX 4 // 同時に4発まで発射可能
SHOT gtama[SHOT_MAX];

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 22:00
No: 9
(OFFLINE)

 Re: シューティングゲームの作り方改

丁寧にありがとうございます

直してみたのですがいぜん弾が発射されません。

一応
頭の中では
インベーダーゲームのようなに発射する弾をつくりたいと思っております。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
if (inport(PK_W)&& gtama.time < 60)
    {
        //  if(gtama.flg == 0)
            //{
                gtama.flg = 1;
                gtama.fPosX=g_player.fPosX;
                gtama.fPosY=g_player.fPosY;
        //  }
    }

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 22:15
No: 10
(OFFLINE)

 Re: シューティングゲームの作り方改

アップデートと表示を分離してみました。弾が1発だけならtimeの条件は不要で、とりあえずY座標の条件だけでよいと思います。当たり判定で消える条件もあるかと思いますが、それはこれが解決してから考えればよいと思います。

せっかくtamadraw()があるならprintfはそちらで実行したほうがよいです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void tamaupdate(void)
{
    if ( inport(PK_N) )
    {
        gtama.fPosX = g_player.fPosX;
        gtama.fPosY = g_player.fPosY;
        gtama.flg = 1;
    }
 
    if ( --gtama.fPosY < 1 ) {
        gtama.flg = 0;
    }
}
 
void tamadrow(void)
{
    if (gtama.flg == 1){
        gotoxy(gtama.fPosX, gtama.fPosY );
        printf("|");
    }
}

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 22:22
No: 11
(OFFLINE)

 Re: シューティングゲームの作り方改

11行目間違いです。すいません。
コード[C++]: 全て選択
1
2
if ( gtama.flg == 1 && --gtama.fPosY < 1 ) {
}

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 22:23
No: 12
(OFFLINE)

 Re: シューティングゲームの作り方改

おおおおおおおおお!
でましたー!!!

わざわざありがとうございました

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 22:27
No: 13
(OFFLINE)

 Re: シューティングゲームの作り方改

すいません
もうひとついいでしょうか?
このgtma.fPosY<1の前にある--とはどういうことなのでしょうか?
--これをとったら表示位置が変わっていたので。

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 22:34
No: 14
(OFFLINE)

 Re: シューティングゲームの作り方改

fPosYの値を-1しています。+1する++と同類の演算子です。この++や--は変数の後につけるやり方(i++)と前につけるやり方(--i)があります。

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月04日(日) 23:07
No: 15
(OFFLINE)

 Re: シューティングゲームの作り方改

なるほど
勉強になります!
ありがとうございました

Name: こたん
[URL]
初心者(8,062 ポイント)
Date: 2018年2月05日(月) 14:58
No: 16
(OFFLINE)

 Re: 弾の当たり判定と弾の過去座標の消し方

こたん さんが書きました:くばられたものなので、むだなところもあります
tama.cpp,player.cpp変更 構造体'ou'を作成
弾が王にあたったら王の座標が2動く処理にしてありますが
王がうごきません
main cpp
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "main.h"
#include "player.h"
#include "./tama.h"
 
void Init(void);
void Uninit(void);
void Update(void);
void Draw(void);
void DispFPS(void);
 
#define DEBUG
int g_nCountFPS;                // FPSカウンタ
 
void main(void)
{
    // FPS計測するための変数
    DWORD dwExecLastTime;
    DWORD dwFPSLastTime;
    DWORD dwCurrentTime;
    int nCountFrame;
 
    // FPS計測の為の初期設定
    // 分解能を設定(何もしないとタイマの精度が悪くなるので設定)
    timeBeginPeriod(1);
 
    dwExecLastTime =
        dwFPSLastTime = timeGetTime();
    dwCurrentTime =
        nCountFrame = 0;
 
    Init();
 
    //printf("aaaaaaaaaaa");
    //getchar();
    //clrscr();
 
    do
    {
        dwCurrentTime = timeGetTime();
        if ((dwCurrentTime - dwFPSLastTime) >= 500) // 0.5秒ごとに実行(毎回実行するとチカチカするので)
        {
            g_nCountFPS = nCountFrame * 1000 / (dwCurrentTime - dwFPSLastTime);
            dwFPSLastTime = dwCurrentTime;
            nCountFrame = 0;
        }
 
        if ((dwCurrentTime - dwExecLastTime) >= (1000 / 60))// FPSを60にするために設定
        {
            dwExecLastTime = dwCurrentTime;
 
            Update();
 
            Draw();
 
#ifdef DEBUG
            // FPS表示
            DispFPS();
#endif
 
            nCountFrame++;
        }
    } while (!inport(PK_ESC));
 
    //終了処理
    Uninit();
 
    // 分解能を戻す
    timeEndPeriod(1);
}
//=============================================================================
// 初期化処理
//=============================================================================
void Init(void)
{
    // プレイヤーの初期化処理
    InitPlayer();
 
}
 
//=============================================================================
// 終了処理
//=============================================================================
void Uninit(void)
{
    // プレイヤーの終了処理
    UninitPlayer();
}
 
//=============================================================================
// 更新処理
//=============================================================================
void Update(void)
{
    // プレイヤーの更新処理
    UpdatePlayer();
 
    //弾
    tamaupdate();
 
}
 
//=============================================================================
// 描画処理
//=============================================================================
void Draw(void)
{
    // プレイヤーの描画処理
    DrawPlayer();
    //弾
    tamadrow();
}
 
#ifdef DEBUG
//=============================================================================
// FPS表示
//=============================================================================
void DispFPS(void)
{
    // 色設定
    textcolor(WHITE);
 
    gotoxy(1, 1);
    printf("FPS:%d", g_nCountFPS);
}
#endif





tama.h
コード[C++]: 全て選択
1
2
3
4
5
#pragma once
void tamaupdate(void);
void tamadrow(void);
 
#define ENEMY_SNUM_50


配布コード
conioex.h
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
 */
#ifndef __CONIOEX_H
#define __CONIOEX_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <process.h>
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <digitalv.h>
#pragma comment(lib, "winmm.lib")
 
#ifdef CONIOEX
#define CONIOEX_INST extern
#else /* !CONIOEX */
#define CONIOEX_INST
#endif /* CONIOEX */
 
#ifdef __BORLANDC__
#define NOCURSOR        _NOCURSOR
#define SOLIDCURSOR     _SOLIDCURSOR
#define NORMALCURSOR    _NORMALCURSOR
__inline void setcursortype(int cur_t) {_setcursortype(cur_t);}
__inline int _kbhit(void) {return kbhit();}
#else /* !__BORLANDC__ */
 
#pragma warning(disable:4996)
 
#define NOCURSOR        0
#define SOLIDCURSOR     1
#define NORMALCURSOR    2
 
#define _NOCURSOR       NOCURSOR
#define _SOLIDCURSOR    SOLIDCURSOR
#define _NORMALCURSOR   NORMALCURSOR
 
#ifndef __COLORS
#define __COLORS
enum COLORS {
    BLACK,          /* 黒      */
    BLUE,           /* 濃い青    */
    GREEN,          /* 緑      */
    CYAN,           /* 青緑       */
    RED,            /* 濃い赤    */
    MAGENTA,        /* 紫      */
    BROWN,          /* 濃い黄    */
    LIGHTGRAY,      /* 25%灰色    */
    DARKGRAY,       /* 50%灰色    */
    LIGHTBLUE,      /* 青      */
    LIGHTGREEN,     /* 明るい緑 */
    LIGHTCYAN,      /* 水色       */
    LIGHTRED,       /* 赤      */
    LIGHTMAGENTA,   /* ピンク    */
    YELLOW,         /* 黄      */
    WHITE           /* 白      */
};
#endif /* _COLORS */
 
CONIOEX_INST WORD   __conioex_h_wAttribute      /* 境界色 */
#ifndef CONIOEX
= LIGHTGRAY
#endif /* CONIOEX */
;
 
 
 
/**
 * @brief   水平方向のカーソル位置を取得
 *
 * @return  現在のカーソル位置のX座標(1~)
 */
int wherex(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.X - csbi.srWindow.Left + 1;
}
#endif /* CONIOEX */
 
/**
 * @brief   垂直方向のカーソル位置を取得
 *
 * @return  現在のカーソル位置のY座標(1~)
 */
int wherey(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.Y - csbi.srWindow.Top + 1;
}
#endif /* CONIOEX */
 
/**
 * @brief   カーソル位置の移動
 *
 * @param   x [入力] X座標(1~)
 * @param   y [入力] Y座標(1~)
 */
void gotoxy(int x, int y)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    COORD c;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    c.X = x - 1;
    c.Y = y - 1;
    if (GetConsoleScreenBufferInfo(h, &csbi))
        c.Y += csbi.srWindow.Top;
    SetConsoleCursorPosition(h, c);
}
#endif /* CONIOEX */
 
/**
 * @brief   行末まで消去
 */
void clreol(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    COORD   c;
    HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        DWORD num;
 
        c = csbi.dwCursorPosition;
        FillConsoleOutputAttribute(h, csbi.wAttributes,
            csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
        FillConsoleOutputCharacter(h, ' ',
            csbi.srWindow.Right - csbi.dwCursorPosition.X + 1, c, &num);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   画面消去
 */
void clrscr(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD num;
    COORD c = {0, 0};
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        __conioex_h_wAttribute = csbi.wAttributes;
        FillConsoleOutputAttribute(h, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), csbi.dwSize.X * csbi.dwSize.Y, c, &num);
        gotoxy(csbi.srWindow.Left + 1, csbi.srWindow.Top + 1);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   文字色高輝度化
 */
void highvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, csbi.wAttributes | FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */
 
/**
 * @brief   文字色低輝度化
 */
void lowvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, csbi.wAttributes & ~FOREGROUND_INTENSITY);
}
#endif /* CONIOEX */
 
/**
 * @brief   既定文字色設定
 */
void normvideo(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), LIGHTGRAY);
}
#endif /* CONIOEX */
 
void textbackground(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x00f0) | ((newcolor & 0x07) << 4));
}
#endif /* CONIOEX */
 
void textcolor(int newcolor)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleScreenBufferInfo(h, &csbi))
        SetConsoleTextAttribute(h, (csbi.wAttributes & ~0x0f) | (newcolor & 0x0f));
}
#endif /* CONIOEX */
 
void textattr(int newattr)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), newattr);
}
#endif /* CONIOEX */
 
void setcursortype(int cur_t)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_CURSOR_INFO cci;
    static  int nSize = -1;
 
    if (nSize < 0) {
        if (GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci))
            nSize = (int)cci.dwSize;
        else
            nSize = 25;
    }
    cci.dwSize      = (cur_t < NORMALCURSOR) ? 100 : nSize;
    cci.bVisible    = (cur_t != NOCURSOR);
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
#endif /* CONIOEX */
__inline void _setcursortype(int cur_t) {setcursortype(cur_t);}
 
/**
 * @brief   現在行に挿入
 */
void insline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        COORD   c;
        DWORD   len;
        DWORD   num;
        LPTSTR  psz;
        LPWORD  pw;
 
        c.X = csbi.srWindow.Left;
        len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
        psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
        pw = (LPWORD)_alloca(len * sizeof(WORD));
        for (c.Y = csbi.srWindow.Bottom; c.Y > csbi.dwCursorPosition.Y; c.Y--) {
            c.Y--;
            ReadConsoleOutputAttribute(h, pw, len, c, &num);
            ReadConsoleOutputCharacter(h, psz, len, c, &num);
            c.Y++;
            WriteConsoleOutputAttribute(h, pw, len, c, &num);
            WriteConsoleOutputCharacter(h, psz, len, c, &num);
        }
        FillConsoleOutputAttribute(h, csbi.wAttributes, len, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   現在行の削除
 */
void delline(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    CONSOLE_SCREEN_BUFFER_INFO  csbi;
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    if (GetConsoleScreenBufferInfo(h, &csbi)) {
        DWORD   num;
        COORD   c;
        DWORD   len;
        LPTSTR  psz;
        LPWORD  pw;
 
        c.X = csbi.srWindow.Left;
        len = csbi.srWindow.Right - csbi.srWindow.Left + 1;
        psz = (LPTSTR)_alloca(len * sizeof(TCHAR));
        pw = (LPWORD)_alloca(len * sizeof(WORD));
        for (c.Y = csbi.dwCursorPosition.Y; c.Y < csbi.srWindow.Bottom; c.Y++) {
            c.Y++;
            ReadConsoleOutputAttribute(h, pw, len, c, &num);
            ReadConsoleOutputCharacter(h, psz, len, c, &num);
            c.Y--;
            WriteConsoleOutputAttribute(h, pw, len, c, &num);
            WriteConsoleOutputCharacter(h, psz, len, c, &num);
        }
        FillConsoleOutputAttribute(h, __conioex_h_wAttribute, len, c, &num);
        FillConsoleOutputCharacter(h, TEXT(' '), len, c, &num);
    }
}
#endif /* CONIOEX */
 
#endif /* __BORLANDC__ */
 
__inline void setcaption(char *title) {SetConsoleTitleA(title);}
__inline int getcaption(char *title, int len) {return GetConsoleTitleA(title, len);}
__inline void msleep(unsigned long msecs) {Sleep(msecs);}
 
#define PK_ENTER                VK_RETURN
#define PK_ESC                  VK_ESCAPE
#define PK_F1                   VK_F1
#define PK_F2                   VK_F2
#define PK_F3                   VK_F3
#define PK_F4                   VK_F4
#define PK_F5                   VK_F5
#define PK_F6                   VK_F6
#define PK_F7                   VK_F7
#define PK_F8                   VK_F8
#define PK_F9                   VK_F9
#define PK_F10                  VK_F10
#define PK_F11                  VK_F11
#define PK_F12                  VK_F12
#define PK_SP                   VK_SPACE
#define PK_UP                   VK_UP
#define PK_DOWN                 VK_DOWN
#define PK_RIGHT                VK_RIGHT
#define PK_LEFT                 VK_LEFT
#define PK_SHIFT                VK_SHIFT
#define PK_CTRL                 VK_CONTROL
#define PK_ALT                  VK_MENU
#define PK_BS                   VK_BACK
#define PK_PAUSE                VK_PAUSE
#define PK_INS                  VK_INSERT
#define PK_DEL                  VK_DELETE
#define PK_TAB                  VK_TAB
#define PK_NFER                 VK_KANA     /* [無変換]  */
#define PK_XFER                 VK_CONVERT  /* [変換] */
#define PK_0                    0x30
#define PK_1                    0x31
#define PK_2                    0x32
#define PK_3                    0x33
#define PK_4                    0x34
#define PK_5                    0x35
#define PK_6                    0x36
#define PK_7                    0x37
#define PK_8                    0x38
#define PK_9                    0x39
#define PK_NUMPAD0              VK_NUMPAD0  /* テンキーの[0]   */
#define PK_NUMPAD1              VK_NUMPAD1  /* テンキーの[1]   */
#define PK_NUMPAD2              VK_NUMPAD2  /* テンキーの[2]   */
#define PK_NUMPAD3              VK_NUMPAD3  /* テンキーの[3]   */
#define PK_NUMPAD4              VK_NUMPAD4  /* テンキーの[4]   */
#define PK_NUMPAD5              VK_NUMPAD5  /* テンキーの[5]   */
#define PK_NUMPAD6              VK_NUMPAD6  /* テンキーの[6]   */
#define PK_NUMPAD7              VK_NUMPAD7  /* テンキーの[7]   */
#define PK_NUMPAD8              VK_NUMPAD8  /* テンキーの[8]   */
#define PK_NUMPAD9              VK_NUMPAD9  /* テンキーの[9]   */
#define PK_A                    0x41
#define PK_B                    0x42
#define PK_C                    0x43
#define PK_D                    0x44
#define PK_E                    0x45
#define PK_F                    0x46
#define PK_G                    0x47
#define PK_H                    0x48
#define PK_I                    0x49
#define PK_J                    0x4A
#define PK_K                    0x4B
#define PK_L                    0x4C
#define PK_M                    0x4D
#define PK_N                    0x4E
#define PK_O                    0x4F
#define PK_P                    0x50
#define PK_Q                    0x51
#define PK_R                    0x52
#define PK_S                    0x53
#define PK_T                    0x54
#define PK_U                    0x55
#define PK_V                    0x56
#define PK_W                    0x57
#define PK_X                    0x58
#define PK_Y                    0x59
#define PK_Z                    0x5A
 
#define PK_LT                   0x0BC       /* [,]  */
#define PK_GT                   0x0BE       /* [.]  */
#define PK_SLUSH                0x0BF       /* [?]  */
#define PK_DOT                  VK_DECIMAL  /* テンキーの[.]   */
#define PK_DIV                  VK_DIVIDE   /* テンキーの[/]   */
#define PK_BSLUSH               0x0E2       /* [_]  */
 
#define PK_SEMICOLON            0x0BB       /* [;]  */
#define PK_ADD                  VK_ADD      /* テンキーの[+]   */
#define PK_COLON                0x0BA       /* [:]  */
#define PK_MUL                  VK_MULTIPLY /* テンキーの[*]   */
#define PK_RBRACE               0x0DD       /* []]  */
 
#define PK_ATMARK               0x0C0       /* [@]  */
#define PK_LBRACE               0x0DB       /* [[]  */
 
#define PK_MINUS                0x0BD       /* [-]  */
#define PK_SUB                  VK_SUBTRACT /* テンキーの[-]   */
#define PK_XOR                  0x0DE       /* [^]  */
#define PK_YEN                  0x0DC       /* [\]  */
 
#define PK_KANJI                0x0F3       /* [半角/全角]  */
#define PK_CAPS                 0x0F0       /* [英数][ひらがな]   */
 
#define PM_LEFT                 VK_LBUTTON
#define PM_MID                  VK_MBUTTON
#define PM_RIGHT                VK_RBUTTON
#define PM_CURX                 0x0101
#define PM_CURY                 0x0102
 
#define PJ1_XPOS                0x0200
#define PJ1_YPOS                0x0201
#define PJ1_ZPOS                0x0202
#define PJ1_BTNS                0x0203
#define PJ2_XPOS                0x0210
#define PJ2_YPOS                0x0211
#define PJ2_ZPOS                0x0212
#define PJ2_BTNS                0x0213
#define PJ3_XPOS                0x0220
#define PJ3_YPOS                0x0221
#define PJ3_ZPOS                0x0222
#define PJ3_BTNS                0x0223
#define PJ4_XPOS                0x0230
#define PJ4_YPOS                0x0231
#define PJ4_ZPOS                0x0232
#define PJ4_BTNS                0x0233
#define PJ_XPOS                 PJ1_XPOS
#define PJ_YPOS                 PJ1_YPOS
#define PJ_ZPOS                 PJ1_ZPOS
#define PJ_BTNS                 PJ1_BTNS
 
CONIOEX_INST DWORD  __conioex_h_dwKeyMap[8]
#ifndef CONIOEX
= {0, 0, 0, 0, 0, 0, 0, 0}
#endif /* CONIOEX */
;
CONIOEX_INST COORD  __conioex_h_crdMouse
#ifndef CONIOEX
= {0, 0}
#endif /* CONIOEX */
;
 
/**
 * @brief   キー情報リセット
 *
 * @return  なし
 */
void reinport(void)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    int i;
    for(i = 0; i < 8; i++)
    {
        __conioex_h_dwKeyMap[i] = 0;
    }
}
#endif /* CONIOEX */
 
 
/**
 * @brief   各種リアルタイム入力
 *
 * @param   port [入力] ポート番号(P*_*)
 * @return  入力値
 */
int inport(int port)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    DWORD   dwEvent;
    HANDLE  h;
 
    /* ゲームパッド入力 */
    if ((port & 0xfe00) == 0x0200) {
        int     id = (port & 0x01f0) >> 4;
        int     func = port & 0x0f;
        JOYINFO ji;
 
        switch (func) {
        case 0: case 1: case 2: case 3:
            if (joyGetPos(id, &ji) != JOYERR_NOERROR)
                return -1;
            switch (func) {
            case 0:
                return ji.wXpos;
            case 1:
                return ji.wYpos;
            case 2:
                return ji.wZpos;
            case 3:
                return ji.wButtons;
            }
            break;
        default:
            break;
        }
        return 0;
    }
    // キー/マウス イベント チェック
    dwEvent = 0;
    h = GetStdHandle(STD_INPUT_HANDLE);
    if (GetNumberOfConsoleInputEvents(h, &dwEvent) && dwEvent) {
        DWORD           dwRead = 0;
        PINPUT_RECORD   pInpRec = (PINPUT_RECORD)_alloca(dwEvent * sizeof(INPUT_RECORD));
 
        if (ReadConsoleInput(h, pInpRec, dwEvent, &dwRead) && dwRead) {
            PINPUT_RECORD   pir = pInpRec;
            DWORD           dw;
            for (dw = 0; dw < dwRead; dw++, pir++) {
                switch (pir->EventType) {
                case KEY_EVENT: {
                    KEY_EVENT_RECORD*   pker = &pir->Event.KeyEvent;
                    if (pker->wVirtualKeyCode > 0x0FF)
                        break;
                    if (pker->bKeyDown)
                        __conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] |= (0x01 << (pker->wVirtualKeyCode & 31));
                    else
                        __conioex_h_dwKeyMap[pker->wVirtualKeyCode >> 5] &= ~(0x01 << (pker->wVirtualKeyCode & 31));
                    if (pker->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))
                        __conioex_h_dwKeyMap[VK_MENU >> 5] |= (0x01 << (VK_MENU & 31));
                    else
                        __conioex_h_dwKeyMap[VK_MENU >> 5] &= ~(0x01 << (VK_MENU & 31));
                    if (pker->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
                        __conioex_h_dwKeyMap[VK_CONTROL >> 5] |= (0x01 << (VK_CONTROL & 31));
                    else
                        __conioex_h_dwKeyMap[VK_CONTROL >> 5] &= ~(0x01 << (VK_CONTROL & 31));
                    if (pker->dwControlKeyState & SHIFT_PRESSED)
                        __conioex_h_dwKeyMap[VK_SHIFT >> 5] |= (0x01 << (VK_SHIFT & 31));
                    else
                        __conioex_h_dwKeyMap[VK_SHIFT >> 5] &= ~(0x01 << (VK_SHIFT & 31));
                    break;
                }
                case MOUSE_EVENT: {
                    MOUSE_EVENT_RECORD  *pmer = &pir->Event.MouseEvent;
                    __conioex_h_crdMouse = pmer->dwMousePosition;
                    if (pmer->dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_LBUTTON >> 5] |= (0x01 << (VK_LBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_LBUTTON >> 5] &= ~(0x01 << (VK_LBUTTON & 31));
                    if (pmer->dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_MBUTTON >> 5] |= (0x01 << (VK_MBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_MBUTTON >> 5] &= ~(0x01 << (VK_MBUTTON & 31));
                    if (pmer->dwButtonState & RIGHTMOST_BUTTON_PRESSED)
                        __conioex_h_dwKeyMap[VK_RBUTTON >> 5] |= (0x01 << (VK_RBUTTON & 31));
                    else
                        __conioex_h_dwKeyMap[VK_RBUTTON >> 5] &= ~(0x01 << (VK_RBUTTON & 31));
                    break;
                }
                default:
                    break;
                }
            }
        }
    }
 
    // マウス座標を返す
    switch (port) {
    case PM_CURX:
        return __conioex_h_crdMouse.X + 1;
    case PM_CURY:
        return __conioex_h_crdMouse.Y + 1;
    default:
        break;
    }
    // キー状態を返す
    return (__conioex_h_dwKeyMap[(port & 0x0FF) >> 5] & (0x01 << (port & 31))) != 0;
}
#endif /* CONIOEX */
 
typedef struct {
    int             nDevType;
    MCIDEVICEID     wDeviceID;
    char            szPath[MAX_PATH];
    int             nRepeat;
} __conioex_h_SoundInfo;
 
/**
 * @brief   サウンド ファイルを開く
 *
 * @param   path [入力] ファイル名
 * @retval  非0    サウンド ハンドル
 * @retval  0   エラー
 */
int opensound(char *path)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    const char  szMidiExt[] = ".mid|.midi|.rmi";
    const char  szWaveExt[] = ".wav|.wave";
    const char  szMP3Ext[] = ".mp3";
    char        szExt[_MAX_EXT];
    union {
        MCI_WAVE_OPEN_PARMSA    wop;
        MCI_OPEN_PARMSA         op;
    } m;
    DWORD       dwCmd;
    __conioex_h_SoundInfo   *psi;
 
    psi = (__conioex_h_SoundInfo *)malloc(sizeof(__conioex_h_SoundInfo));
    if (psi == NULL)
        return 0;
    ZeroMemory(psi, sizeof(*psi));
 
    ZeroMemory(&m, sizeof(m));
    _splitpath(path, NULL, NULL, NULL, szExt);
    strlwr(szExt);
    dwCmd = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT;
    if (strstr(szMidiExt, szExt)) {
        psi->nDevType = MCI_DEVTYPE_SEQUENCER;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
        m.op.lpstrElementName = psi->szPath;
        dwCmd |= MCI_OPEN_TYPE_ID;
    } else if (strstr(szWaveExt, szExt)) {
        psi->nDevType = MCI_DEVTYPE_WAVEFORM_AUDIO;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.wop.lpstrDeviceType  = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
        m.wop.lpstrElementName = psi->szPath;
        dwCmd |= MCI_OPEN_TYPE_ID;
//      m.wop.dwBufferSeconds  = 60;
//      dwCmd |= MCI_WAVE_OPEN_BUFFER;
    } else if (strstr(szMP3Ext, szExt)) {
        psi->nDevType = MCI_DEVTYPE_DIGITAL_VIDEO;
        lstrcpynA(psi->szPath, path, MAX_PATH);
        m.op.lpstrDeviceType = "MPEGVideo";
        m.op.lpstrElementName = psi->szPath;
    } else {
        free(psi);
        return 0;
    }
    if (mciSendCommandA(0, MCI_OPEN, dwCmd, (DWORD)&m)) {
        free(psi);
        return 0;
    }
    psi->wDeviceID = m.op.wDeviceID;
    return (int)psi;
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド ファイルを閉じる
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void closesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (psi->wDeviceID) {
        mciSendCommand(psi->wDeviceID, MCI_CLOSE, 0, 0);
        psi->wDeviceID = 0;
    }
    free(psi);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンドを再生する
 *
 * @param   hsound [入力] サウンド ハンドル
 * @param   repeat [入力] ループ有無
 */
void playsound(int hsound, int repeat)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    DWORD                   dwCmd;
    MCI_PLAY_PARMS          mpp;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    psi->nRepeat = repeat;
    ZeroMemory(&mpp, sizeof(mpp));
    dwCmd = 0;
    if (repeat) {
        switch (psi->nDevType) {
        case MCI_DEVTYPE_DIGITAL_VIDEO:
            dwCmd |= (MCI_FROM | MCI_DGV_PLAY_REPEAT);
            mpp.dwFrom = 0;
            break;
        case MCI_DEVTYPE_SEQUENCER:
        case MCI_DEVTYPE_WAVEFORM_AUDIO:
            break;
        default:
            break;
        }
    }
    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
    mciSendCommand(psi->wDeviceID, MCI_PLAY, dwCmd, (DWORD)&mpp);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド再生を停止する
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void stopsound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    psi->nRepeat = 0;
    mciSendCommand(psi->wDeviceID, MCI_STOP, MCI_WAIT, 0);
    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
}
#endif /* CONIOEX */
 
/**
 * @brief   サウンド再生状態の取得
 *
 * @param   hsound [入力] サウンド ハンドル
 * @return  再生中ならば 0 以外を返す。
 */
int checksound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    MCI_STATUS_PARMS        msp;
 
    if (!hsound)
        return 0;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return 0;
    ZeroMemory(&msp, sizeof(msp));
    msp.dwItem = MCI_STATUS_MODE;
    if (mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp))
        return 0;
    return msp.dwReturn == MCI_MODE_PLAY;
}
#endif /* CONIOEX */
 
/**
 * @brief   ループ再生の強制更新
 *
 * @param   hsound [入力] サウンド ハンドル
 */
void updatesound(int hsound)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
    MCI_STATUS_PARMS        msp;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID || !psi->nRepeat)
        return;
    switch (psi->nDevType) {
    case MCI_DEVTYPE_DIGITAL_VIDEO:
        break;
    case MCI_DEVTYPE_SEQUENCER:
    case MCI_DEVTYPE_WAVEFORM_AUDIO:
        ZeroMemory(&msp, sizeof(msp));
        msp.dwItem = MCI_STATUS_MODE;
        if (!mciSendCommand(psi->wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&msp)) {
            if (msp.dwReturn != MCI_MODE_PLAY) {
                if (psi->nRepeat > 0) {
                    psi->nRepeat = -1;
                    mciSendCommand(psi->wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);
                    mciSendCommand(psi->wDeviceID, MCI_PLAY, 0, 0);
                }
            } else
                psi->nRepeat = 1;
        }
        break;
    default:
        break;
    }
}
#endif /* CONIOEX */
 
/**
 * @brief   再生音量を設定する
 *
 * @param   hsound [入力] サウンド ハンドル
 * @param   percent [入力] 音量 (0 ~ 100)
 */
void setvolume(int hsound, int percent)
#ifdef CONIOEX
;
#else /* !CONIOEX */
{
    __conioex_h_SoundInfo   *psi;
 
    if (!hsound)
        return;
    psi = (__conioex_h_SoundInfo *)hsound;
    if (!psi->wDeviceID)
        return;
    switch (psi->nDevType) {
    case MCI_DEVTYPE_DIGITAL_VIDEO: {
        MCI_DGV_SETAUDIO_PARMS  mdsp;
 
        ZeroMemory(&mdsp, sizeof(mdsp));
        mdsp.dwItem = MCI_DGV_SETAUDIO_VOLUME;
        mdsp.dwValue = percent * 10;
        mciSendCommand(psi->wDeviceID, MCI_SETAUDIO,
            MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mdsp);
        break;
    }
    case MCI_DEVTYPE_SEQUENCER: {
        DWORD dwVolume;
 
        dwVolume = 0x0ffff * percent / 100;
        midiOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
        break;
    }
    case MCI_DEVTYPE_WAVEFORM_AUDIO: {
        DWORD dwVolume;
 
        dwVolume = 0x0ffff * percent / 100;
        waveOutSetVolume(0, (DWORD)MAKELONG(dwVolume, dwVolume));
        break;
    }
    default:
        break;
    }
}
#endif /* CONIOEX */
 
#ifdef __cplusplus
}
#endif
 
#endif /* __CONIOEX_H */




弾cpp変更

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void tamaupdate(void)
{
    if (inport(PK_N))
    {
        gtama.fPosX = g_player.fPosX;
        gtama.fPosY = g_player.fPosY;
        gtama.flg = 1;
    }
 
    if (++gtama.fPosX > 79) {
        gtama.flg = 0;
    }
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        gtama.fPosX = ou.fPosX - 1;
    }
   
 
}
 
 
void tamadrow(void)
{
    textcolor(RED);
 
    if (gtama.flg == 1)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("弾");
    }
    /*if(gtama.flg == 0)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("  ");
    }*/
 
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        ou.fPosX +=2;
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
    else
    {
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
}


player.cpp変更後
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
//=============================================================================
//
// プレイヤー処理 [player.cpp]
//
//=============================================================================
#define CONIOEX
#include "conioex.h"
#include "main.h"
#include "player.h"
 
//*****************************************************************************
// マクロ定義
//*****************************************************************************
#define VALUE_MOVE_X            (0.75f)// 地上での移動量X方向
#define VALUE_MOVE_Y            (0.30f)
#define VALUE_MOVE_X_AIR        (0.30f)     // 空中での移動量X方向
#define VALUE_RESIST_X          (0.50f)     // 地上での移動摩擦抵抗
#define LIMIT_LEFT              (2.0f)      // 移動範囲左端
#define LIMIT_RIGHT             (159.0f)        // 移動範囲右端
#define LIMIT_DOWN              (24.0f)     // 移動範囲下端
#define LIMIT_APP               (2.0f)
 
// ここから追加 ジャンプ追加処理
#define VALUE_JUMP              (0.80f)     // ジャンプ量
 
// ジャンプ処理を追加後
#define VALUE_RESIST_X_AIR      (0.35f)     // 空中での移動摩擦抵抗
#define VALUE_GRAVITY           (0.06f)     // 重力量
 
//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
 
 
//*****************************************************************************
// グローバル変数
//*****************************************************************************
PLAYER g_player;            // プレイヤーワー
SHOT gtama;
komaou ou;
//=============================================================================
// プレイヤーの初期化処理
//=============================================================================
void InitPlayer(void)
{
    // プレイヤーワークのクリア
    g_player.fPosX = 1.0f;
    g_player.fPosY = 12.0f;
    g_player.fPosXOld =1.0f;
    g_player.fPosYOld = 12.0f;
    g_player.fMoveX = 0.0f;
    g_player.fMoveY = 0.0f;
 
   
    //gtama.fPosX = 20.0f;
    //gtama.fPosY = 23.0f;
 
    // ジャンプ追加処理
    g_player.bJump = false;
    g_player.bMove = false;
}
 
//=============================================================================
// プレイヤーの終了処理
//=============================================================================
void UninitPlayer(void)
{
}
 
//=============================================================================
// プレイヤーの更新処理
//=============================================================================
void UpdatePlayer(void)
{
 
 
    // 前回の位置を保存
    g_player.fPosXOld = g_player.fPosX;
    g_player.fPosYOld = g_player.fPosY;
 
    if (inport(PK_A))
    {// 左移動
 
        // ジャンプ追加処理
        /*if (g_player.bJump)
        {
            g_player.fMoveY -= VALUE_MOVE_Y_AIR;
        }*/
        g_player.fPosY -= 1;
            g_player.fMoveY -= 1;
        g_player.bMove = true;
    }
 
    if (inport(PK_D))
    {// ↓移動
 
        // ジャンプ追加処理
        /*if (g_player.bJump)
        {
            // 左移動追加後に考えさせる
            g_player.fMoveX += VALUE_MOVE_X_AIR;
        }
        else
        {
            g_player.fMoveX += VALUE_MOVE_X;
        }*/
        g_player.fPosY += 1;
        g_player.fMoveY -= VALUE_MOVE_Y;
        g_player.bMove = true;
 
    }
 
    // 位置更新
    //g_player.fPosY += g_player.fMoveY;
    if (g_player.fPosY > LIMIT_DOWN)
    {
        g_player.fPosY = LIMIT_DOWN;
    }
    if (g_player.fPosY <LIMIT_APP)
    {
        g_player.fPosY= LIMIT_APP;
    }
 
}
 
//=============================================================================
// プレイヤーの描画処理
//=============================================================================
void DrawPlayer(void)
{
    // 色設定
    textcolor(BLUE);
 
    if (g_player.bMove)
    {// 移動した場合
     // 前回の位置でのプレイヤーを消去
        gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld-2), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld+2), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld - 4), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld + 4), (int)(g_player.fPosYOld));
        printf(" ");
        gotoxy((int)(g_player.fPosXOld), (int)(g_player.fPosYOld - 1.0f));
        printf(" ");
 
        g_player.bMove = false;
    }
 
    // 現在の位置にプレイヤーを表示
 
    gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY));
    printf("■");
    gotoxy((int)(g_player.fPosX), (int)(g_player.fPosY - 1.0f));
    printf("●");
    }

player.h変更後
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
プレイヤー処理 [player.h]
//
//=============================================================================
 
#ifndef _PLAYER_H_  // 2重インクルード防止のマクロ定義
#define _PLAYER_H_
 
//*************************************
// プレイヤー構造体
//*************************************
typedef struct
{
    double fPosX;       // 現在の位置X
    double fPosY;       // 現在の位置Y
    double fPosXOld;        // 前回の位置X
    double fPosYOld;        // 前回の位置Y
    double fMoveX;      // 移動量X方向
    double fMoveY;      // 移動量Y方向
    bool bMove;         // 移動したかどうか(描画更新用)
    bool bJump;         // ジャンプしたかどうか(描画更新用)
} PLAYER;
 
typedef struct
{
    double fPosX=50;        // 現在の位置X
    double fPosY=15;        // 現在の位置Y
    double fPosXOld;        // 前回の位置X
    double fPosYOld;        // 前回の位置Y
    double fMoveX;      // 移動量X方向
    double fMoveY;      // 移動量Y方向
    bool bMove;         // 移動したかどうか(描画更新用)
    bool bJump;         // ジャンプしたかどうか(描画更新用)
} komaou;
 
 
typedef struct {
    double fPosX; //現在位置の座標(X座標)
    double fPosY;//現在位置の座標(Y座標)
    double tax;//ターゲットまでの距離
    double spd;//スピード
    int pattern;
    bool flg;
    int time=60;
}SHOT;
 
 
//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
void InitPlayer(void);
void UninitPlayer(void);
void UpdatePlayer(void);
void DrawPlayer(void);
 
//*****************************************************************************
// グローバル変数
//*****************************************************************************
extern PLAYER g_player;         // プレイヤーワー
extern SHOT gtama;
extern komaou ou;
 
#endif


Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月06日(火) 21:12
No: 17
(OFFLINE)

 Re: シューティングゲームの作り方改

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void tamaupdate(void)
{
    if (inport(PK_N))
    {
        gtama.fPosX = g_player.fPosX;
        gtama.fPosY = g_player.fPosY;
        gtama.flg = 1;
    }
 
    if (++gtama.fPosX > 79) {
        gtama.flg = 0;
    }
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        gtama.fPosX = ou.fPosX - 1; // ここでgtama.fPosXの値を変更しているので
    }
}
 
 
void tamadrow(void)
{
    textcolor(RED);
 
    if (gtama.flg == 1)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("弾");
    }
    /*if(gtama.flg == 0)
    {
        gotoxy((int)gtama.fPosX, (int)gtama.fPosY);
        printf("  ");
    }*/
 
 
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY) // ここの条件が真にならないです
    {
        ou.fPosX +=2;
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
    else
    {
        gotoxy((int)ou.fPosX, (int)ou.fPosY);
        printf("王");
    }
}

最初の条件判定で値を変更してしまっているので、次のところで真にならないため、ou.fPosX +=2;が実行されません。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void tamaupdate(void)
{
    if (gtama.fPosX == ou.fPosX&&gtama.fPosY == ou.fPosY)
    {
        gtama.move_flag = true; // SHOT構造体にメンバーを追加
    }
}
void tamadrow(void)
{
     if (gtama.move_flag == true)
    {
        ou.fPosX +=2;
    }
     gotoxy((int)ou.fPosX, (int)ou.fPosY);
     printf("王");
    gtama.move_flag = false;
}


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: みーぬ & ゲスト[20人]