【はじめてのプチコン】キー入力処理 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
今回はキー入力に関する説明を行う際に論理演算について説明が必要になります。
論理演算の説明の前にプログラムの修正を行います。


■プログラム
0001 ' initialize
0002 GOSUB @SYS_INI
0003 GOSUB @PLY_INI
0004 GOSUB @WPN_INI
0005 GOSUB @UFO_INI
0006 ' game loop
0007 @LOOP
0008 GOSUB @SYS_MAIN
0009 ' task
0010 GOSUB @PLY_TASK
0011 GOSUB @WPN_TASK
0012 GOSUB @UFO_TASK
0013 GOTO @LOOP
0014 '
0015 ' system
0016 '
0017 @SYS_INI
0018 CLEAR
0019 SYS_CNT = 0
0020 SYS_KEY = BUTTON()
0021 RETURN
0022 '
0023 @SYS_MAIN
0024 VSYNC 1
0025 CLS
0026 SYS_CNT = SYS_CNT + 1
0027 OLD_KEY = SYS_KEY
0028 SYS_KEY = BUTTON()
0029 TRG_KEY = SYS_KEY XOR OLD_KEY
0030 ON_KEY = TRG_KEY AND SYS_KEY
0031 RETURN
0032 '
0033 ' UFO task
0034 '
0035 @UFO_INI
0036 UFO_SX = 0.1
0037 UFO_F = 0
0038 UFO_CNT = 60
0039 RETURN
0040 '
0041 @UFO_TASK
0042 ON UFO_F GOTO @UFO_WAIT,@UFO_MVR,@UFO_MVL
0043 STOP
0044 '
0045 @UFO_WAIT
0046 UFO_CNT = UFO_CNT + 1
0047 IF UFO_CNT > 0 THEN RETURN
0048 GOTO @UFO_RSET
0049 ' move right
0050 @UFO_MVR
0051 LOCATE UFO_X, 0
0052 PRINT "A"
0053 UFO_X = UFO_X + UFO_SX
0054 IF UFO_X > 32 GOTO @UFO_LSET
0055 HITX = UFO_X
0056 HITY = 0
0057 GOSUB @WPN_HITC
0058 IF HITF GOTO @UFO_DETH
0059 RETURN
0060 '
0061 @UFO_LSET
0062 UFO_X = 31
0063 UFO_F = 2
0064 RETURN
0065 ' move left
0066 @UFO_MVL
0067 LOCATE UFO_X, 0
0068 PRINT "A"
0069 UFO_X = UFO_X - UFO_SX
0070 IF UFO_X < 0 GOTO @UFO_RSET
0071 HITX = UFO_X
0072 HITY = 0
0073 GOSUB @WPN_HITC
0074 IF HITF GOTO @UFO_DETH
0075 RETURN
0076 '
0077 @UFO_RSET
0078 UFO_X = 0
0079 UFO_F = 1
0080 RETURN
0081 '
0082 @UFO_DETH
0083 UFO_F = 0
0084 UFO_CNT = 60
0085 RETURN
0086 '
0087 ' player task
0088 '
0089 @PLY_INI
0090 PLY_X = 15
0091 PLY_SX = 0.5
0092 PLY_F = 0
0093 RETURN
0094 '
0095 @PLY_TASK
0096 LOCATE PLY_X,21
0097 PRINT "P"
0098 IF ON_KEY AND 16 THEN GOSUB @WPN_FIRE
0099 ON PLY_F GOTO @PLY_STOP,@PLY_MVR,@PLY_MVL
0100 STOP
0101 ' stop
0102 @PLY_STOP
0103 IF SYS_KEY AND 8 GOTO @PLY1
0104 IF SYS_KEY AND 4 GOTO @PLY2
0105 RETURN
0106 @PLY1
0107 PLY_F = 1
0108 RETURN
0109 @PLY2
0110 PLY_F = 2
0111 RETURN
0112 ' move right
0113 @PLY_MVR
0114 PLY_X = PLY_X + PLY_SX
0115 IF PLY_X > 31 THEN PLY_X = 31
0116 IF SYS_KEY AND 8 THEN RETURN
0117 PLY_F = 0
0118 RETURN
0119 ' move left
0120 @PLY_MVL
0121 PLY_X = PLY_X - PLY_SX
0122 IF PLY_X < 0 THEN PLY_X = 0
0123 IF SYS_KEY AND 4 THEN RETURN
0124 PLY_F = 0
0125 RETURN
0126 '
0127 ' weapon task
0128 '
0129 @WPN_INI
0130 WPN_MAX = 3
0131 DIM WPN_F(WPN_MAX)
0132 DIM WPN_X(WPN_MAX)
0133 DIM WPN_Y(WPN_MAX)
0134 FOR I=0 TO WPN_MAX-1
0135 WPN_F(i) = 0
0136 NEXT I
0137 WPN_SY = 0.5
0138 RETURN
0139 '
0140 @WPN_TASK
0141 FOR WPN_I=0 TO WPN_MAX-1
0142 GOSUB @WPN_SUB
0143 NEXT WPN_I
0144 RETURN
0145 '
0146 @WPN_SUB
0147 ON WPN_F(WPN_I) GOTO @WPN_WAIT,@WPN_MOVE
0148 STOP
0149 '
0150 @WPN_WAIT
0151 RETURN
0152 '
0153 @WPN_MOVE
0154 LOCATE WPN_X(WPN_I),WPN_Y(WPN_I)
0155 PRINT "!"
0156 WPN_Y(WPN_I) = WPN_Y(WPN_I) + WPN_SY
0157 IF WPN_Y(WPN_I) >= 0 THEN RETURN
0158 WPN_F(WPN_I) = 0
0159 RETURN
0160 '
0161 @WPN_FIRE
0162 GOSUB @WPN_GET
0163 IF WPN_N < 0 THEN RETURN
0164 BEEP 10
0165 WPN_F(WPN_N) = 1
0166 WPN_X(WPN_N) = PLY_X
0167 WPN_Y(WPN_N) = 20
0168 RETURN
0169 '
0170 @WPN_HITC
0171 HITF = 0
0172 FOR WPN_N=0 TO WPN_MAX-1
0173 IF WPN_F(WPN_N) == 0 GOTO @WPN_NEXT
0174 IF FLOOR(WPN_X(WPN_N)) != FLOOR(HITX) GOTO @WPN_NEXT
0175 IF FLOOR(WPN_Y(WPN_N)) != FLOOR(HITY) GOTO @WPN_NEXT
0176 GOTO @WPN_HOK
0177 @WPN_NEXT
0178 NEXT WPN_N
0179 RETURN
0180 '
0181 @WPN_HOK
0182 HITF = 1
0183 '
0184 BEEP 13
0185 WPN_F(WPN_N) = 0
0186 RETURN
0187 '
0188 @WPN_GET
0189 FOR WPN_N=0 TO WPN_MAX-1
0190 IF WPN_F(WPN_N)==0 THEN RETURN
0191 NEXT WPN_N
0192 WPN_N = -1
0193 RETURN
0194 'End of line


プログラムの解説は今回は行いません。
変更部分によりうまく武器の発射ができるようになったと思います。