トップページgamedev
990コメント416KB

ズブの初心者がゲーム作れるまで勉強するスレ

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/11/07 20:26ID:PFtlmWD9
【参加資格】
ズブの初心者以外お断りです。

なおアドバイス等はプロのかたでも結構です。
初心者は聞く耳を持ちプロもわかりやすく教えてやってください。
0786名前は開発中のものです。2006/01/31(火) 20:59:07ID:O6FIK+ST
ずぶの素人です。趣味でゲーム作りたくて「やさしいC++」ぐらいの初歩の内容なら理解できるようになりました。
すれ違いかもしれませんが次おすすめの本あるでしょうか?

ちょっと背伸びすると急に難度が高くなってさっぱりで困ってます。
0787名前は開発中のものです。2006/01/31(火) 21:33:34ID:EQhJsvLP
俺ははじめてのC++ってのを読んで、ポインタから仮想GUIを完璧に理解してから、同じ著者のC++の演習の本読んだよ。そのあとは粂井氏の猫でもわかるウインドウズプログラミングを読み(←今ここ)、最後にダイレクトXへ進む予定です。
0788名前は開発中のものです。2006/01/31(火) 21:50:25ID:d111+hE/
>>786
Windowsでのプログラムを前提として答えると
翔泳社 プログラマ養成入門講座 VisualC++(1)山本信雄 が良いかな。
背伸びしなくて行けます

それと折角C++をやってるんだから気分を出すために、オライリーのリファレンス2冊
C++ライブラリ、C++ランゲージ、お金に余裕があるならこの2冊は持っててOk
背伸びしないにしても、読まないにしてもリファレンスは持っていたほうが良いです。
0789名前は開発中のものです。2006/02/05(日) 00:58:34ID:6a/MIZ7z
2chでアイデアを募集し、スタッフも同時求人。
そしてサウンドノベルを作って公開しようという
創作文芸板の企画です。
ミステリ編のメインシナリオは完成し、体験版もできています。
こちらに関してはあとは音、画像の挿入。分岐シナリオライター募集など。
ほかにホラー編も作成中。==ライターは別の人。

現時点において人手不足のため、スタッフを募集しています。


現在作成決定中のシナリオ
【ミステリー編 】 メインシナリオ完成
揺光の下、白日を待つ。 ―disaster&light―
【島の謎 脱出編 】企画段階
赤い月夜に、鬼が哭く。 -Demon cries over the night of a red moon-      
【島の謎 解明編】シナリオ執筆中
夜を謳う、悪夢と共に。 ―nightmarescatter―  

サウンドノベル企画6改-鬼哭島殺人事件
http://book3.2ch.net/test/read.cgi/bun/1105746809/

1◆VSiZ17Eht氏の運営する総合案内・リンクサイト
http://akasaka.cool.ne.jp/novel2ch/index.html

まとめページ(体験版=選択肢なしであるけどミステリ編メインシナリオ)
[創作文芸]サウンドノベル企画
http://www.aaa-www.net/~sosaku/
0790名前は開発中のものです。2006/02/05(日) 01:08:54ID:PsBnitWb
プログラマはいらんのか。音できるけどなぁ。初めてまだ数か月だし…
0791名前は開発中のものです。2006/02/05(日) 08:23:07ID:xrnjocLM
ズブの初心者スレで募集って、ズブの初心者がスタッフとして必要なのか?
0792名前は開発中のものです。2006/02/05(日) 09:41:20ID:c7olZgCS
age
0793名前は開発中のものです。2006/02/05(日) 11:42:15ID:IblN+hmc
>>789
なんだこれw
タイトルが大仰な所が厨くせえw
0794名前は開発中のものです。2006/02/05(日) 18:31:02ID:KXWCIvRf
超初心者ですがC#でプログラムを組むべくVisualC#をインストールしました。
初心者にお勧めの簡単なお題ををお願いいします
0795名前は開発中のものです。2006/02/05(日) 18:33:36ID:bCNcEVl1
>>794
まずブロック崩し
そしてシューティング
が王道じゃね?
0796名前は開発中のものです。2006/02/05(日) 18:33:57ID:laLI4TA8
>>794
消えろ
0797名前は開発中のものです。2006/02/06(月) 00:20:35ID:vMsEOgkQ
>>794
お題をくれてやるから
できたら必ず申告しろ

1:「ゲムデヴ wiki」とぐぐる
2:その中の段階的学習を読んで感想文を書く
0798名前は開発中のものです。2006/03/13(月) 15:51:09ID:SdjQ4hhJ
今から俺がゲーム作るまで実況するお

まずHSPいれた
mes "hello, HSP"
F5を押した
「実行用ランタイムファイルが見つかりません。」
挫折した
0799名前は開発中のものです。2006/03/13(月) 16:08:45ID:OU7yAgnP
>>798
ゲーム作るまで実況するんだろ?
そんなことで挫折してどうする
0800名前は開発中のものです。2006/03/13(月) 16:16:41ID:SdjQ4hhJ
アンインストールしたら動いた
さっきは3.1βを入れたのがまずかったらしい

過去ログ読んで勉強中
>>32に感動した
でもそれは3目並べじゃないと思った
0801名前は開発中のものです。2006/03/13(月) 16:32:48ID:SdjQ4hhJ
*start
await 1
cls
pos 0,0: mes mousex
pos 0,16: mes mousey
goto *start

うまく動かない
clsとawaitの位置を入れ替えたらうまくいくが理由がわからない
気にしても仕方がないので次いってみよー

>>799
人間は挫折の数だけ賢くなるんやでってあんちゃんがいってた
0802名前は開発中のものです。2006/03/13(月) 17:19:17ID:SdjQ4hhJ
screen 0,640,480

map_width=79
map_height=59

dim map, map_width, map_height

//一番外の壁
for y, 0, map_height
    for x, 0, map_width
        map.x.y=1
    next
next
for y, 1, map_height-1
    for x, 1, map_width-1
        map.x.y=0
    next
next

//1マス間隔で置く
for y, 2, map_height-2, 2
    for x, 2, map_width-2, 2
        map.x.y=1
    next
next
0803名前は開発中のものです。2006/03/13(月) 17:21:43ID:SdjQ4hhJ

//計算用の補助変数
dim ax,4
dim ay,4

ax.0=0
ax.1=1
ax.2=0
ax.3=-1

ay.0=-1
ay.1=0
ay.2=1
ay.3=0

//1マス間隔の壁のまわりにランダムに置く
for y, 2, map_height-2, 2
    for x, 2, map_width-2, 2
        rx=x+ax.rnd(4)
        ry=y+ay.rnd(4)
        map.rx.ry=1
    next
next

for y, 0, map_height
    for x, 0, map_width
        if map.x.y=1:boxf x*8, y*8, x*8+7, y*8+7
    next
next
0804名前は開発中のものです。2006/03/13(月) 17:30:32ID:SdjQ4hhJ
過去ログでHSPの雰囲気は掴んだ
迷路風の模様を表示するプログラム作成

スクリーンショット
http://gamdev.org/up/img/4977.png

ソース
>>802-803

キー入力がよくわからないのでうpろだとwiki見てくる
0805名前は開発中のものです。2006/03/13(月) 17:47:11ID:SdjQ4hhJ
wikiをみてきた
CやDelphiだらけでちょっと焦る
HSPやってる場合じゃないのか・・・・

ジエンの無人島
http://gamdev.org/w/?%5B%5B%A5%B8%A5%A8%A5%F3%A4%CE%CC%B5%BF%CD%C5%E7%5D%5D

やっとHSPのソースをみつけた
stick命令の使い方を把握
変数に日本語を使えることに感動

    if ゲーム状態==移動モード {
        if 入力キー==32 : ゲーム状態=会話モード : gosub *チャット窓表示 : return
        if 入力キー==1 : MOVE送信="move,"+NO+",-1,0" : ゲーム状態=待機モード : return
        if 入力キー==2 : MOVE送信="move,"+NO+",0,-1" : ゲーム状態=待機モード : return
        if 入力キー==4 : MOVE送信="move,"+NO+",1,0" : ゲーム状態=待機モード : return
        if 入力キー==8 : MOVE送信="move,"+NO+",0,1" : ゲーム状態=待機モード : return
    }

ひょっとしてこれMMORPGですか
スゲー!
0806名前は開発中のものです。2006/03/13(月) 17:53:06ID:SdjQ4hhJ
>>805のソースの手間にこれを追加
stick 入力キー,15,1
0807名前は開発中のものです。2006/03/13(月) 18:28:11ID:SdjQ4hhJ
*start
    await 1        
    cls
    boxf x,y,x+8,y+8

    stick keyboard,15,1

    switch keyboard
    case 1
        x=x-1
        swbreak
    case 2
        y=y-1
        swbreak
    case 4
        x=x+1
        swbreak
    case 8
        y=y+1
        swbreak
    swend
goto *start

stick命令は把握した
次は画面にbmpファイルとか絵を出す
0808名前は開発中のものです。2006/03/13(月) 19:00:53ID:SdjQ4hhJ
screen 2,1024,768,2 //裏画面を作る。P4は非表示なので2
picload "utada.jpg",2 //裏画面に読み込み。これも非表示なので2
screen 0,640,480 //表示する画面は0、大きさを640x480に設定

*start
await 1 //これ絶対いれないとフリーズする
gcopy 2,i,0,640,480 //画面2からコピーする。コピー先はscreenで指定した画面
i=i+1
goto *start
stop

screen命令がちょっとやっかいだった
これは二種類のことを同時にしてるんだと理解した
・画面をつくる
・描画する画面を切り替える
で、疑問に思ったのが切り替えだけする方法がないの?ってこと
screen命令だと今まで描いた絵が消されてしまう

とにかく入力と描画ができたのでなんかゲームつくりはじめてみる
0809名前は開発中のものです。2006/03/13(月) 20:01:07ID:kuAEAR8Z
gsel ,
0810名前は開発中のものです。2006/03/13(月) 21:32:02ID:SdjQ4hhJ
>>809
サンキュー
これでチラツキを抑えることができる!
0811名前は開発中のものです。2006/03/13(月) 22:03:40ID:HzWMyKDs
企画書とか設計図とかって書いてる?
0812名前は開発中のものです。2006/03/13(月) 22:05:55ID:Lc/l5cjL
意味のある企画書とか設計図とか書けるようになったら、
初心者卒業かと。。。
0813名前は開発中のものです。2006/03/14(火) 00:31:13ID:gjKc/A8O
>>801

マウス座標は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
>>812
「設計」って言葉の意味がわからない。
そんなオレのプログラムはいつも途中で破綻しちゃうのさ・・
0815名前は開発中のものです。2006/03/14(火) 14:18:43ID:cumlLL/U
今STGを作ってるんですが
メインループにあれもこれも積んで
1フレーム中にすごい数の処理をするようになってしまいました

必要な時に呼び出すタスクシステムってのを見たんですが
むずいですね・・・

あまりにソースがごちゃごちゃなんで今1から作り直してます・・
0816名前は開発中のものです。2006/03/14(火) 20:16:51ID:BjyEc4sd
企画書=他人を説得するもの=個人製作には不要
設計図=フローチャートや変数表とか?UMLってやつもそうなのかな

だいたいこんな理解だ
0817名前は開発中のものです。2006/03/14(火) 20:55:57ID:BjyEc4sd
//裏画面
screen 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:BjyEc4sd
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
    
    //裏画面を作る
    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:BjyEc4sd
    //自機操作
    stick 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:BjyEc4sd
スクリーンショット
http://gamdev.org/up/img/5002.jpg

ゲームっぽいふいんき(なぜか変換できない)になってきた
移動中に攻撃(なぜか反応しない)のバグがある

弾や敵をいっぱい出す方法を考え中
>>815で話題にでてたタスクシステムって奴を勉強しないといけないのか……
0822名前は開発中のものです。2006/03/14(火) 23:19:42ID:BjyEc4sd
//裏画面
screen 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:BjyEc4sd
for i,0,10
    bspeed.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
        next
        *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:CsslkguR
疑似タスクシステム思いついた
0829名前は開発中のものです。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
http://gamdev.org/up/img/5015.phps
タスク追加とサブルーチン呼ぶところまでできた
0831名前は開発中のものです。2006/03/16(木) 04:04:18ID:UYzIbXI8
マジな話し、
ズブってなんですか?
ゲーム作るのに金かかりますか?
一般人の俺はゲーム作っていいんですか?
オンラインアクションゲームを作るのは可能ですか?
0832名前は開発中のものです。2006/03/16(木) 10:13:31ID:M0PRq3Kf
俺もタスクやっちゃおっかな
0833名前は開発中のものです。2006/03/16(木) 10:23:03ID:Je4b2YY9
GameDevWikiからシューティングのソースDLしてきて見ながらやってる
すごいまとまってて参考になる
0834名前は開発中のものです。2006/03/16(木) 11:40:58ID:bQj4ToZf
ゲーム作りたい人はやっぱり専門学校に行くのがベストでしょうか?
0835名前は開発中のものです。2006/03/16(木) 11:53:42ID:Je4b2YY9
>>834
ベストじゃないです。
余程の意思がない限り大学に行くべきです。

俺は専門学生ですが。
0836名前は開発中のものです。2006/03/16(木) 18:11:24ID:EYKWwJp5
>>831
釣り乙
0837名前は開発中のものです。2006/03/16(木) 21:49:10ID:gXQpHvOV
>>831
オンラインアクションゲー作りたいよねー
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:gXQpHvOV
//タスク初期化
    gosub *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
//タスクリストの状態表示 全体(Debug用) 最後まで表示されないorz
*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:gXQpHvOV
*task_factory0
    add_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+sJ3
テキストファイルにしてアップすればいいのに
0847名前は開発中のものです。2006/03/16(木) 23:53:12ID:EYKWwJp5
>>846
そんな知能ないんだろ
黙って猿の曲芸を見守ってようぜww
0848名前は開発中のものです。2006/03/17(金) 00:17:11ID:sXFQVN9i
スクリーンショット
http://gamdev.org/up/img/5037.jpg

ソース
>>838-845

画面中央から球が発生して四散するプログラム
画面外に出た弾はフラグたてて後からまとめて削除してるんだけどうまくつくれない
タスクシステムってデバッグが難しいな

>>829の時点でまとめて削除する場合のこと考えてなかったから何か破綻してるのかも・・・・
もう少し弄ってうまくいかなければ一時凍結して他のこと始める予定
一度離れたほうが冷静になれるよね
0849名前は開発中のものです。2006/03/17(金) 00:37:57ID:sXFQVN9i
>>846
2ちゃんに書き込んでおくと時系列で思い出しやすいし備忘録として使える
本当は↓こういうのに連動したアップローダがあればいいのにって思うけどな
http://www.krugle.com/
http://www.koders.com/
http://www.codefetch.com/

見づらいかもしれないから何かいい方法ないか考えとく
gamdevろだはテキスト不許可だしzipにすると解凍まんどくせ
0850名前は開発中のものです。2006/03/17(金) 00:57:18ID:sXFQVN9i
>>847
:;' /:/ `メ、 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:sXFQVN9i
だめだ・・・・難しすぎる・・・・・
0852名前は開発中のものです。2006/03/18(土) 00:09:23ID:UdlfWr/S
#module機能覚えた
でもこれ名前つけられるようになってる意味がわからん
0853名前は開発中のものです。2006/03/18(土) 00:26:22ID:UdlfWr/S
逆に考えるんだ・・・・タスクシステムはいらない・・・・

・・・・ひとつの配列ですべての種類のデータを格納できれば・・・・いらないはず・・・・

配列の増減をDimでするなら・・・・・・ポインタで繋ぐ意味はない・・・・
0854名前は開発中のものです。2006/03/18(土) 01:15:18ID:UdlfWr/S
タスク管理の方法をおおざっぱに3種類にわけてまとめてみた

■タスクシステム
・すべての種類のデータを一つのリスト構造に納めることができる
・データの増減が可能
・HSPで擬似的に実現してるために前者はワーク領域のデータ型が制限される、
・後者は増減時に時間がかかってしまうのでメリットは少ない

■フラグ法
・タスクの利用可否をフラグで判断する方法
・実行時に配列すべてを走査する必要がある
・平均実行時間がタスクリストの最大実行時間と同じ程度になる

■最大値可変法
・擬似的な動的配列を実現する方法
・追加するときは配列の最大値を加算し末尾に代入する
削除するときは削除するタスクに末尾のタスクを上書きコピーし配列の最大値を減算する
・平均実行時間はタスクリストと同じ程度
0855名前は開発中のものです。2006/03/18(土) 02:14:46ID:pDqUPpzt
とりあえず、HSPやってるならタスクシステムは不必要だと
HSP暦1年6ヶ月の漏れからアドバイスだ
0856名前は開発中のものです。2006/03/18(土) 09:15:01ID:UdlfWr/S
了解した
0857名前は開発中のものです。2006/03/18(土) 10:08:17ID:vA7d8xvU
>>854
 HSPは2.6? 3.0からは配列変数は越えた分は自動確保されますよ。いきなり読み込むと
エラーになりますが。
0858名前は開発中のものです。2006/03/18(土) 10:53:43ID:UdlfWr/S
>>857
確認してきた
ほんとだ、スゲー!感動した
>>825>>829>>854あたりの発言は取り消す
根本的に発想を変えなきゃいけないみたいだ
0859名前は開発中のものです。2006/03/18(土) 11:16:12ID:xi+rxGkk
誰かプラグインつくってなかった?
タスクシステムの。
0860名前は開発中のものです。2006/03/18(土) 22:38:18ID:UdlfWr/S
#define MAX 100

turn=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/S
cls 4
repeat
    //裏画面を作る
    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/S
    //自機弾
    if 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/S
    //表画面へコピー
    gsel 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
そんなにタスクが好きならCで組めばいいのに。
一人で作る場合タスクはなくてもなんとかなる。
複数人で仕様も変わる状況への対処法だから。
それよりルーチンを切り分けてモジュール化して
一からやり直すハメにならない方が大事だと思う。
メインループから外注に出せば把握できるでしょ。

とかいって「そんなのは嘘だ!」とか
ここから1000まで叩かれまくったりして…
0866名前は開発中のものです。2006/03/19(日) 02:55:38ID:iAmpuYbz
そんなのは嘘だ!
0867名前は開発中のものです。2006/03/19(日) 07:27:37ID:VCd0X5P4
>>860
 HSP2.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
#define MAX 50

//初期化
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
    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

            //あたり判定
            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:5iZ2gAyz
    dir=ndir

    Color 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:5iZ2gAyz
    benable=0
    
    Teki_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:PMTGalOb
HSPって管理しづらくない?
0874名前は開発中のものです。2006/03/20(月) 08:45:22ID:mOdDXP9C
しずらいけど、HSPは簡単だからいい。
0875名前は開発中のものです。2006/03/20(月) 14:47:22ID:pEmfXrsX
それって矛盾してね?
0876名前は開発中のものです。2006/03/20(月) 15:05:28ID:B4K2jB01
でかい規模のアプリには向いてないってことじゃないの?
0877名前は開発中のものです。2006/03/20(月) 17:45:46ID:piMMOlj9
タスクは色々と後付したり、愉快なシステムを盛り込むのに便利だが
HSPでは速度的に辛い

特にswitchで死ねる
0878名前は開発中のものです。2006/03/20(月) 21:00:31ID:nDP36Kvp
>>873
Pascalみたく宣言部つくって、
定数や変数、サブルーチンを宣言しておけば
けっこう大丈夫じゃない?

いや、もちろんしなくていいんだけど
漏れはそうしてるよ。
0879名前は開発中のものです。2006/03/20(月) 23:23:08ID:jcANfyCO
C++で作ればもっと簡単な気がしないでもない。
やっぱポインタは初心者を遠ざけるのか?
0880名前は開発中のものです。2006/03/20(月) 23:33:27ID:mOdDXP9C
ポインタじゃなくて、導入するまでが面倒なんじゃないかな。
俺がそうだったw
0881ホスプロ ◆HOTsoUpxjY 2006/03/21(火) 00:01:03ID:BzLOQwBY
>>879
GUIが遠ざけるのでは。
0882名前は開発中のものです。2006/03/21(火) 00:11:53ID:jcmOwNd8
確かにコンパイラとか見つけて使えるようにするまでで大変だもんなぁ。

ましてや統合環境が欲しいならさらに使い方を覚えなくちゃいけないな。

GUIはそんなに難しくないと思うけど?
むしろ、GUIに辿り着くまでのが厳しいと思う。
とはいえ、ゲームだからGUIは避けて通れないな
0883名前は開発中のものです。2006/03/21(火) 04:31:56ID:KZa94AFT
>>879=882
簡単に作れる というのと
手軽さ というのは違うぞ。

確かにC++やRubyで組んだほうが最終的には
”カンタン”に済ませられるのはモチロン知っているが
この”手軽さ”はやめられない
0884名前は開発中のものです。2006/03/21(火) 08:51:03ID:TsEgs7Ul
>>868
 気になる点をいくつか。

>//自機
>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
やっぱりタブ2連続だとうまく置換されないや……
置換されなくなるまで同じ操作を繰り返してスペースを&nbsp;に置換完了
■ このスレッドは過去ログ倉庫に格納されています