800954 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

冷静とオタクのあいだ

リスト:LASER Ver3.1

プチコン プログラムリスト

タイトル:LASER Ver3.1
レーザーを撃つことを目的としたものです。
敵キャラ,衝突判定を盛り込みました。

Yボタンでレーザー撃てます。
Bボタンでオプション追加。
Aボタンでオプションが減ります。
Xボタンで終了します。
もちろん十字キー(スライドパッド)で移動できます。

敵キャラにレーザーを当てると色が変わります。
破壊はできません。
また、敵キャラの移動中は衝突判定をしていません。
移動中(自動補間)に色を変えると、移動が中断されてしまいます。

「一連のプログラム開発で分かったこと。」
このプログラムは処理落ち前提で作り始めました。
全体が均一に処理落ちすれば問題なく遊べるというか、昔のシューティングゲームは普通に処理落ちもゲーム性の一つとされていました。
そのためにスプライトの移動をまとめて行えるような作りになっています。
イメージとしては、必要な計算を全て終わらせて垂直帰線期間を待って画面を書き換える(実際に動かす)というような感じです。
結果、計算が間に合わなければ1フレームスキップ(処理落ち)します。

それに対して、プチコンで速度を稼ごうと思ったら処理を極力プチコンに渡してしまう必要があります。
スプライトに限って言えば、自動補間を利用してスプライトを移動するということです。
(プチコンは終点を指定しておけば、自動補間してスプライトを移動してくれます。)

とても優れた機能ですが、今回のプログラムの構造からすると欠点になってしまいます。
レーザーを大量に撃つことによって処理落ちが発生しますが、自動補間による移動は処理落ちの影響を受けません。
(敵キャラの出現はカウンタによってタイミングを計っているいるので影響を受けます。出現間隔が変わるのはそのためですが移動速度は均一です。)
自機はコントローラー入力によって随時移動させています。
つまり、自機は処理落ちの影響を受け遅くなり、敵キャラは自動補間によって処理落ち無しで動作します。

結論としては・・・
均一に処理落ちさせるには、すべてのスプライトを自力で動かす(1フレームごとに位置を指定すると言う意味)必要があります。
が、自動補間を積極的に利用した方が、ゴージャス(キャラが沢山)なゲームを作れる可能性が高くなります。
そして、自動補間を使うなら処理落ちは極力避けるようにするべきです。

ゲーム性に合わせて選択すれば良いのですが、BGでも自動補間が使えるので後者を選択した方が良いと思います。
即ち、「プチコンの仕組みに則って処理落ちがしない範囲で作る」ことが良いと思いました。

行き当たりばったりで来ましたが、とりあえずこのレーザーを撃つプログラムは役目を終えたかなと。

DSC03271.JPG

http://www43.tok2.com/home/ogut/index.html
リスト作成に上記サイトの「PTC2HTML」を利用させていただいています。

001. ′Ver 3.1
002.  ′テキ10タイ
003. ′Ver 3.0
004.  ′テキシュツケ゛ン
005. ′Ver 2.1
006.  ′BGニホシヲヒョウシ゛
007. ′Ver 2.0 7コショリオチナシ
008.  ′キ゛シ゛ヒ゛ットシフト
009. ACLS
010. CLEAR
011. VISIBLE 1,1,1,1,1,1
012. CLS:COLOR 0
013. ′GPAGE 0,0,0
014. 
015. GOSUB @BGSET
016. GOSUB @BGSCR
017. 
018. OPMAX=20     ′オフ゜ションノカス゛
019. MID0=0       ′シ゛キノスフ゜ライトID0
020. MID1=OPMAX+1 ′シ゛キノスフ゜ライトID1
021. 
022. ′LASERステ-タス シ゛キ+オフ゜ション
023. DIM LST(OPMAX+1,4)
024. FOR I=0 TO OPMAX
025.   LST(I,0)=0  ′フラク゛
026.   LST(I,1)=0  ′ナカ゛サ
027.   LST(I,2)=0  ′カイシX
028.   LST(I,3)=0  ′カイシY
029. NEXT I
030. 
031. ′テキキャラカンリヨウ
032. EM0=MID1+1   ′テキキャラカイシスフ゜ライトNo
033. EMC=0        ′テキキャラカウント
034. FRMCNT=0     ′テキシュツケ゛ンタイミンク゛ヨウ
035. 
036. ′ク゛ラフィックショキセッテイ
037. GPAGE 0,0,0
038. GPRIO 2
039. 
040. ′スフ゜ライトシ゛ュンヒ゛
041. DIM SPK(100),SPP(100),SPH(100),SPV(100),SPI(100)
042. DIM SPF(100),SPX(100),SPY(100)
043. DIM SPA(100),SPX2(100),SPY2(100) ′コノ3ツハシンキホカント゛ウサヨウ
044. DIM SON(100) ′テキキャラシュツケ゛ンフラク゛トシテリヨウ
045. FOR I=0 TO 99
046. ′  SPF(I)=0  ′0:スキッフ゜ 1:シンキ 2:イト゛ウ 3:ヘンコウ 4:シュウキョ
047.   SPF(I)=-1  ′-1:ムシ? 0:スキッフ゜ 1:シンキ 2:シンキ(ホカンアリ) 3:イト゛ウ 4:イト゛ウ(ホカンアリ) 5:ヘンコウ 6:シュウキョ
048. NEXT I
049. ′シ゛キセッテイ
050. SPK(MID0)=256
051. SPP(MID0)=2
052. SPH(MID0)=0
053. SPV(MID0)=0
054. SPI(MID0)=0
055. SPF(MID0)=1
056. SPX(MID0)=100
057. SPY(MID0)=100
058. SPK(MID1)=257
059. SPP(MID1)=2
060. SPH(MID1)=0
061. SPV(MID1)=0
062. SPI(MID1)=0
063. SPF(MID1)=1
064. SPX(MID1)=116
065. SPY(MID1)=100
066. 
067. ′オフ゜ション
068. OPW=8    ′オフ゜ションノウエイト
069. DIM OP(OPW*OPMAX,2)  ′オフ゜ショヨウエイトテ-フ゛ル X,Y
070. OPC=0    ′ヒョウシ゛チュウノオフ゜ションスウ
071. FOR I=1 TO OPMAX
072.  SPK(I)=200
073.  SPP(I)=5
074.  SPH(I)=0
075.  SPV(I)=0
076.  SPI(I)=0
077.  SPF(I)=-1
078.  SPX(I)=0
079.  SPY(I)=0
080. NEXT I
081. 
082. SPCNT=EM0-1  ′スフ゜ライトサイタ゛イスウ
083. 
084. ′オフ゜ションサ゛ヒョウテ-フ゛ル 0:X 1:Y
085. DIM OP$(2)
086. 
087. ′GOSUB @TEKIINT
088. GOSUB @SPWRITE
089. 
090. @MLOOP
091. ′ニュウリョク
092. XX=0:YY=0
093. BTN=BUTTON(0)
094. 
095. IF BTN AND  64 GOTO @EXIT  ′Xホ゛タン
096. IF BTN AND 128 THEN SHOT=1 ′Yホ゛タン
097. IF BTN AND   1 THEN YY=-2  ′ウエ
098. IF BTN AND   2 THEN YY=2   ′シタ
099. IF BTN AND   4 THEN XX=-2  ′ヒタ゛リ
100. IF BTN AND   8 THEN XX=2   ′ミキ゛
101. 
102. ′レンソ゛クシテニュウリョクサレナイヨウニフラク゛テ゛セイキ゛ョスル
103. IF BTN AND 16 THEN AB=1 ELSE AB=0 ′Aホ゛タン
104. IF AB==0 THEN AFLG=1
105. IF BTN AND 32 THEN BB=1 ELSE BB=0 ′Bホ゛タン
106. IF BB==0 THEN BFLG=1
107. 
108. IF XX!=0 OR YY!=0 THEN GOSUB @MYMOVE
109. 
110. IF SHOT==0 GOTO @SHOTSKIP
111.  FOR I=0 TO OPC
112.   LST(I,0)=1
113.  NEXT
114.  SHOT=0
115. @SHOTSKIP
116. 
117. ′オフ゜ション Aホ゛タン=ヘラス Bホ゛タン=フヤス
118. IF AFLG AND AB THEN OPADD=-1
119. IF BFLG AND BB THEN OPADD=1
120. IF OPADD!=0 THEN GOSUB @OPTION
121. 
122. WAIT 1
123. ′GOSUB @SPWRITE
124. GOSUB @LASER
125. GOSUB @SPWRITE
126. GOSUB @BGSCR
127. GOSUB @TEKI
128. FRMCNT=FRMCNT+1
129. GOTO @MLOOP
130. 
131. 
132. @OPTION
133.  IF OPADD==-1 GOTO @OPTMI
134.   ′オフ゜ションツイカ
135.   BFLG=0
136.   IF OPC==OPMAX GOTO @OPEND
137.    OPC=OPC+1
138.    OPX=SPX(OPC-1)
139.    IF OPC==1 THEN OPX=OPX+4
140.    OPY=SPY(OPC-1)
141.    ′ツイカシタ オフ゜ションノ イチ
142.    OP$(0)=OP$(0)+CHR$(OPX)*OPW
143.    OP$(1)=OP$(1)+CHR$(OPY)*OPW
144.    ′スフ゜ライト
145.    SPX(OPC)=OPX
146.    SPY(OPC)=OPY
147.    SPF(OPC)=1
148.  GOTO @OPEND
149.  @OPTMI
150.   AFLG=0
151.   IF OPC==0 GOTO @OPEND
152.    SPF(OPC)=6
153.    OPC=OPC-1
154.  @OPEND
155.  OPADD=0
156. RETURN
157. 
158. @EXIT
159. ACLS
160. PRINT”シュウリョウ
161. END
162. 
163. @MYMOVE
164. ′シ゛キノイト゛ウ
165. SPX(MID0)=SPX(MID0)+XX
166. IF SPX(MID0)<0 THEN SPX(MID0)=0
167. IF SPX(MID0)>223 THEN SPX(MID0)=223
168. SPY(MID0)=SPY(MID0)+YY
169. IF SPY(MID0)<0 THEN SPY(MID0)=0
170. IF SPY(MID0)>175 THEN SPY(MID0)=175
171. SPF(MID0)=3
172. SPX(MID1)=SPX(MID0)+16
173. SPY(MID1)=SPY(MID0)
174. SPF(MID1)=3
175. ′オフ゜ションイト゛ウ
176. IF OPC==0 GOTO @OPMVSKIP
177.  ′オフ゜ションウエイトテ-フ゛ルヲ1ツスライト゛
178.  OPWORK=OPW*OPC-1
179.  ′サイコ゛1モシ゛キリトル
180.  ′セントウニ シ゛キノイチヲイレル
181.  OP$(0)=CHR$(SPX(MID0)+4)+LEFT$(OP$(0),OPWORK)
182.  OP$(1)=CHR$(SPY(MID0))+LEFT$(OP$(1),OPWORK)
183. 
184.  ′オフ゜ツョンスフ゜ライトニハンエイ
185.  FOR I=1 TO OPC
186.   IF SPF(I)!=-1 GOTO @OPHSKIP ′ツイカ、サクシ゛ョサレタモノハトハ゛ス
187.    SPX(I)=ASC(MID$(OP$(0),I*OPW-1,1))
188.    SPY(I)=ASC(MID$(OP$(1),I*OPW-1,1))
189.    SPF(I)=3
190.   @OPHSKIP
191.  NEXT
192. @OPMVSKIP
193. RETURN
194. 
195. ′---スフ゜ライトカキカエ
196. @SPWRITE
197. FOR J=0 TO SPCNT
198.  SN=J
199. ′PRINT ”DB ”,SPF(J),” ===”
200.  ON SPF(J) GOSUB @SPSKIP,@SPNEW,@SPNEW2,@SPMOVE,@SPMOVE2,@SPCHANG,@SPDEL
201. NEXT
202. RETURN
203. 
204. @SPSKIP  ′ナニモシナイ
205. ′シ゛ッサイニハココニハコナイ
206. ′PRINT ”DB SPSKIP”
207. RETURN
208. 
209. @SPNEW
210. SPSET SN,SPK(SN),SPP(SN),SPH(SN),SPV(SN),SPI(SN)
211. SON(SN)=1
212. ′SPF(SN)=-1
213. GOSUB @SPMOVE
214. RETURN
215. 
216. @SPNEW2
217. SPSET SN,SPK(SN),SPP(SN),SPH(SN),SPV(SN),SPI(SN)
218. SON(SN)=1
219. ′SPF(SN)=-1
220. GOSUB @SPMOVE
221. GOSUB @SPMOVE2
222. RETURN
223. 
224. @SPMOVE
225. SPOFS SN,SPX(SN),SPY(SN)
226. SPF(SN)=-1
227. RETURN
228. 
229. @SPMOVE2  ′ホカント゛ウサアリ
230. IF SPCHK(SN)==0 THEN SPOFS SN,SPX2(SN),SPY2(SN),SPA(SN)
231. ′SPOFS SN,SPX2(SN),SPY2(SN),SPA(SN)
232. SPF(SN)=-1
233. RETURN
234. 
235. @SPCHANG
236.  ′テストヨウ
237.  SPP(SN)=SPP(SN)+1
238.  IF SPP(SN)>15 THEN SPP(SN)=0
239. SPCHR SN,SPK(SN),SPP(SN),SPH(SN),SPV(SN),SPI(SN)
240. SPF(SN)=-1
241. RETURN
242. 
243. @SPDEL
244. SON(SN)=0
245. SPCLR SN
246. SPF(SN)=-1
247. RETURN
248. 
249. @LASER
250. FOR K=0 TO OPC
251.  IF LST(K,0)==0 GOTO @LANEXT
252.   ′フルイレ-サ゛-ヲケス
253.   ′ナカ゛サ0ナラフルイレ-サ゛-ハナイ
254.   IF LST(K,1)==0 GOTO @LASK1
255.    LEND=LST(K,2)+LST(K,1)
256.    IF LEND>255 THEN LEND=255
257.    GLINE LST(K,2),LST(K,3),LEND,LST(K,3),0
258.   @LASK1
259.   ′アタラシイレ-サ゛-
260.   ′ナカ゛サカ゛220ヲコケタフ゛ンハ スキマニナル
261.   LST(K,1)=LST(K,1)+15
262.   LST(K,2)=SPX(K)+28  ′(32-4)
263.   IF K!=0 THEN LST(K,2)=LST(K,2)-4
264.   LST(K,3)=SPY(K)+8
265.   IF LST(K,1)>220 THEN LST(K,2)=LST(K,2)+(LST(K,1)-220)
266.   IF LST(K,2)<=255 THEN GOTO @LDRAW
267.    ′カ゛メンカ゛イニテ゛タ
268.    LST(K,0)=0
269.    LST(K,1)=0
270.    GOTO @LANEXT
271.   @LDRAW
272.   LEND=LST(K,2)+LST(K,1)
273.   IF LEND>255 THEN LEND=255
274.   GLINE LST(K,2),LST(K,3),LEND,LST(K,3),6
275.   ′テキトノショウトツハンテイ
276.   II=EM0+EMC
277.   FOR I=EM0 TO II
278.    IF SON(I)==0 GOTO @ATASK
279.    ′イト゛ウチュウニ イロヲカエルト トマッテシマウ
280.    ′イト゛ウチュウノモノハ ココテ゛ ツ゛ョカ゛イ
281.    IF SPCHK(I)!=0 GOTO @ATASK
282.    IF SPHITRC(I,LST(K,2),LST(K,3)-4,LST(K,1),8) THEN SPF(I)=5
283.    @ATASK
284.   NEXT
285.  @LANEXT
286. NEXT
287. RETURN
288. 
289. 
290. ′--BGノショリ--
291. @BGSET ′BGニハイケイヲヒ゛ョウカ゛
292. BGPAGE 0
293. FOR I=0 TO 63
294.  FOR J=0 TO 23
295.   BGPUT 1,I,J,928,0,0,0 ′マックラ
296.   ′メント゛ウナノテ゛ランタ゛ムテ゛ホシヲタ゛ス
297.   RN1=RND(16)
298.   RN2=RND(2)
299.   IF RN2==0 THEN HOSHI=859 ELSE HOSHI=891
300.   IF RN1==0 THEN BGPUT 1,I,J,HOSHI,0,0,0
301.  NEXT
302. NEXT
303. RETURN
304. 
305. @BGSCR
306. IF BGCHK(1)!=0 GOTO @BGSSK  ′ホカンシ゛ョウタイナラ スキッフ゜
307.  BGOFS 1,0,0
308.  BGOFS 1,511,0,1024
309. @BGSSK
310. RETURN
311. 
312. ′--テキキャラ--
313. @TEKIINT  ′テキキャラシ゛ュンヒ゛
314. FOR I=0 TO 9
315.  SN=EM0+I
316.  SPK(SN)=174
317.  SPP(SN)=0
318.  SPH(SN)=0
319.  SPV(SN)=0
320.  SPI(SN)=2
321.  SPX(SN)=255
322.  SPY(SN)=18*I
323.  SPA(SN)=76
324.  SPX2(SN)=180
325.  SPY2(SN)=SPY(SN)
326.  SPF(SN)=-1
327.  SON(SN)=0
328. NEXT
329. EMC=10
330. SPCNT=EM0+EMC
331. RETURN
332. 
333. @TEKI  ′テキト゛ウサ
334.  ′シュツケ゛ン
335.  IF FRMCNT%10!=0 GOTO @TKSK1
336.   TID=FRMCNT/10
337.   IF TID==0 OR TID>10 GOTO @TKSK1
338.    SPF(EM0+TID-1)=2
339.    ′SON(EM0+TID-1)=1
340.  @TKSK1
341.  ′タイキャク SPK=174ノモノ
342.  IF FRMCNT==400 THEN GOSUB @TEKITAI
343.  ′ショキカ
344.  IF FRMCNT>511 THEN FRMCNT=0
345.  IF FRMCNT==0 THEN GOSUB @TEKIINT
346. RETURN
347. 
348. @TEKITAI ′テキタイキャクショリ
349.  FOR I=0 TO 9
350.   II=EM0+I
351.   SON(II)=0
352.   IF SPK(II)!=174 GOTO @TTSK1
353.    ′SPKカ゛174ノモノハ イキテイル
354.    SPX2(II)=256
355.    SPF(II)=4
356.   @TTSK1
357.  NEXT
358. RETURN
359. 
360. 

LASER31_1.jpg
LASER31_2.jpg
LASER31_3.jpg
LASER31_4.jpg
LASER31_5.jpg


Copyright (c) 1997-2020 Rakuten, Inc. All Rights Reserved.