HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1020
アイドルhspdxfix.asを使って複数弾をフラグで管理したい1解決


アイドル

リンク

2018/10/20(Sat) 18:36:28|NO.85623

お久しぶりです。アイドルです。


hspdxfix.asを使って複数弾をフラグ管理して、
フラグを初期化すると弾の座標が指定した通りの配置になりません。

フラグだとうまくいかないけど、タイムを使ってやるとうまくいきます。
コメントアウトしているところがタイム機能で、
タイム機能で処理を見たい場合はコメントアウトを外して、ソース上にある箇所でコメントアウトしてください。

「タイムがうまくいく理由」
全ての弾が自動削除されてから「if TEKI_TM_c(cnt) >= 100」が実行されるので全て配列座標から出現するから。


壮大に何かやらかしているか、とんでもない勘違いをしていると思うので、
くだらない原因だったとしても何が原因なのかわかる方いましたら教えてくださいませ。


 ■仕様■
・4つの弾は配列座標から出現して下方向に動く
・4つの弾は他の弾と同じX座標から出さない
・4つの弾は画面外(*1)に到達したら、配列座標から出現する
(*1:ここでは「TEKI_TM_y >= 300」とします)

そもそもなんでこんなことをやりたいかと言うと、
自機弾のサブウェポンから1発だけ弾を出して上に移動させて、画面外に行ったら弾を出したいと思ったからです。

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini 500,500,360 ;スプライトの最大数,キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 buffer 4 ; picload "jiki.bmp" es_buffer 4,,$00ff00,,1 es_size 17,17, 100 es_pat 60, 56,44 ;キャラクタNo,左上X座標,左上Y座標 ;弾 TEKI_MAX = 4 ;弾の最大数(4) dim TEKI_TM_f,TEKI_MAX ;弾フラグ dim TEKI_TM_x,TEKI_MAX ;弾X dim TEKI_TM_y,TEKI_MAX ;弾Y dim TEKI_TM_c,TEKI_MAX ;タイム ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TEKI_TM_x = 50,90,130,170 TEKI_TM_y = 150,190,150,190 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 420,50 : es_mes "TEKI_TM " + TEKI_TM pos 420,80 : es_mes "TEKI_TM_f(0) " + TEKI_TM_f(0) pos 420,100 : es_mes "TEKI_TM_f(1) " + TEKI_TM_f(1) pos 420,120 : es_mes "TEKI_TM_f(2) " + TEKI_TM_f(2) pos 420,140 : es_mes "TEKI_TM_f(3) " + TEKI_TM_f(3) pos 420,170 : es_mes "TEKI_TM_c(0) " + TEKI_TM_c(0) pos 420,190 : es_mes "TEKI_TM_c(1) " + TEKI_TM_c(1) pos 420,210 : es_mes "TEKI_TM_c(2) " + TEKI_TM_c(2) pos 420,230 : es_mes "TEKI_TM_c(3) " + TEKI_TM_c(3) ;************************************** gosub *弾の処理 es_sync ;画面更新 await 16 goto *メイン ;***********弾の処理********** *弾の処理 TEKI_pos_x = 380 ;弾のY座標(デバック用) TEKI_TM = 60 ;敵弾検索ID repeat 4 ;下のコメントアウトを外す場合 ↓ここから if TEKI_TM_f(cnt) = 0 { TEKI_TM_f(cnt) = 1 ;弾フラグを「立てる」 ;↑ここまで コメントアウトする /* TEKI_TM_c(cnt) += 1 ;敵タイム増加 if TEKI_TM_c(cnt) >= 100 { */ es_exnew TEKI_TM, 60,63 ;新規スプライト取得 es_set TEKI_TM, TEKI_TM_x(cnt),TEKI_TM_y(cnt),60 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,1 ,100 ;↓に移動 ; TEKI_TM_c(cnt) = 0 ;敵タイムクリア } ;上のコメントアウトを外す場合 ↓ここから es_get TEKI_TM_y,TEKI_TM,5 ;弾Yを取得する if TEKI_TM_y >= 300 { TEKI_TM_f(cnt) = 0 ;一番下まで行ったらフラグを「初期化」 es_kill TEKI_TM ;スプライトを削除する } ;↑ここまで コメントアウトする ;弾の座標を調べる(デバック用) TEKI_pos_x += 40 es_get TEKI_TM_pos_x,TEKI_TM,3 ;弾X es_get TEKI_TM_pos_y,TEKI_TM,5 ;弾Y pos 400,260 : es_mes "X" pos 400,280 : es_mes "Y" pos TEKI_pos_x,260 : es_mes " " + TEKI_TM_pos_x ;弾X pos TEKI_pos_x,280 : es_mes " " + TEKI_TM_pos_y ;弾Y TEKI_TM++ loop return



この記事に返信する


アイドル

リンク

2018/11/30(Fri) 07:45:53|NO.85903

少しお久しぶりです。
自己解決しました。


es_get TEKI_TM_y,TEKI_TM,5 ;弾Yを取得する
if TEKI_TM_y >= 300 {
ここで使っている変数名が他の変数名と同じだったことが原因でした。
いやはや・・・本当にやらかすとは・・・
まぁ、無事解決したので閉じます。


#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini 500,500,360 ;スプライトの最大数,キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 buffer 4 ; picload "jiki.bmp" es_buffer 4,,$00ff00,,1 es_size 17,17, 100 es_pat 60, 56,44 ;キャラクタNo,左上X座標,左上Y座標 ;弾 TEKI_MAX = 4 ;弾の最大数(4) dim TEKI_TM_f,TEKI_MAX ;弾フラグ dim TEKI_TM_x,TEKI_MAX ;弾X dim TEKI_TM_y,TEKI_MAX ;弾Y ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TEKI_TM_x = 50,90,130,170 TEKI_TM_y = 150,190,150,190 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 420,50 : es_mes "TEKI_TM " + TEKI_TM pos 420,80 : es_mes "TEKI_TM_f(0) " + TEKI_TM_f(0) pos 420,100 : es_mes "TEKI_TM_f(1) " + TEKI_TM_f(1) pos 420,120 : es_mes "TEKI_TM_f(2) " + TEKI_TM_f(2) pos 420,140 : es_mes "TEKI_TM_f(3) " + TEKI_TM_f(3) ;************************************** gosub *弾の処理 es_sync ;画面更新 await 16 goto *メイン ;***********弾の処理********** *弾の処理 TEKI_pos_x = 380 ;弾のY座標(デバック用) TEKI_TM = 60 ;敵弾検索ID repeat 4 if TEKI_TM_f(cnt) = 0 { TEKI_TM_f(cnt) = 1 ;弾フラグを「立てる」 es_exnew TEKI_TM, 60,63 ;新規スプライト取得 es_set TEKI_TM, TEKI_TM_x(cnt),TEKI_TM_y(cnt),60 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,1 ,100 ;↓に移動 } es_get TEKI_TM_pos_y,TEKI_TM,5 ;弾Yを取得する if TEKI_TM_pos_y >= 300 { TEKI_TM_f(cnt) = 0 ;一番下まで行ったらフラグを「初期化」 es_kill TEKI_TM ;スプライトを削除する } ;弾の座標を調べる(デバック用) TEKI_pos_x += 40 es_get TEKI_TM_pos_x,TEKI_TM,3 ;弾X es_get TEKI_TM_pos_y,TEKI_TM,5 ;弾Y pos 400,260 : es_mes "X" pos 400,280 : es_mes "Y" pos TEKI_pos_x,260 : es_mes " " + TEKI_TM_pos_x ;弾X pos TEKI_pos_x,280 : es_mes " " + TEKI_TM_pos_y ;弾Y TEKI_TM++ loop return



ONION software Copyright 1997-2023(c) All rights reserved.