ズブの初心者がゲーム作れるまで勉強するスレ
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。
01/11/07 20:26ID:PFtlmWD9ズブの初心者以外お断りです。
なおアドバイス等はプロのかたでも結構です。
初心者は聞く耳を持ちプロもわかりやすく教えてやってください。
0813名前は開発中のものです。
2006/03/14(火) 00:31:13ID:gjKc/A8Oマウス座標はwait等でOSにタスクを移した時にmousex,yに代入される
clsは画面だけでなく他の情報もクリアされる
801の場合
await 1 ;マウス座標収得
cls ;マウス座標クリア
当然mousexは0
画面クリアを他の命令で行うか、clsの後にawait 0にする
しかし、clsを使う場合はclsからawait中にマウスの動きが無い場合
マウス座標収得はできない
0814名前は開発中のものです。
2006/03/14(火) 00:36:39ID:gAnxDyH2「設計」って言葉の意味がわからない。
そんなオレのプログラムはいつも途中で破綻しちゃうのさ・・
0815名前は開発中のものです。
2006/03/14(火) 14:18:43ID:cumlLL/Uメインループにあれもこれも積んで
1フレーム中にすごい数の処理をするようになってしまいました
必要な時に呼び出すタスクシステムってのを見たんですが
むずいですね・・・
あまりにソースがごちゃごちゃなんで今1から作り直してます・・
0816名前は開発中のものです。
2006/03/14(火) 20:16:51ID:BjyEc4sd設計図=フローチャートや変数表とか?UMLってやつもそうなのかな
だいたいこんな理解だ
0817名前は開発中のものです。
2006/03/14(火) 20:55:57ID:BjyEc4sdscreen 1,640,480,2
//自機
screen 2,32,32,2
picload "jiki.bmp",2
//敵機
screen 3,128,128,2
picload "teki.bmp",2
//変数
cx=320
cy=400
cx_min=0
cx_max=640-128
tx=100
ty=32
tx_min=0
tx_max=640-128
tx_speed=8
tx_dir=tx_speed
0818名前は開発中のものです。
2006/03/14(火) 20:56:28ID:BjyEc4sdcls 4
repeat
//敵を動かす
tx=tx+tx_dir
if tx>tx_max : tx_dir=-1*tx_speed : ty=ty+8
if tx<tx_min : tx_dir= tx_speed : ty=ty+8
//裏画面を作る
gsel 1,-1
cls 4
await 1
pos cx,cy: gcopy 2, 0,0
pos tx,ty:gcopy 3, 0,0,128,128
//表画面へコピー
gsel 0,1
pos 0,0: gcopy 1,0,0,640,480
loop
0819名前は開発中のものです。
2006/03/14(火) 21:02:21ID:BjyEc4sdやっぱ作りながら覚えるのがプログラミングですよね
昨日教えてもらった命令を使ってチラツキ対策完了
敵が左右に動くところまで作った
次は自機の操作を作ってくる
0820名前は開発中のものです。
2006/03/14(火) 21:26:18ID:BjyEc4sdstick keyboard,15,1
switch keyboard
case 1
cx=cx-cx_speed
swbreak
case 4
cx=cx+cx_speed
swbreak
case 64
if benable=0 {
benable=1
bx=cx+16
by=cy
}
swend
if cx>cx_max : cx=cx-cx_speed
if cx<cx_min : cx=cx+cx_speed
//自機弾
if benable=1 {
by=by-bspeed
if by<0 : benable=0
}
0821名前は開発中のものです。
2006/03/14(火) 21:33:19ID:BjyEc4sdhttp://gamdev.org/up/img/5002.jpg
ゲームっぽいふいんき(なぜか変換できない)になってきた
移動中に攻撃(なぜか反応しない)のバグがある
弾や敵をいっぱい出す方法を考え中
>>815で話題にでてたタスクシステムって奴を勉強しないといけないのか……
0822名前は開発中のものです。
2006/03/14(火) 23:19:42ID:BjyEc4sdscreen 1,640,480,2
//自機
screen 2,32,32,2
picload "jiki.bmp",2
//敵機
screen 3,128,128,2
picload "teki.bmp",2
//変数
cx=320
cy=400
cx_min=0
cx_max=640-32
cx_speed=4
tx=100
ty=32
tx_min=0
tx_max=640-128
tx_speed=8
tx_dir=tx_speed
dim bx,10
dim by,10
dim bspeed,10
dim blength,10
dim benable,10
0823名前は開発中のものです。
2006/03/14(火) 23:20:26ID:BjyEc4sdbspeed.i=16
blength.i=16
benable.i=0
next
screen 0,640,480
cls 4
repeat
//敵を動かす
tx=tx+tx_dir
if tx>tx_max : tx_dir=-1*tx_speed : ty=ty+8
if tx<tx_min : tx_dir= tx_speed : ty=ty+8
//自機操作
stick keyboard,15,1
switch keyboard
case 1
cx=cx-cx_speed
swbreak
case 4
cx=cx+cx_speed
swbreak
case 64
for i, 0, 10
if benable.i=0 {
benable.i=1
bx.i=cx+16
by.i=cy
goto *fire_end
}
0824名前は開発中のものです。
2006/03/14(火) 23:20:57ID:BjyEc4sd*fire_end
swend
if cx>cx_max : cx=cx-cx_speed
if cx<cx_min : cx=cx+cx_speed
//自機弾
for i,0,10
if benable.i=1 {
by.i=by.i-bspeed
if by.i<0 : benable.i=0
}
next
//裏画面を作る
gsel 1,-1
cls 4
await 1
pos cx,cy: gcopy 2, 0,0
pos tx,ty:gcopy 3, 0,0,128,128
for i,0,10
if benable.i=1 : color 255,255,255: line bx.i, by.i, bx.i, by.i+blength.i
next
//表画面へコピー
gsel 0,1
pos 0,0: gcopy 1,0,0,640,480
loop
0825名前は開発中のものです。
2006/03/14(火) 23:45:46ID:BjyEc4sd配列確保して弾を使い終わったらフラグをオフにしてる
ソース
>>822-824
最高何発まで出せるかが配列に制限される
これをなんとかしたい
案1.配列をたくさん確保しておく
何の解決にもなってないけど今の知識では現実的な妥協点
メリット:実現の目処が立っている
デメリット:必要な配列数を事前に計算する必要がある
あまりデメリットはないかもしれない
案2.動的に確保する(線形リスト)
思いついたコードがこれ
pNext=5
dim task, 5
dim a.pNext, 5
配列に配列を入れるっていう方法で線形リストを作れないか試したけど失敗
案3.動的に確保する(動的配列)
まず2つの配列を用意する
増減があるたびにdimで配列を確保してコピーする
増減が多いと配列全体のコピーが頻発するからゲームには向かないっぽい
増減が少ない場合は空の配列をチェックしなくて済むので案1.より高速
どれもいまいちピンとこない
0826名前は開発中のものです。
2006/03/15(水) 08:54:51ID:BmU2n3lC案1でとりあえずはいいんじゃないか。
0827名前は開発中のものです。
2006/03/15(水) 11:18:33ID:IR0XDvMy案3でいけ
0828名前は開発中のものです。
2006/03/15(水) 22:53:10ID:CsslkguR0829名前は開発中のものです。
2006/03/15(水) 23:43:00ID:CsslkguRタスクは次の情報をもっている
・キャラクタ1体の情報(X、Y座標やHPなど)
・キャラクタの振る舞い(どのサブルーチンを呼ぶか)
・次のキャラクタ(次にどのタスクを実行すればいいか)
タスクが繋がった状態のデータ構造をタスクリストという
タスクシステムは次の機能をもっている
・タスクの追加
・タスクの削除
ほかの言語だと「次のキャラクタ」にポインタを使う
そうすれば動的に確保したタスクを使えるからだ
でもHSPにはポインタがない
代わりに配列の添え字を使う
もし配列のサイズが足りなくなれば案3(>>825)の方法で配列を大きくする
ただし頻繁にサイズを変更するとデータのコピーに時間が時間がかかる
そこでサイズを変更するときは1つずつ増やすのではなく一気にたくさん増やす
まとめ終わり
とりあえず今考えてることをまとめてみた
Dim命令で配列サイズ変更すると内容がすべて0クリアされるのが痛い
「1つずつ増やすのではなく〜」の部分はこれを書いている最中に思いついた
これさえうまく組めばサイズ可変は速度低下ほぼなしでいけそう
0830名前は開発中のものです。
2006/03/16(木) 03:29:18ID:gXQpHvOVタスク追加とサブルーチン呼ぶところまでできた
0831名前は開発中のものです。
2006/03/16(木) 04:04:18ID:UYzIbXI8ズブってなんですか?
ゲーム作るのに金かかりますか?
一般人の俺はゲーム作っていいんですか?
オンラインアクションゲームを作るのは可能ですか?
0832名前は開発中のものです。
2006/03/16(木) 10:13:31ID:M0PRq3Kf0833名前は開発中のものです。
2006/03/16(木) 10:23:03ID:Je4b2YY9すごいまとまってて参考になる
0834名前は開発中のものです。
2006/03/16(木) 11:40:58ID:bQj4ToZf0835名前は開発中のものです。
2006/03/16(木) 11:53:42ID:Je4b2YY9ベストじゃないです。
余程の意思がない限り大学に行くべきです。
俺は専門学生ですが。
0836名前は開発中のものです。
2006/03/16(木) 18:11:24ID:EYKWwJp5釣り乙
0837名前は開発中のものです。
2006/03/16(木) 21:49:10ID:gXQpHvOVオンラインアクションゲー作りたいよねー
O2ってのがいいらしいから、もう少しHSPに慣れたらやってみたい
お金かかるのってやっぱ本代だよね、クオリティ高い3Dだとグラフィックボードも必要だし
>>833
情報サンクス
http://gamdev.org/w/?%5B%5B%A5%BF%A5%B9%A5%AF%A5%B7%A5%B9%A5%C6%A5%E0%5D%5D
タスクシステムってページ(↑)だよね
今ちょっと詰まってるから気分転換に読んでる
>>834
ゲームクリエイター志望ですか?スゲー
難関らしいですががんばってください
0838名前は開発中のものです。
2006/03/16(木) 22:02:29ID:gXQpHvOVgosub *init_task
screen 0,640,480
screen 1,640,480,2
repeat
gsel 1,-1
cls 4
await 1
color 255,255,255
gosub *task_factory0
//タスクシステム実行
gosub *run_task
//デバッグ情報
mes "---sp---"
mes sp
mes "---np---"
mes np
mes "---TaskList---"
gosub *show_task_busy
// gosub *show_task_null
// gosub *show_task_all
//裏画面を表にコピー
gsel 0,1
gcopy 1,0,0,640,480
loop
stop
0839名前は開発中のものです。
2006/03/16(木) 22:03:02ID:gXQpHvOV*sub0
tl.it.2=tl.it.2+cos(tl.it.4/100)*10
tl.it.3=tl.it.3+sin(tl.it.5/100)*10
pset tl.it.2, tl.it.3
if (tl.it.2 < 0) or (tl.it.2 > 640) or (tl.it.3 < 0) or (tl.it.3 > 480) {
tl.it.6=1
}
return
*sub1
return
*sub2
return
*sub3
return
*sub4
return
0840名前は開発中のものです。
2006/03/16(木) 22:03:32ID:gXQpHvOV*init_task
Dim tl,100,10 //タスクリスト 2番目の添え字の0は次のタスクへのポインタ、1は呼び出すサブルーチン、2以降はキャラデータ
//2,3座標 4,5加速度 6死亡フラグ
sp=0 //使用中タスク先頭
np=1 //空きタスク先頭 0なら残りなし
repeat 100
tl.cnt.0=cnt+1
loop
tl.0.0=0
tl.99.0=0
//この初期化でリストは次のように繋がる
//sp -> 0
//np -> 1 -> 2 -> 3 -> ... -> 0
return
0841名前は開発中のものです。
2006/03/16(木) 22:36:03ID:gXQpHvOV*add_task
//空きタスクが無ければ何もしない
if np=0 : return
//空きタスクから一つ取り出す
tmp=np
np=tl.np.0
//新しいタスク(=取りだしたタスク)がどのサブルーチンを呼ぶか設定
tl.tmp.1=add_task_sub
//新しいタスクにゲームデータを代入
tl.tmp.2=add_task_2
tl.tmp.3=add_task_3
tl.tmp.4=add_task_4
tl.tmp.5=add_task_5
tl.tmp.6=add_task_6
//取り出したタスクに利用中タスクの先頭ポインタを渡す
tl.tmp.0=sp
//先頭ポインタを新しく追加したタスクにする
sp=tmp
return
0842名前は開発中のものです。
2006/03/16(木) 22:36:34ID:gXQpHvOV*del_task
//SP直後の要素を書き換える場合はSPを書き換える必要があるので
//特別な処理をする
if del_task_index=0 {
//空タスクに移動
tmp=tl.sp.0
tl.sp.0=np
np=sp
//切れたタスクリストを繋ぐ
sp=tmp
return
}
it=sp
repeat del_task_index-1
it=tl.it.0
loop
//削除するタスクを待避
tmp=tl.it.0
//待避した穴を埋める
tl.it.0=tl.tmp.0
//待避したタスクを空リストに入れる
tl.tmp.0=np
np=tmp
return
0843名前は開発中のものです。
2006/03/16(木) 22:37:07ID:gXQpHvOV*show_task_all
repeat 100
mes tl.cnt.0
loop
return
//タスクリストの状態表示 使用中タスク(Debug用)
*show_task_busy
its=sp
while its ! 0
mes tl.its.0
its=tl.its.0
wend
return
//タスクリストの状態表示 空きタスク(Debug用)
*show_task_null
its=np
while its ! 0
mes tl.its.0
its=tl.its.0
wend
return
0844名前は開発中のものです。
2006/03/16(木) 22:37:39ID:gXQpHvOV*run_task
it=sp
while it ! 0
switch tl.it.1
case 0
gosub *sub0
swbreak
case 1
gosub *sub1
swbreak
case 2
gosub *sub2
swbreak
case 3
gosub *sub3
swbreak
case 4
gosub *sub4
swbreak
swend
it=tl.it.0
wend
gosub *check_kill
return
*check_kill
return
0845名前は開発中のものです。
2006/03/16(木) 22:38:22ID:gXQpHvOVadd_task_sub=0
add_task_2=320
add_task_3=240
add_task_4=rnd(628)
add_task_5=rnd(628)
add_task_6=0
gosub *add_task
return
*task_factory1
add_task_sub=1
gosub *add_task
return
*task_factory2
add_task_sub=2
gosub *add_task
return
*task_factory3
add_task_sub=3
gosub *add_task
return
*task_factory4
add_task_sub=4
gosub *add_task
return
0846名前は開発中のものです。
2006/03/16(木) 23:12:27ID:DsY5+sJ30847名前は開発中のものです。
2006/03/16(木) 23:53:12ID:EYKWwJp5そんな知能ないんだろ
黙って猿の曲芸を見守ってようぜww
0848名前は開発中のものです。
2006/03/17(金) 00:17:11ID:sXFQVN9ihttp://gamdev.org/up/img/5037.jpg
ソース
>>838-845
画面中央から球が発生して四散するプログラム
画面外に出た弾はフラグたてて後からまとめて削除してるんだけどうまくつくれない
タスクシステムってデバッグが難しいな
>>829の時点でまとめて削除する場合のこと考えてなかったから何か破綻してるのかも・・・・
もう少し弄ってうまくいかなければ一時凍結して他のこと始める予定
一度離れたほうが冷静になれるよね
0849名前は開発中のものです。
2006/03/17(金) 00:37:57ID:sXFQVN9i2ちゃんに書き込んでおくと時系列で思い出しやすいし備忘録として使える
本当は↓こういうのに連動したアップローダがあればいいのにって思うけどな
http://www.krugle.com/
http://www.koders.com/
http://www.codefetch.com/
見づらいかもしれないから何かいい方法ないか考えとく
gamdevろだはテキスト不許可だしzipにすると解凍まんどくせ
0850名前は開発中のものです。
2006/03/17(金) 00:57:18ID:sXFQVN9i:;' /:/ `メ、 i: ハ: i: : ii:i ヽ: i: :ii; : : : :iヽ: :
i: :i: i: i/,ィ=ミヽi: iヽNi:i_`iL:H---i:i: ヽ
i: :i :i / {.iトgj:i ヽ! lルィ丁゙)‐ミ「!: :ii/: : i
;':/ヾム⊂つ'´ i:.;{iil1:ソ i:i:::i !: : i:
: i: /: iト 、,,ミニっ /i/゚: o i .
: i:/: : i 、`_  ̄/.:/: : : i: :
: /: .::ハ ゙llllllル `ヽ //. : :/! i: . <あやまれ!お猿さんにあやまれっ
/: .::/:::/`、 lll/: : : : :} /〃:./: /i iハ!
i. ::/i::/::::::i::ヽ`三ー 'ノ , イ/: /: /.::i i::::::
::::///::::::::i:::i:..ヽ---<::::/:::/: :/: : i iヽ::
0851名前は開発中のものです。
2006/03/17(金) 22:57:46ID:sXFQVN9i0852名前は開発中のものです。
2006/03/18(土) 00:09:23ID:UdlfWr/Sでもこれ名前つけられるようになってる意味がわからん
0853名前は開発中のものです。
2006/03/18(土) 00:26:22ID:UdlfWr/S・・・・ひとつの配列ですべての種類のデータを格納できれば・・・・いらないはず・・・・
配列の増減をDimでするなら・・・・・・ポインタで繋ぐ意味はない・・・・
0854名前は開発中のものです。
2006/03/18(土) 01:15:18ID:UdlfWr/S■タスクシステム
・すべての種類のデータを一つのリスト構造に納めることができる
・データの増減が可能
・HSPで擬似的に実現してるために前者はワーク領域のデータ型が制限される、
・後者は増減時に時間がかかってしまうのでメリットは少ない
■フラグ法
・タスクの利用可否をフラグで判断する方法
・実行時に配列すべてを走査する必要がある
・平均実行時間がタスクリストの最大実行時間と同じ程度になる
■最大値可変法
・擬似的な動的配列を実現する方法
・追加するときは配列の最大値を加算し末尾に代入する
削除するときは削除するタスクに末尾のタスクを上書きコピーし配列の最大値を減算する
・平均実行時間はタスクリストと同じ程度
0855名前は開発中のものです。
2006/03/18(土) 02:14:46ID:pDqUPpztHSP暦1年6ヶ月の漏れからアドバイスだ
0856名前は開発中のものです。
2006/03/18(土) 09:15:01ID:UdlfWr/S0857名前は開発中のものです。
2006/03/18(土) 10:08:17ID:vA7d8xvUHSPは2.6? 3.0からは配列変数は越えた分は自動確保されますよ。いきなり読み込むと
エラーになりますが。
0858名前は開発中のものです。
2006/03/18(土) 10:53:43ID:UdlfWr/S確認してきた
ほんとだ、スゲー!感動した
>>825>>829>>854あたりの発言は取り消す
根本的に発想を変えなきゃいけないみたいだ
0859名前は開発中のものです。
2006/03/18(土) 11:16:12ID:xi+rxGkkタスクシステムの。
0860名前は開発中のものです。
2006/03/18(土) 22:38:18ID:UdlfWr/Sturn=0
//変数
Dim tl,MAX,3 //敵
repeat MAX
tl.cnt.0=1 //利用中(0=否)
tl.cnt.1=0 //呼び出すサブルーチン
tl.cnt.2=(cnt*64)\640 //X座標
tl.cnt.3=(cnt*64)/640*64 //Y座標
loop
cx=320
cy=440
//裏画面
screen 1,640,480,2
//自機
screen 2,32,32,2
picload "jiki.bmp",2
//敵機
screen 3,32,32,2
picload "teki.bmp",2
screen 0,640,480
0861名前は開発中のものです。
2006/03/18(土) 22:38:49ID:UdlfWr/Srepeat
//裏画面を作る
gsel 1,-1
cls 4
await 1
//自機
cx_speed=8
stick keyboard,15,1
switch keyboard
case 1
cx=cx-cx_speed
if cx<0 : cx=0
swbreak
case 4
cx=cx+cx_speed
if cx>639-32 : cx=639-32
swbreak
case 64
if benable=0 {
benable=1
bx=cx+16
by=cy
}
swend
pos cx,cy: gcopy 2, 0,0
0862名前は開発中のものです。
2006/03/18(土) 22:41:48ID:UdlfWr/Sif benable=1 {
by=by-8
if by<0 : benable=0
color 255,255,255
line bx, by, bx, by-16
}
//敵機
turn=0
ndir=dir
repeat MAX
if tl.cnt.0 = 1 {
pos tl.cnt.2,tl.cnt.3:gcopy 3, 0,0,32,32
tl.cnt.2 = tl.cnt.2+dir
if (tl.cnt.2 <= 0) : ndir=1
if (tl.cnt.2 >= 602) : ndir=-1
//あたり判定
if benable and tl.cnt.2<bx and tl.cnt.2+32>bx and tl.cnt.3<by and tl.cnt.3+32>by: tl.cnt.0 = 0
}
loop
if dir!ndir {
repeat MAX
tl.cnt.3=tl.cnt.3+4
loop
}
dir=ndir
0863名前は開発中のものです。
2006/03/18(土) 22:42:30ID:UdlfWr/Sgsel 0,1
pos 0,0: gcopy 1,0,0,640,480
loop
0864名前は開発中のものです。
2006/03/19(日) 01:32:22ID:AaENy85a・敵がインベーダーっぽく動く
・自機が左右に動く
・自機が弾を発射できる
・弾が敵に当たると消滅する
ソース
>>860-863
左右移動中にCTRLを押しても弾が撃てないorz
タスクシステムに変わって配列でデータを管理することにした
インベーダーゲームなら敵は減るばかりだから問題はない
タスクシステムと比べて
・単純でデバッグもしやすい
・速度も問題はない
タスクシステムの存在意義がわからなくなってきた
やっぱり>>855が結論なのか・・・・
でも>>859が気になる
0865ホスプロ ◆HOTsoUpxjY
2006/03/19(日) 01:48:59ID:nuu57z8E一人で作る場合タスクはなくてもなんとかなる。
複数人で仕様も変わる状況への対処法だから。
それよりルーチンを切り分けてモジュール化して
一からやり直すハメにならない方が大事だと思う。
メインループから外注に出せば把握できるでしょ。
とかいって「そんなのは嘘だ!」とか
ここから1000まで叩かれまくったりして…
0866名前は開発中のものです。
2006/03/19(日) 02:55:38ID:iAmpuYbz0867名前は開発中のものです。
2006/03/19(日) 07:27:37ID:VCd0X5P4HSP2.xでのscreen 1はスクリーンセーバーとかで使う特殊な画面なので、バッファ用には
2以降を使うのがセオリーです。っと、裏画面がscreenって、ちゃんとbufferという非表示の
スクリーンを作る命令がありますぜい。
>>864
キー入力の判定でswitch命令を使ってるけど、それぞれにswbreakがあるんで、ひとつでも
該当すると構文から抜け出ちゃいます。それにswitch文での比較判定は単純にイコールだけ
になっちゃうので、左を押しながら弾を撃つという状態のチェックができません。
ここは素直にif文で
if keyboard & 1 : cx=cx-cx_speed : if cx < 0 : cx=0
if keyboard & 4 : cx=cx+cx_speed : if cx > 639-32 : cx=639-32
if keyboard & 64 : if benable == 0 : benable=1 : bx=cx+16 : by=cy
というふうに。(=ではなく&で)
0868名前は開発中のものです。
2006/03/20(月) 05:09:20ID:5iZ2gAyz//初期化
gosub *Boot_Initialize
gosub *Play_Initialize
*Start
repeat
//裏画面を作る
gsel 2,-1
cls 4
await 1
//自機
cspeed=8
stick keyboard,15,1
if keyboard & 1 {
cx=cx-cspeed
if cx<0 : cx=0
}
if keyboard & 4 {
cx=cx+cspeed
if cx>639-32 : cx=639-32
}
if keyboard & 64 {
if benable=0 {
benable=1
bx=cx+16
by=cy
}
}
0869名前は開発中のものです。
2006/03/20(月) 05:12:32ID:5iZ2gAyz//自機弾
if benable=1 {
by=by-8
if by<0 : benable=0
color 255,255,255
line bx, by, bx, by-16
}
//敵機
ndir=dir
repeat MAX
if tl.cnt.0 = 1 {
pos tl.cnt.2,tl.cnt.3:gcopy 4, 0,0,32,32
tl.cnt.2 = tl.cnt.2+dir
if (tl.cnt.2 <= 0) : ndir=1
if (tl.cnt.2 >= 602) : ndir=-1
//あたり判定
if benable and tl.cnt.2<bx and tl.cnt.2+32>bx and tl.cnt.3<by and tl.cnt.3+32>by: tl.cnt.0 = 0 : Score=Score+10 : Teki_Rest = Teki_Rest - 1
//敵が接地したか
if tl.cnt.3 > 448 : invasion = 1
}
loop
if dir!ndir {
repeat MAX
tl.cnt.3=tl.cnt.3+4
loop
}
0870名前は開発中のものです。
2006/03/20(月) 05:13:03ID:5iZ2gAyzColor 255, 255, 255
pos 200,0 : mes "Score"
pos 300,0 : mes Score
if Score > HighScore : HighScore = Score
pos 0,0 : mes "High-Score"
pos 100,0 : mes HighScore
//表画面へコピー
gsel 0,1
pos 0,0: gcopy 2,0,0,640,480
if Teki_Rest=0 : gosub *Stage_Initialize
if invasion=1 : gosub *Play_Initialize
loop
//ステージ初期化
*Stage_Initialize
Stage_Num = Stage_Num + 1
Dim tl,MAX,3 //敵
repeat MAX
tl.cnt.0 = 1 //利用中(0=否)
tl.cnt.1 = 0 //呼び出すサブルーチン(未使用)
tl.cnt.2 = ( cnt * 64 ) \ 640 //X座標
tl.cnt.3 = ( cnt * 64 ) / 640 * 64 //Y座標
loop
cx=320
cy=440
0871名前は開発中のものです。
2006/03/20(月) 05:13:36ID:5iZ2gAyzTeki_Rest=MAX
invasion = 0
cls 4
Color 255, 255, 255
pos 280,240 : mes "Stage"
pos 340,240 : mes Stage_Num
AWait 1000
return
//プレイ初期化
*Play_Initialize
Stage_Num=0
Score=0
gosub *Stage_Initialize
return
//起動時の初期化
*Boot_Initialize
HighScore=74
Score=0
//裏画面
buffer 2,640,480
0872名前は開発中のものです。
2006/03/20(月) 05:14:08ID:5iZ2gAyz//自機
buffer 3,32,32
picload "jiki.bmp"
//敵機
buffer 4,32,32
picload "teki.bmp"
screen 0,640,480
cls 4
return
0873名前は開発中のものです。
2006/03/20(月) 07:00:23ID:PMTGalOb0874名前は開発中のものです。
2006/03/20(月) 08:45:22ID:mOdDXP9C0875名前は開発中のものです。
2006/03/20(月) 14:47:22ID:pEmfXrsX0876名前は開発中のものです。
2006/03/20(月) 15:05:28ID:B4K2jB010877名前は開発中のものです。
2006/03/20(月) 17:45:46ID:piMMOlj9HSPでは速度的に辛い
特にswitchで死ねる
0878名前は開発中のものです。
2006/03/20(月) 21:00:31ID:nDP36KvpPascalみたく宣言部つくって、
定数や変数、サブルーチンを宣言しておけば
けっこう大丈夫じゃない?
いや、もちろんしなくていいんだけど
漏れはそうしてるよ。
0879名前は開発中のものです。
2006/03/20(月) 23:23:08ID:jcANfyCOやっぱポインタは初心者を遠ざけるのか?
0880名前は開発中のものです。
2006/03/20(月) 23:33:27ID:mOdDXP9C俺がそうだったw
0882名前は開発中のものです。
2006/03/21(火) 00:11:53ID:jcmOwNd8ましてや統合環境が欲しいならさらに使い方を覚えなくちゃいけないな。
GUIはそんなに難しくないと思うけど?
むしろ、GUIに辿り着くまでのが厳しいと思う。
とはいえ、ゲームだからGUIは避けて通れないな
0883名前は開発中のものです。
2006/03/21(火) 04:31:56ID:KZa94AFT簡単に作れる というのと
手軽さ というのは違うぞ。
確かにC++やRubyで組んだほうが最終的には
”カンタン”に済ませられるのはモチロン知っているが
この”手軽さ”はやめられない
0884名前は開発中のものです。
2006/03/21(火) 08:51:03ID:TsEgs7Ul気になる点をいくつか。
>//自機
>cspeed=8
これが定数ならば、メインループから外して初期化ルーチンで記述したほうがよいです。
毎フレームで定義されてて無駄な処理になってるんで。
あと、
>pos 200,0 : mes "Score"
>pos 300,0 : mes Score
これは
pos 200,0 : mes "Score : "+Score
でもok(" : "は任意で)なんだけど、なにかしら別の意図が?
awaitの使い方も気になるけど、今のところは実害ある利用方法じゃないので、とりあえず
のちほど。…でもawait 1はPCスペックによって実行速度に差がでるか。
0885名前は開発中のものです。
2006/03/22(水) 08:51:55ID:4wbvXuWaインデントはもう全部タブに書き換えたから大丈夫
さらに続いて撃ち返し弾を実装したソースをうp予定
インデント失敗orz
HSPのエディタはタブが2個並んでると置換されないことがある(メモ帳だとうまくいった)
行頭にタブとスペースが混ざってるのもインデントが崩れた原因
ソース
>>868-872
・敵を全滅させると次のステージに進む
・スコア、ハイスコア機能追加
・敵が地面にくるとゲームオーバー(ステージ1から再スタート)
・screenを>>867で教えてもらったbuffer命令に置き換えた
・移動中に弾がでない不具合を修正(>>867)
0886名前は開発中のものです。
2006/03/22(水) 08:54:20ID:4wbvXuWa置換されなくなるまで同じ操作を繰り返してスペースを&nbsp;に置換完了
0887名前は開発中のものです。
2006/03/22(水) 08:54:51ID:4wbvXuWa#define cspeed 8 //自機移動速度
#define EBULLET_MAX 50 //敵弾数最大
//初期化
gosub *Boot_Initialize
gosub *Play_Initialize
*Start
repeat
//裏画面を作る
gsel 2,-1
cls 4
await 1
//自機
stick keyboard,15,1
if keyboard & 1 {
cx=cx-cspeed
if cx<0 : cx=0
}
if keyboard & 4 {
cx=cx+cspeed
if cx>639-32 : cx=639-32
}
if keyboard & 64 {
if benable=0 {
benable=1
bx=cx+16
0888名前は開発中のものです。
2006/03/22(水) 08:55:38ID:4wbvXuWa}
}
pos cx,cy: gcopy 3, 0,0
//自機弾
if benable=1 {
by=by-8
if by<0 : benable=0
color 255,255,255
line bx, by, bx, by-16
}
//敵機
ndir=dir
repeat MAX
if tl.cnt.0 = 1 {
pos tl.cnt.2,tl.cnt.3:gcopy 4, 0,0,32,32
tl.cnt.2 = tl.cnt.2+dir
if (tl.cnt.2 <= 0) : ndir=1
if (tl.cnt.2 >= 602) : ndir=-1
0889名前は開発中のものです。
2006/03/22(水) 08:56:09ID:4wbvXuWaif benable and tl.cnt.2<bx and tl.cnt.2+32>bx and tl.cnt.3<by and tl.cnt.3+32>by {
tl.cnt.0 = 0
Score = Score + 10
Teki_Rest = Teki_Rest - 1
gosub *Enemy_Fire
}
//敵が接地したか
if tl.cnt.3 > 448 : invasion = 1
}
loop
if dir!ndir {
repeat MAX
tl.cnt.3=tl.cnt.3+4
loop
}
dir=ndir
0890名前は開発中のものです。
2006/03/22(水) 10:49:46ID:4wbvXuWarepeat EBULLET_MAX
color 255,255,255
if bl.cnt.0 = 1 {
line bl.cnt.2, bl.cnt.3, bl.cnt.2, bl.cnt.3 + 16 //描画
bl.cnt.3 = bl.cnt.3 + 8 //移動
if bl.cnt.3 > 480 : bl.cnt.0 = 0 //画面外なら使用終了
if bl.cnt.2 > cx and bl.cnt.2 < cx + 32 and bl.cnt.3 > cy and bl.cnt.3 < cy+32 : Dead = 1 //自機との当たり判定
}
loop
Color 255, 255, 255
pos 200,0 : mes "Score : " + Score
if Score > HighScore : HighScore = Score
pos 0,0 : mes "High-Score : " + HighScore
//表画面へコピー
gsel 0,1
pos 0,0: gcopy 2,0,0,640,480
if Teki_Rest=0 : gosub *Stage_Initialize
if invasion=1 or Dead = 1 : gosub *Play_Initialize
loop
0891名前は開発中のものです。
2006/03/22(水) 13:19:37ID:DEs7YkunCの半分くらいの時間でソース書けるんだが
短すぎて書いた気がしない
0892名前は開発中のものです。
2006/03/22(水) 16:53:56ID:4wbvXuWa*Stage_Initialize
Stage_Num = Stage_Num + 1
Dim tl, MAX, 3 //敵
Dim bl, EBULLET_MAX, 3 //敵の弾
repeat MAX
tl.cnt.0 = 1 //利用中(0=否)
tl.cnt.1 = 0 //呼び出すサブルーチン(未使用)
tl.cnt.2 = ( cnt * 64 ) \ 640 //X座標
tl.cnt.3 = ( cnt * 64 ) / 640 * 64 //Y座標
loop
cx=320
cy=440
benable=0
Teki_Rest=MAX
invasion = 0
Dead = 0
cls 4
Color 255, 255, 255
pos 280,240 : mes "Stage " + Stage_Num
AWait 1000
return
0893名前は開発中のものです。
2006/03/22(水) 16:54:27ID:4wbvXuWa*Play_Initialize
Stage_Num=0
Score=0
gosub *Stage_Initialize
return
//起動時の初期化
*Boot_Initialize
HighScore=74
Score=0
//裏画面
buffer 2,640,480
//自機
buffer 3,32,32
picload "jiki.bmp"
//敵機
buffer 4,32,32
picload "teki.bmp"
screen 0,640,480
cls 4
return
0894名前は開発中のものです。
2006/03/22(水) 16:54:57ID:4wbvXuWa*Enemy_Fire
// bl.cnt.0 //使用中かどうか
// bl.cnt.1 //弾道サブルーチン(未使用)
// bl.cnt.2 //X座標
// bl.cnt.3 //Y座標
teki_num=cnt
repeat EBULLET_MAX
if bl.cnt.0 = 0 {
bl.cnt.0 = 1
bl.cnt.2 = tl.teki_num.2+16
bl.cnt.3 = tl.teki_num.3
break
}
loop
return
0895名前は開発中のものです。
2006/03/22(水) 19:50:05ID:4wbvXuWa>>887-894
文字列が足し算できるなんて・・・メチャクチャ楽じゃないか・・・
スレの流れ的にC++まんせーですね
今ちょうど区切りがいいので移植に挑戦してみようかな
グラフィックの複雑さがネック
dupptrやvarptrを使えばHSPでもポインタが使えるみたいなので
ひょっとしてタスクシステム作れるかもしれない
前回は無計画に作って想定してない箇所(タスクの削除がうまく作れなかった)でハマったので
今度は計画的に
敵や敵弾のバリエーションを増やしてギャラクシアン風に作り替えたい
動きにバリエーションをつけるのは初めから考えていたこと
いかにもゲームらしい部分なのでおもしろそう
やりたいことが3つもできてしまったのでとりあえず寝てきます
どれから手をつけようか……
0896名前は開発中のものです。
2006/03/22(水) 21:51:47ID:quA0O7ZOまぁポリゴンとかは出来ないけどさ。
0897名前は開発中のものです。
2006/03/23(木) 10:01:54ID:5WNqQ2iY#define MAX 50 //敵の数最大
#define cspeed 8 //自機移動速度
#define EBULLET_MAX 50 //敵弾数最大
#include "DxLib.h"
//プロトタイプ宣言
void Boot_Initialize();
void Play_Initialize();
void Stage_Initialize();
void Enemy_Fire(int cnt);
//変数宣言
int tl[MAX][4]; //敵
int bl[EBULLET_MAX][4]; //敵の弾
int cx=0, cy=0;
int bx=0, by=0, benable=0;
int ndir=0, dir=0;
int tspeed=0, Teki_Rest=0;
int Score=0, HighScore=0;
int Dead=0, invasion=0;
int Stage_Num=0;
int HGJiki=0;
int HGTeki=0;
0898名前は開発中のものです。
2006/03/23(木) 10:02:25ID:5WNqQ2iYLPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
//初期化
Boot_Initialize();
Play_Initialize();
//裏画面
SetDrawScreen( DX_SCREEN_BACK ) ;
//*Start
while (1)
{
ClsDrawScreen() ;
WaitTimer( 1 ) ;
//自機
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
cx=cx-cspeed;
if (cx<0) cx=0;
}
0899名前は開発中のものです。
2006/03/23(木) 10:03:24ID:5WNqQ2iY{
cx=cx+cspeed;
if (cx>639-32) cx=639-32;
}
if( CheckHitKey( KEY_INPUT_LCONTROL ) == 1 )
{
if (benable == 0) {
benable=1;
bx=cx+16;
by=cy;
}
}
DrawGraph( cx , cy , HGJiki , FALSE ) ;
//自機弾
if (benable == 1) {
by=by-8;
if (by<0) benable=0;
DrawLine(bx, by, bx, by-16, GetColor(255,255,255));
}
0900名前は開発中のものです。
2006/03/23(木) 10:04:13ID:5WNqQ2iYndir=dir;
for (int cnt=0 ; cnt<MAX ; cnt++)
{
if (tl[cnt][0] == 1)
{
DrawGraph( tl[cnt][2], tl[cnt][3], HGTeki , FALSE ) ;
tl[cnt][2] = tl[cnt][2]+dir;
if (tl[cnt][2] <= 0) ndir = tspeed;
if (tl[cnt][2] >= 602) ndir = -tspeed;
//あたり判定
if (benable && (tl[cnt][2] < bx) && ((tl[cnt][2] + 32) > bx) && (tl[cnt][3] < by) && ((tl[cnt][3]+32) > by) )
{
tl[cnt][0] = 0;
Score = Score + 10;
Teki_Rest = Teki_Rest - 1;
0901名前は開発中のものです。
2006/03/23(木) 10:04:46ID:5WNqQ2iY}
//敵が接地したか
if (tl[cnt][3] > 448) invasion = 1;
}
}
if (dir != ndir) {
for (int cnt=0 ; cnt<MAX ; cnt++)
{
tl[cnt][3] = tl[cnt][3] + 4;
}
}
dir = ndir;
0902名前は開発中のものです。
2006/03/23(木) 13:33:20ID:5WNqQ2iYfor (int cnt=0 ; cnt<EBULLET_MAX ; cnt++)
{
if (bl[cnt][0] == 1)
{
bl[cnt][3] = bl[cnt][3] + 8; //移動
DrawLine(bl[cnt][2], bl[cnt][3], bl[cnt][2], bl[cnt][3] + 16, GetColor(255,255,255)); //描画
if (bl[cnt][3] > 480) bl[cnt][0] = 0; //画面外なら使用終了
if ((bl[cnt][2] > cx) && (bl[cnt][2] < cx + 32) && (bl[cnt][3] > cy) && (bl[cnt][3] < cy+32)) Dead = 1; //自機との当たり判定
}
}
DrawFormatString( 200, 0, GetColor(255,255,255), "Score : %d", Score);
if (Score > HighScore) HighScore = Score;
DrawFormatString( 0, 0, GetColor(255,255,255), "High-Score : %d", HighScore);
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
0903名前は開発中のものです。
2006/03/23(木) 13:33:50ID:5WNqQ2iYif (Teki_Rest <= 1) tspeed=4;
if (Teki_Rest == 0) Stage_Initialize();
if ( (invasion == 1) || (Dead == 1) ) Play_Initialize();
// Windows システムからくる情報を処理する
if( ProcessMessage() == -1 ) break ;
// ESCキーが押されたらループから抜ける
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
0904名前は開発中のものです。
2006/03/23(木) 13:34:21ID:5WNqQ2iYvoid Stage_Initialize()
{
Stage_Num = Stage_Num + 1;
ZeroMemory(tl, sizeof(tl)); //Dim tl, MAX, 3 //敵
ZeroMemory(bl, sizeof(bl)); //Dim bl, EBULLET_MAX, 3 //敵の弾
for (int cnt=0 ; cnt<MAX ; cnt++)
{
tl[cnt][0] = 1; //利用中(0=否)
tl[cnt][1] = 0; //呼び出すサブルーチン(未使用)
tl[cnt][2] = ( cnt * 64 ) % 640; //X座標
tl[cnt][3] = ( cnt * 64 ) / 640 * 64; //Y座標
}
cx=320;
cy=440;
benable=0;
tspeed=1;
0905名前は開発中のものです。
2006/03/23(木) 13:34:52ID:5WNqQ2iYinvasion = 0;
Dead = 0;
ClsDrawScreen();
DrawFormatString( 280, 240, GetColor(255,255,255), "Stage : %d", Stage_Num);
ScreenFlip() ;
WaitTimer( 1000 ) ;
return;
}
//プレイ初期化
void Play_Initialize()
{
Stage_Num=0;
Score=0;
Stage_Initialize();
return;
}
0906名前は開発中のものです。
2006/03/23(木) 13:35:36ID:5WNqQ2iYvoid Boot_Initialize()
{
HighScore=74;
Score=0;
HGJiki = LoadGraph( "jiki.bmp" ) ;
HGTeki = LoadGraph( "teki.bmp" ) ;
ClsDrawScreen();
return;
}
//敵が弾を発射
void Enemy_Fire(int cnt)
{
// bl.cnt.0 //使用中かどうか
// bl.cnt.1 //弾道サブルーチン(未使用)
// bl.cnt.2 //X座標
// bl.cnt.3 //Y座標
0907名前は開発中のものです。
2006/03/23(木) 14:22:32ID:sWF0/S5O乙。未実装の敵弾以外は普通に動いたよ。
とりあえず、敵のフラグと座標は構造体にしてみては?
0908名前は開発中のものです。
2006/03/24(金) 03:47:56ID:r2mkgPf1for ( cnt=0 ; cnt<EBULLET_MAX ; cnt++)
{
if (bl[cnt][0] == 0) {
bl[cnt][0] = 1;
bl[cnt][2] = tl[teki_num][2]+16;
bl[cnt][3] = tl[teki_num][3];
break;
}
}
return;
}
0909名前は開発中のものです。
2006/03/24(金) 04:43:33ID:r2mkgPf1>>897-908
・グラフィック
>>896で出てきたDXライブラリを使っています
ライン命令やフォーマット付きの文字描画があったので
HSPからあまり修正せずに移植できました
・変数宣言
やはり>>891で指摘された通りソースが長くなります
しかし移植中に配列サイズを間違っていることに気づきました
実は>>857で説明されている機能である
>配列変数は越えた分は自動確保されますよ
に助けられたいたので今まで発覚しなかったのです
Dim tl,MAX,3 //敵
repeat MAX
tl.cnt.0=1 //利用中(0=否)
tl.cnt.1=0 //呼び出すサブルーチン
tl.cnt.2=(cnt*64)\640 //X座標
tl.cnt.3=(cnt*64)/640*64 //Y座標
↑
Dimで3と宣言している(0〜2まで使える)のに0〜3まで使ってる
・C++移植版のバグ
ALT+F4で終了するとエラーがでます
たぶんDxLib_End()を実行してないからだと思います
ゲーム終了時に必ず実行する工夫がないか検討中
0910名前は開発中のものです。
2006/03/24(金) 05:33:06ID:r2mkgPf1構造体を定義してみた
struct stEnemy
{
int x;
int y;
bool enable;
};
↓
自機や弾も使い回しできるな
↓
こういうのって継承すればいいんだっけ
↓
そうだ、classを使おう
0911名前は開発中のものです。
2006/03/24(金) 06:24:23ID:r2mkgPf10912名前は開発中のものです。
2006/03/24(金) 07:45:58ID:r2mkgPf1座標をxやyで書けるのは見やすくていい
HSPには無いのかな、連想配列で似たようなことができそうな気がするけど
ついに240行にまで増えた
20行平均で貼り付けても12レスorz
5レスごとに3時間ぐらい待たされるから全うpまで6時間以上orz...
レス数が900を超えています。1000を超えると表示できなくなるよ。