チェックポイント 今回はキー入力に関する説明を行う際に論理演算について説明が必要になります。 論理演算の説明の前にプログラムの修正を行います。
|
| ■プログラム |
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 |
プログラムの解説は今回は行いません。
変更部分によりうまく武器の発射ができるようになったと思います。