|
|
|
2014/4/26(Sat) 16:52:03|NO.61695
mainobjが荒ぶるのですが、直すにはどうすればいいか分かりません。
どうか、教えていただけると助かります
pre
#include obaq.as
#define wxs 760.0 ; wxs = 画面の横の長さ
#define wys 400.0 ; wys = 画面の縦の長さ
#define cxs 32.0 ; cxs = 画像を縦に分割する長さ
#define cys 32.0 ; cys = 画像を横に分割する長さ
ステータス画面1
screen 0,350,240,0,5,5 title Status Window(enemy)
ステータス画面2
screen 3,350,40,0,0,277 title Status Window(player)
obaq画面
screen 2,wxs,wys,0,365.0,0 title obaq Window
変数初期化
px = 160 py = 80 ; 赤い点のオブジェクトの座標
px_e = 0.0 py_e = 0.0 ; オブジェクト座標変換用
pspeed = 0.3 pspeed0 = -0.3 ; pspeed = 本体の速さ
オブジェクト管理用変数
内訳
(0) = フラグ
(1) = オブジェクトID
(2) = 座標x(画面)
(3) = 座標y(画面)
(4) = 角度(内部)
ddim obj ,5 ,16
repeat length2(obj)
obj(0,cnt) = -1.0 ,0.0 ,0.0 ,0.0 ,0.0
loop
obaq システム設定
qreset
qborder -96.0 ,-51.0 ,106.0 ,51.0 ; 横幅の右側のみサイズ可変
qgravity 0.0 ,0.0
赤いオブジェクト(発射地点表示)
qcnvaxis px_e ,py_e ,px ,py ,1 座標変換 画面座標から obaq 座標に変換
qaddpoly mainobj ,4 ,px_e ,py_e ,0.0 ,5.0 ,5.0 ,0 ,1 ,2
qtype mainobj ,type_bindR
メインループ開始
main
qgetpos mainobj ,px ,py ,pr
qcnvaxis px_e ,py_e ,px ,py ,1
qgetspeed mainobj ,pxsp ,pysp ,prsp
time++
キー入力処理
gosub key_input
赤い点のオブジェクトから
if ((ky&16)!0)&(time20 = 0) { gosub objcreate }
オブジェクト範囲外処理
gosub object_out_of_range
gosub mainobject_out_of_range
qexec
gosub ObjectExec オブジェクトデータ管理更新
gosub status_enemy_window_redraw
gosub status_player_window_redraw
redraw 0
color boxf
qdraw 0
redraw 1
await 16
goto main
キー入力処理
key_input
stick ky,31
if ky&128 { end }
if ( px = 3 )&( px = 185 )&( py = 3 )&( py = 97 ){
if ky&1 {
qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,1
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&2 {
qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&4 {
qspeed mainobj ,pspeed ,0.0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&8 {
qspeed mainobj ,0.0 ,pspeed ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
}
if ( (ky&1)=0 )&( (ky&2)=0 )&( (ky&4)=0 )&( (ky&8)=0 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
}
return
ステータスウィンドウ1の更新
status_enemy_window_redraw
gsel 0
redraw 0
color boxf color ,255
pos 0,0 mesID
pos 80,0 mesX座標
pos 170,0 mes Y座標
pos 260,0 mes 角度(ラジアン)
line 0,18,350,18
line 0,220,350,220
pos 0,222 mes オブジェクト管理有効最大数 +ActiveObjectMax+ (+length2(obj)+)
chc = 0
repeat length2(obj)
表示の座標・角度はすべて内部座標です。
if ( obj(0,cnt) = -1) { continue }
pos 0,chc20+20 mes (+cnt+) +int(obj(1,cnt))
pos 80,chc20+20 mes +obj(2,cnt)
pos 170,chc20+20 mes +obj(3,cnt)
pos 260,chc20+20 mes +obj(4,cnt)
chc++
if chc = 10 { break }
loop
redraw 1
gsel 2
return
ステータスウィンドウ2の更新
status_player_window_redraw
gsel 3
redraw 0
color boxf color ,255
pos 0, 0 mesID
pos 80 ,0 mesX座標
pos 170 ,0 mes Y座標
pos 260 ,0 mes 角度(ラジアン)
line 0 ,18 ,350 ,18
pos 0,20 mes mainobj
pos 80,20 mes px
pos 170 ,20 mes py
pos 260 ,20 mes 0.0
redraw 1
gsel 2
return
オブジェクト管理データを更新
ObjectExec
ActiveObjectMax = 0
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { continue }
qgetpos int(obj(1,cnt)) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
ActiveObjectMax++
loop
return
オブジェクト管理から空きを探す
ObjectEmpty
TrueEmpty = -1
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { TrueEmpty = cnt break }
loop
if ( TrueEmpty != -1 ) { return }
obj(0,length2(obj)) = -1.0 ,0.0 ,0.0 ,0.0, 0.0
TrueEmpty = length2(obj) - 1
return
緑のオブジェクトの生成と発射処理
objcreate
gosub ObjectEmpty
qcnvaxis px_e ,py_e ,px ,py ,1
_TempObj = -1
qaddpoly _TempObj ,4 ,px ,py , ,5 ,5 , ,2 ,1 ; 出現処理(チェックを含む為、一時的にIDを格納)
if _TempObj 0 { return }
obj(0,TrueEmpty) = 1.0 ,double(_TempObj) ,px_e ,py_e ,0.0
弾のタイプ
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindY
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindR
qpush int(obj(1,TrueEmpty)) , , ,7.5 ,0 ; オブジェクトの射出スピードを指定
return
object_out_of_range
repeat length2(obj)
if ( obj(0,cnt) = -1.0) { continue }
qgetpos obj(1,cnt) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
if ( obj(2,cnt) = 190.0 ) { qdel int(obj(1,cnt)) obj(0,cnt) = -1.0 } 画面座標 x.760 を超えると消去
loop
return
mainobject_out_of_range
if ( px 3 )( px 185 )( py 3 )( py 97 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
if ( px 3 ) { qpos mainobj ,3 ,py ,0.0 }
if ( px 185 ) { qpos mainobj ,185 ,py ,0.0 }
if ( py 3 ) { qpos mainobj ,px ,3 ,0.0 }
if ( py 97 ) { qpos mainobj ,px ,97 ,0.0 }
return
pre
| |
|
2014/4/26(Sat) 16:53:16|NO.61696
書き直し
|
|
2014/4/26(Sat) 16:54:49|NO.61697
ソース
#include obaq.as
#define wxs 760.0 ; wxs = 画面の横の長さ
#define wys 400.0 ; wys = 画面の縦の長さ
#define cxs 32.0 ; cxs = 画像を縦に分割する長さ
#define cys 32.0 ; cys = 画像を横に分割する長さ
ステータス画面1
screen 0,350,240,0,5,5 title Status Window(enemy)
ステータス画面2
screen 3,350,40,0,0,277 title Status Window(player)
obaq画面
screen 2,wxs,wys,0,365.0,0 title obaq Window
変数初期化
px = 160 py = 80 ; 赤い点のオブジェクトの座標
px_e = 0.0 py_e = 0.0 ; オブジェクト座標変換用
pspeed = 0.3 pspeed0 = -0.3 ; pspeed = 本体の速さ
オブジェクト管理用変数
内訳
(0) = フラグ
(1) = オブジェクトID
(2) = 座標x(画面)
(3) = 座標y(画面)
(4) = 角度(内部)
ddim obj ,5 ,16
repeat length2(obj)
obj(0,cnt) = -1.0 ,0.0 ,0.0 ,0.0 ,0.0
loop
obaq システム設定
qreset
qborder -96.0 ,-51.0 ,106.0 ,51.0 ; 横幅の右側のみサイズ可変
qgravity 0.0 ,0.0
赤いオブジェクト(発射地点表示)
qcnvaxis px_e ,py_e ,px ,py ,1 座標変換 画面座標から obaq 座標に変換
qaddpoly mainobj ,4 ,px_e ,py_e ,0.0 ,5.0 ,5.0 ,0 ,1 ,2
qtype mainobj ,type_bindR
メインループ開始
main
qgetpos mainobj ,px ,py ,pr
qcnvaxis px_e ,py_e ,px ,py ,1
qgetspeed mainobj ,pxsp ,pysp ,prsp
time++
キー入力処理
gosub key_input
赤い点のオブジェクトから
if ((ky&16)!0)&(time20 = 0) { gosub objcreate }
オブジェクト範囲外処理
gosub object_out_of_range
gosub mainobject_out_of_range
qexec
gosub ObjectExec オブジェクトデータ管理更新
gosub status_enemy_window_redraw
gosub status_player_window_redraw
redraw 0
color boxf
qdraw 0
redraw 1
await 16
goto main
キー入力処理
key_input
stick ky,31
if ky&128 { end }
if ( px = 3 )&( px = 185 )&( py = 3 )&( py = 97 ){
if ky&1 {
qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,1
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&2 {
qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&4 {
qspeed mainobj ,pspeed ,0.0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&8 {
qspeed mainobj ,0.0 ,pspeed ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
}
if ( (ky&1)=0 )&( (ky&2)=0 )&( (ky&4)=0 )&( (ky&8)=0 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
}
return
ステータスウィンドウ1の更新
status_enemy_window_redraw
gsel 0
redraw 0
color boxf color ,255
pos 0,0 mesID
pos 80,0 mesX座標
pos 170,0 mes Y座標
pos 260,0 mes 角度(ラジアン)
line 0,18,350,18
line 0,220,350,220
pos 0,222 mes オブジェクト管理有効最大数 +ActiveObjectMax+ (+length2(obj)+)
chc = 0
repeat length2(obj)
表示の座標・角度はすべて内部座標です。
if ( obj(0,cnt) = -1) { continue }
pos 0,chc20+20 mes (+cnt+) +int(obj(1,cnt))
pos 80,chc20+20 mes +obj(2,cnt)
pos 170,chc20+20 mes +obj(3,cnt)
pos 260,chc20+20 mes +obj(4,cnt)
chc++
if chc = 10 { break }
loop
redraw 1
gsel 2
return
ステータスウィンドウ2の更新
status_player_window_redraw
gsel 3
redraw 0
color boxf color ,255
pos 0, 0 mesID
pos 80 ,0 mesX座標
pos 170 ,0 mes Y座標
pos 260 ,0 mes 角度(ラジアン)
line 0 ,18 ,350 ,18
pos 0,20 mes mainobj
pos 80,20 mes px
pos 170 ,20 mes py
pos 260 ,20 mes 0.0
redraw 1
gsel 2
return
オブジェクト管理データを更新
ObjectExec
ActiveObjectMax = 0
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { continue }
qgetpos int(obj(1,cnt)) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
ActiveObjectMax++
loop
return
オブジェクト管理から空きを探す
ObjectEmpty
TrueEmpty = -1
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { TrueEmpty = cnt break }
loop
if ( TrueEmpty != -1 ) { return }
obj(0,length2(obj)) = -1.0 ,0.0 ,0.0 ,0.0, 0.0
TrueEmpty = length2(obj) - 1
return
緑のオブジェクトの生成と発射処理
objcreate
gosub ObjectEmpty
qcnvaxis px_e ,py_e ,px ,py ,1
_TempObj = -1
qaddpoly _TempObj ,4 ,px ,py , ,5 ,5 , ,2 ,1 ; 出現処理(チェックを含む為、一時的にIDを格納)
if _TempObj 0 { return }
obj(0,TrueEmpty) = 1.0 ,double(_TempObj) ,px_e ,py_e ,0.0
弾のタイプ
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindY
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindR
qpush int(obj(1,TrueEmpty)) , , ,7.5 ,0 ; オブジェクトの射出スピードを指定
return
object_out_of_range
repeat length2(obj)
if ( obj(0,cnt) = -1.0) { continue }
qgetpos obj(1,cnt) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
if ( obj(2,cnt) = 190.0 ) { qdel int(obj(1,cnt)) obj(0,cnt) = -1.0 } 画面座標 x.760 を超えると消去
loop
return
mainobject_out_of_range
if ( px 3 )( px 185 )( py 3 )( py 97 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
if ( px 3 ) { qpos mainobj ,3 ,py ,0.0 }
if ( px 185 ) { qpos mainobj ,185 ,py ,0.0 }
if ( py 3 ) { qpos mainobj ,px ,3 ,0.0 }
if ( py 97 ) { qpos mainobj ,px ,97 ,0.0 }
return
| |
|
2014/4/26(Sat) 17:50:21|NO.61698
"(ダブルクオーテーション)や*(アスタリスク)、:(コロン)
がないのはなんででしょう?
動くように修正するだけですごい手間です(´・ω・`)
|
|
2014/4/26(Sat) 17:53:49|NO.61699
入れるべき記号(;:")が入っていない箇所が多数あります。
少しならこちらで修正して調べてみようと思ったのですが、さすがに多すぎてだめでした。
ソースコピペで実行できる形に修正していただけないでしょうか。
|
|
2014/4/26(Sat) 18:59:06|NO.61700
パターンが決まっていれば正規表現置換でなんとか……なりませんでした(´・ω・`)
とりあえず手直し+αしたものを置いておきますね
// プリプロセッサ
#include "obaq.as"
#define wxs 760.0 ;画面の横の長さ
#define wys 400.0 ;画面の縦の長さ
#define cxs 32.0 ;画像を縦に分割する長さ
#define cys 32.0 ;画像を横に分割する長さ
// 画面作成
screen 0, 350, 240, 0, 5, 5 :title "Status Window(enemy)" ;ステータス画面1
screen 3, 350, 40, 0, 0, 277 :title "Status Window(player)";ステータス画面2
screen 2, wxs, wys, 0, 365.0, 0 :title "obaq Window" ;obaq画面
;【ミス】11行目で「365.0」と小数点を付ける必要はない
// 変数初期化
px = 160 :py = 80 ;赤い点のオブジェクトの座標
px_e = 0.0 :py_e = 0.0 ;オブジェクト座標変換用
pspeed = 0.3 :pspeed0 = -0.3 ;本体の速さ
// オブジェクト管理用変数
/* 内訳
(0) = フラグ
(1) = オブジェクトID
(2) = 座標x(画面)
(3) = 座標y(画面)
(4) = 角度(内部)
*/
ddim obj ,5 ,16
repeat length2(obj)
obj(0, cnt) = -1.0, 0.0, 0.0, 0.0, 0.0
loop
// obaq システム設定
qreset
qborder -96.0 ,-51.0 ,106.0 ,51.0 ;横幅の右側のみサイズ可変
qgravity 0.0 ,0.0
// 赤いオブジェクト(発射地点表示)
qcnvaxis px_e ,py_e ,px ,py ,1 ;画面座標からobaq座標に変換
qaddpoly mainobj ,4 ,px_e ,py_e ,0.0 ,5.0 ,5.0 ,0 ,1 ,2
qtype mainobj ,type_bindR
// メインループ開始
*main
qgetpos mainobj ,px ,py ,pr
qcnvaxis px_e ,py_e ,px ,py ,1
qgetspeed mainobj ,pxsp ,pysp ,prsp
time++
// キー入力処理
gosub *key_input
// 赤い点のオブジェクトから
if(((ky & 16) != 0) && (time20 == 0)) :gosub *objcreate
// オブジェクト範囲外処理
gosub *object_out_of_range
gosub *mainobject_out_of_range
qexec
gosub *ObjectExec ;オブジェクトデータ管理更新
gosub *status_enemy_window_redraw
gosub *status_player_window_redraw
redraw 0
color :boxf
qdraw 0
redraw 1
await 16
goto *main
// キー入力処理
*key_input
stick ky, 31
if(ky & 128) :end
if((px == 3) && (px == 185) && (py == 3) && (py == 97)){ ;【ミス】矛盾した論理式
if(ky & 1){
qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,1
if(ky & 2) :qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0
if(ky & 4) :qspeed mainobj ,pspeed ,0.0 ,0.0 ,0
if(ky & 8) :qspeed mainobj ,0.0 ,pspeed ,0.0 ,0
}
if(ky & 2){
qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,1
if(ky & 1) :qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0
if(ky & 4) :qspeed mainobj ,pspeed ,0.0 ,0.0 ,0
if(ky & 8) :qspeed mainobj ,0.0 ,pspeed ,0.0 ,0
}
if(ky & 4){
qspeed mainobj ,pspeed ,0.0 ,0.0 ,1
if(ky & 1) :qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0
if(ky & 2) :qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0
if(ky & 8) :qspeed mainobj ,0.0 ,pspeed ,0.0 ,0
}
if(ky & 8){
qspeed mainobj ,0.0 ,pspeed ,0.0 ,1
if(ky & 1) :qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0
if(ky & 2) :qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0
if(ky & 4) :qspeed mainobj ,pspeed ,0.0 ,0.0 ,0
}
if(((ky & 1) == 0) && ((ky & 2) == 0) && ((ky & 4) == 0) && ((ky & 8) == 0)) :qspeed mainobj ,0.0 ,0.0 ,0.0 ,1
}
return
// ステータスウィンドウ1の更新
*status_enemy_window_redraw
gsel 0
redraw 0
color :boxf :color ,,255
pos 0, 0 :mes "ID"
pos 80, 0 :mes "X座標"
pos 170, 0 :mes "Y座標"
pos 260, 0 :mes "角度(ラジアン)"
line 0, 18, 350, 18
line 0, 220, 350, 220
pos 0,222 :mes "オブジェクト管理有効最大数 " + ActiveObjectMax +" (" + length2(obj) + ")"
chc = 0
repeat length2(obj)
// 表示の座標・角度はすべて内部座標です。
if(obj(0, cnt) == -1) :continue
pos 0, chc20 + 20 :mes "(" + cnt + ") " + int(obj(1,cnt)) ;【疑問】intにする意味は?
pos 80, chc20 + 20 :mes "" + obj(2, cnt) ;【疑問】"" + を付ける意味は?
pos 170, chc20 + 20 :mes "" + obj(3, cnt)
pos 260, chc20 + 20 :mes "" + obj(4, cnt)
chc++
if(chc == 10) :break
loop
redraw 1
gsel 2
return
// ステータスウィンドウ2の更新
*status_player_window_redraw
gsel 3
redraw 0
color :boxf :color ,,255
pos 0, 0 :mes "ID"
pos 80 ,0 :mes "X座標"
pos 170 ,0 :mes "Y座標"
pos 260 ,0 :mes "角度(ラジアン)"
line 0 ,18 ,350 ,18
pos 0, 20 :mes mainobj
pos 80, 20 :mes px
pos 170 ,20 :mes py
pos 260 ,20 :mes 0.0 ;【疑問】引用符で囲っていない?
redraw 1
gsel 2
return
// オブジェクト管理データを更新
*ObjectExec
ActiveObjectMax = 0
repeat length2(obj)
if(obj(0, cnt) == -1.0) :continue
qgetpos int(obj(1, cnt)), obj(2,cnt), obj(3,cnt), obj(4,cnt)
ActiveObjectMax++
loop
return
// オブジェクト管理から空きを探す
*ObjectEmpty
TrueEmpty = -1
repeat length2(obj)
if(obj(0, cnt) == -1.0) :TrueEmpty = cnt :break
loop
if(TrueEmpty != -1) :return
obj(0, length2(obj)) = -1.0 ,0.0 ,0.0 ,0.0, 0.0 ;【疑問】これって初期化しているの?
TrueEmpty = length2(obj) - 1
return
// 緑のオブジェクトの生成と発射処理
*objcreate
gosub *ObjectEmpty
qcnvaxis px_e, py_e, px, py, 1
_TempObj = -1
qaddpoly _TempObj, 4, px, py,, 5, 5,, 2, 1 ;出現処理(チェックを含む為、一時的にIDを格納)
if(_TempObj 0) :return ;【ミス】比較演算子が抜けている
obj(0, TrueEmpty) = 1.0, double(_TempObj), px_e, py_e, 0.0
// 弾のタイプ
qtype int(obj(1, TrueEmpty)), type_bindY
qtype int(obj(1, TrueEmpty)), type_bindR
qpush int(obj(1, TrueEmpty)),,, 7.5, 0 ;オブジェクトの射出スピードを指定
return
*object_out_of_range
repeat length2(obj)
if(obj(0, cnt) == -1.0) :continue
qgetpos obj(1, cnt), obj(2, cnt), obj(3, cnt), obj(4, cnt)
if(obj(2, cnt) == 190.0) :qdel int(obj(1, cnt)) :obj(0, cnt) = -1.0 ;画面座標 x.760 を超えると消去
loop
return
*mainobject_out_of_range ;【ミス】比較演算子が抜けまくっている
if((px 3) (px 185) (py 3) (py 97)) :qspeed mainobj, 0.0, 0.0, 0.0, 1
if(px 3) :qpos mainobj, 3, py ,0.0
if(px 185) :qpos mainobj, 185, py ,0.0
if(py 3) :qpos mainobj, px, 3 ,0.0
if(py 97) :qpos mainobj, px, 97 ,0.0
return
| |
|
2014/4/27(Sun) 03:06:48|NO.61703
すみません(;ω;)
私がソースをあげたあとに確認し損ねてたのが悪かったです
そのせいで、まるで穴埋め問題みたいになってしまいました
あと、:は基本{}で書いてます。
>>obj(0,length2(obj)) = -1.0 ,0.0 ,0.0 ,0.0, 0.0 ;>>【疑問】これって初期化しているの?
Ans.はい、そのつもりです。
#include "obaq.as"
#define wxs 760.0 ; wxs = 画面の横の長さ
#define wys 400.0 ; wys = 画面の縦の長さ
#define cxs 32.0 ; cxs = 画像を縦に分割する長さ
#define cys 32.0 ; cys = 画像を横に分割する長さ
//ステータス画面1
screen 0,350,240,0,5,5 : title "Status Window(enemy)"
//ステータス画面2
screen 3,350,40,0,0,277 : title "Status Window(player)"
//obaq画面
screen 2,wxs,wys,0,365,0 : title "obaq Window"
//画像を読み込み
celload "images\\dotcg_n02.bmp",1 ; 自機&敵機の画像をロードする
celdiv 1,cxs,cys,cxs/2,cys/2
//変数初期化
px = 160 : py = 80 ; 赤い点のオブジェクトの座標
px_e = 0.0 : py_e = 0.0 ; オブジェクト座標変換用
pspeed = 0.3 : pspeed0 = -0.3 ; pspeed = 本体の速さ
//オブジェクト管理用変数
//内訳
//(0) = フラグ
//(1) = オブジェクトID
//(2) = 座標x(画面)
//(3) = 座標y(画面)
//(4) = 角度(内部)
ddim obj ,5 ,16
repeat length2(obj)
obj(0,cnt) = -1.0 ,0.0 ,0.0 ,0.0 ,0.0
loop
//obaq システム設定
qreset
qborder -96.0 ,-51.0 ,106.0 ,51.0 ; 横幅の右側のみサイズ可変
qgravity 0.0 ,0.0
//赤いオブジェクト(発射地点表示)
qcnvaxis px_e ,py_e ,px ,py ,1 //座標変換 : 画面座標から obaq 座標に変換
qaddpoly mainobj ,4 ,px_e ,py_e ,0.0 ,5.0 ,5.0 ,0 ,1 ,2
qtype mainobj ,type_bindR
//メインループ開始
*main
qgetpos mainobj ,px ,py ,pr
qcnvaxis px_e ,py_e ,px ,py ,1
qgetspeed mainobj ,pxsp ,pysp ,prsp
time++
//キー入力処理
gosub *key_input
//赤い点のオブジェクトから
if ((ky&16)!0)&(time\20 = 0) { gosub *objcreate }
//オブジェクト範囲外処理
gosub *object_out_of_range
gosub *mainobject_out_of_range
qexec
gosub *ObjectExec //オブジェクトデータ管理更新
gosub *status_enemy_window_redraw
gosub *status_player_window_redraw
redraw 0
color : boxf
qdraw 0
redraw 1
await 16
goto *main
//キー入力処理
*key_input
stick ky,31
if ky&128 { end }
if ( px >= 3 )&( px <= 185 )&( py >= 3 )&( py <= 97 ){
if ky&1 {
qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,1
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&2 {
qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&4 {
qspeed mainobj ,pspeed ,0.0 ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&8 { qspeed mainobj ,0.0 ,pspeed ,0.0 ,0 }
}
if ky&8 {
qspeed mainobj ,0.0 ,pspeed ,0.0 ,1
if ky&1 { qspeed mainobj ,pspeed0 ,0.0 ,0.0 ,0 }
if ky&2 { qspeed mainobj ,0.0 ,pspeed0 ,0.0 ,0 }
if ky&4 { qspeed mainobj ,pspeed ,0.0 ,0.0 ,0 }
}
if ( (ky&1)=0 )&( (ky&2)=0 )&( (ky&4)=0 )&( (ky&8)=0 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
}
return
//ステータスウィンドウ1の更新
*status_enemy_window_redraw
gsel 0
redraw 0
color : boxf : color ,255
pos 0,0 : mes"ID"
pos 80,0 : mes"X座標"
pos 170,0 : mes "Y座標"
pos 260,0 : mes "角度(ラジアン)"
line 0,18,350,18
line 0,220,350,220
pos 0,222 : mes "オブジェクト管理有効最大数 : "+ActiveObjectMax+" ("+length2(obj)+")"
chc = 0
repeat length2(obj)
//表示の座標・角度はすべて内部座標です。
if ( obj(0,cnt) = -1) { continue }
pos 0,chc*20+20 : mes "("+cnt+") : "+int(obj(1,cnt))
pos 80,chc*20+20 : mes ""+obj(2,cnt)
pos 170,chc*20+20 : mes ""+obj(3,cnt)
pos 260,chc*20+20 : mes ""+obj(4,cnt)
chc++
if chc >= 10 { break }
loop
redraw 1
gsel 2
return
//ステータスウィンドウ2の更新
*status_player_window_redraw
gsel 3
redraw 0
color : boxf : color ,255
pos 0, 0 : mes"ID"
pos 80 ,0 : mes"X座標"
pos 170 ,0 : mes "Y座標"
pos 260 ,0 : mes "角度(ラジアン)"
line 0 ,18 ,350 ,18
pos 0,20 : mes "mainobj"
pos 80,20 : mes px
pos 170 ,20 : mes py
pos 260 ,20 : mes 0.0
redraw 1
gsel 2
return
//オブジェクト管理データを更新
*ObjectExec
ActiveObjectMax = 0
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { continue }
qgetpos int(obj(1,cnt)) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
ActiveObjectMax++
loop
return
//オブジェクト管理から空きを探す
*ObjectEmpty
TrueEmpty = -1
repeat length2(obj)
if ( obj(0,cnt) = -1.0 ) { TrueEmpty = cnt : break }
loop
if ( TrueEmpty ! -1 ) { return }
obj(0,length2(obj)) = -1.0 ,0.0 ,0.0 ,0.0, 0.0 ;>>【疑問】これって初期化しているの?
TrueEmpty = length2(obj) - 1
return
//緑のオブジェクトの生成と発射処理
*objcreate
gosub *ObjectEmpty
qcnvaxis px_e ,py_e ,px ,py ,1
_TempObj = -1
qaddpoly _TempObj ,4 ,px ,py , ,5 ,5 , ,2 ,1 ; 出現処理(チェックを含む為、一時的にIDを格納)
if _TempObj < 0 { return }
obj(0,TrueEmpty) = 1.0 ,double(_TempObj) ,px_e ,py_e ,0.0
//弾のタイプ
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindY
qtype int(obj ( 1 ,TrueEmpty ) ) ,type_bindR
qpush int(obj(1,TrueEmpty)) , , ,7.5 ,0 ; オブジェクトの射出スピードを指定
return
*object_out_of_range
repeat length2(obj)
if ( obj(0,cnt) = -1.0) { continue }
qgetpos obj(1,cnt) ,obj(2,cnt) ,obj(3,cnt) ,obj(4,cnt)
if ( obj(2,cnt) >= 190.0 ) { qdel int(obj(1,cnt)) : obj(0,cnt) = -1.0 } // 画面座標 x.760 を超えると消去
loop
return
*mainobject_out_of_range
if ( px < 3 )|( px > 185 )|( py < 3 )|( py > 97 ) { qspeed mainobj ,0.0 ,0.0 ,0.0 ,1 }
if ( px < 3 ) { qpos mainobj ,3 ,py ,0.0 }
if ( px > 185 ) { qpos mainobj ,185 ,py ,0.0 }
if ( py < 3 ) { qpos mainobj ,px ,3 ,0.0 }
if ( py > 97 ) { qpos mainobj ,px ,97 ,0.0 }
return
| |
|
2014/4/27(Sun) 10:36:14|NO.61704
画像がないから動かないという事は置いておくとして
キー入力部分をこういう風にしてみるとか。
//キー入力処理
*key_input
pspeedx = 0.0 : pspeedy = 0.0
stick ky,31
if ky&128 { end }
if px >= 4 : if ky&1 : pspeedx - pspeed
if px <= 184 :if ky&4 : pspeedx + pspeed
if py >= 5 :if ky&2 : pspeedy - pspeed
if py <= 95 :if ky&8 : pspeedy + pspeed
qspeed mainobj ,pspeedx ,pspeedy ,0.0 ,1
return
|
|
2014/4/27(Sun) 12:14:46|NO.61705
ありさんありがとうございます。
おかげで、端でちゃんと止まるようになりました。
本当にありがとうございます。
|
|