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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。01/11/07 20:26ID:PFtlmWD9
【参加資格】
ズブの初心者以外お断りです。

なおアドバイス等はプロのかたでも結構です。
初心者は聞く耳を持ちプロもわかりやすく教えてやってください。
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;に置換完了
0887名前は開発中のものです。2006/03/22(水) 08:54:51ID:4wbvXuWa
#define MAX 50 //敵の数最大
#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
            by=cy
        }
    }
    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:4wbvXuWa
            //あたり判定
            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

                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:4wbvXuWa
    //敵弾
    repeat 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:DEs7Ykun
HSPって変数定義とかいらないの?
Cの半分くらいの時間でソース書けるんだが
短すぎて書いた気がしない
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
DXライブラリ触った時、描画関係はHSPとほぼ同じくらいの感覚で扱えるなと思ったよ。
まぁポリゴンとかは出来ないけどさ。
0897名前は開発中のものです。2006/03/23(木) 10:01:54ID:5WNqQ2iY
#define _CRT_SECURE_NO_DEPRECATE
#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:5WNqQ2iY
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                 LPSTR 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
        if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
        {
            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:5WNqQ2iY
        //敵機
        ndir=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
                    Enemy_Fire(cnt);
                }

                //敵が接地したか
                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:5WNqQ2iY
        //敵弾
        for (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:5WNqQ2iY
        if (Teki_Rest <= 10) tspeed=2;
        if (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:5WNqQ2iY
//ステージ初期化
void 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:5WNqQ2iY
    Teki_Rest=MAX;
    invasion = 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:5WNqQ2iY
//起動時の初期化
void 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
>>897
乙。未実装の敵弾以外は普通に動いたよ。
とりあえず、敵のフラグと座標は構造体にしてみては?
0908名前は開発中のものです。2006/03/24(金) 03:47:56ID:r2mkgPf1
    int teki_num=cnt;

    for ( 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:r2mkgPf1
なんだか、ややこしくなってきた
0912名前は開発中のものです。2006/03/24(金) 07:45:58ID:r2mkgPf1
敵のフラグと座標を構造体に書き換えた
座標をxやyで書けるのは見やすくていい
HSPには無いのかな、連想配列で似たようなことができそうな気がするけど

ついに240行にまで増えた
20行平均で貼り付けても12レスorz
5レスごとに3時間ぐらい待たされるから全うpまで6時間以上orz...
0913名前は開発中のものです。2006/03/24(金) 08:28:08ID:4LMnL9n2
拡張子をphpsに変えれば、ゲムデヴあぷろだにもupできるじゃろ
0914名前は開発中のものです。2006/03/24(金) 13:12:48ID:Keoep/nW
>>913同意。
いい加減ウザい。
txtファイルにコピペしてgamdevにうpしろっての
0915名前は開発中のものです。2006/03/24(金) 13:21:58ID:e/LJggH7
どうしてもしたいならソースをうpするスレッドへ
0916名前は開発中のものです。2006/03/24(金) 17:05:17ID:ynvPJr33
>>913-915
そう言ってやるな、せっかくスレを盛り上げてくれてるんだ
それとも藻前らが何かネタを投下できるのか?

まぁ所詮>>909が上げてる程度のコードも書けないやつらの
嫉妬レスなんだろうな(プゲラッチョ
0917名前は開発中のものです。2006/03/24(金) 18:18:58ID:FlQlv7Bv
別にもりあがってないじゃん

>>909ぐらいのコードなら書けなきゃゲ制作には来ないって
0918名前は開発中のものです。2006/03/24(金) 23:21:23ID:kZSgB7pc
盛り上げてるのではなく
荒らしている。
0919名前は開発中のものです。2006/03/25(土) 00:05:23ID:nEkDgcKS
短いソースはともかく、1レスで書けない長いソースは別ファイルをうpするのがマナーだろ。
見にくいし、試せない。書き出さ無きゃならん時点で見る気もうせる。
0920名前は開発中のものです。2006/03/25(土) 00:42:47ID:yYvbrmRQ
>>912 しかし乙
0921名前は開発中のものです。2006/03/25(土) 08:26:50ID:xoont0lh
#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);

//変数宣言
struct stEnemy
{
    int enable;
    int x;
    int y;
};
stEnemy Enemies[MAX];
/*
0922名前は開発中のものです。2006/03/25(土) 08:27:31ID:xoont0lh
*/
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;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                 LPSTR lpCmdLine, int nCmdShow )
{
    if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1;                // エラーが起きたら直ちに終了
    }
/*
0923名前は開発中のものです。2006/03/25(土) 08:28:25ID:xoont0lh
*/
    //初期化
    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;
        }
/*
0924名前は開発中のものです。2006/03/25(土) 08:29:18ID:xoont0lh
*/
        if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
        {
            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));
        }
/*
0925名前は開発中のものです。2006/03/25(土) 08:31:10ID:xoont0lh
*/
        //敵機
        ndir=dir;
        for (int cnt=0 ; cnt<MAX ; cnt++)
        {
            if (Enemies[cnt].enable == 1)
            {
                DrawGraph( Enemies[cnt].x, Enemies[cnt].y, HGTeki , FALSE ) ;

                Enemies[cnt].x = Enemies[cnt].x+dir;
                if (Enemies[cnt].x <= 0) ndir = tspeed;
                if (Enemies[cnt].x >= 602) ndir = -tspeed;

                //あたり判定
                if (benable && (Enemies[cnt].x < bx) && ((Enemies[cnt].x + 32) > bx) && (Enemies[cnt].y < by) && ((Enemies[cnt].y+32) > by) )
                {
                    Enemies[cnt].enable = 0;
                    Score = Score + 10;
                    Teki_Rest = Teki_Rest - 1;
/*
0926名前は開発中のものです。2006/03/25(土) 10:25:51ID:3v7Ny4hZ
>>912
 GamDevPukiWiki( http://gamdev.org/w/?FrontPage )に1ページ作ってそこにソースを書
いてみては? そしてここでは変更部分だけとか議論したいところだけ書き出すと。
0927名前は開発中のものです。2006/03/25(土) 11:26:18ID:nEkDgcKS
ここまで空気読めないと笑うしかないなwwww
0928名前は開発中のものです。2006/03/25(土) 12:22:40ID:Xo5AkaJL
( ^∀^)ゲラゲラ
0929名前は開発中のものです。2006/03/25(土) 15:57:33ID:xoont0lh
C++/DXライブラリ 構造体を利用
http://blog.goo.ne.jp/gamedevhsp/e/e1508c7e7747bb3bfa3118d2be75f58a

ソースをうpできる場所を確保してきました
長いものはこちらにうpします
0930名前は開発中のものです。2006/03/25(土) 16:20:00ID:dp6Fd2gl
HSPって

gcopyやると

チラチラして目が痛いンmだけど対策おしえてくれ!
あと、指定した色透明とかないの?
0931名前は開発中のものです。2006/03/25(土) 16:26:34ID:Xo5AkaJL
>>930
リファレンスと公式のチュートリアルも読めないのか池沼
0932名前は開発中のものです。2006/03/25(土) 20:58:41ID:xoont0lh
中途半端なのでうpしてしまいますね
*/
                    Enemy_Fire(cnt);
                }

                //敵が接地したか
                if (Enemies[cnt].y > 448) invasion = 1;
            }
        }

        if (dir != ndir) {
            for (int cnt=0 ; cnt<MAX ; cnt++)
            {
                Enemies[cnt].y = Enemies[cnt].y + 4;
            }
        }
        dir = ndir;
/*
0933名前は開発中のものです。2006/03/25(土) 20:59:11ID:xoont0lh
        //敵弾
        for (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() ;
0934名前は開発中のものです。2006/03/25(土) 21:31:46ID:dp6Fd2gl

rddraw 0

redraw 1

に挟んだらちらつきなくなりました〜ヤッホー!
第一段階クリアかな。

今、透明探してる。
0935名前は開発中のものです。2006/03/25(土) 23:56:51ID:bTVU6xMs
F1押して出てくるヘルプに
gcopy って打ち込めば関連ありそうなの表示されるよ
0936名前は開発中のものです。2006/03/26(日) 11:29:59ID:erP5z/In
うちのHSPにはrddrawがないよ(´・ω・`)ショボーン
0937名前は開発中のものです。2006/03/26(日) 11:35:24ID:erP5z/In
>>933にコメント入れ忘れたorz

*/
        if (Teki_Rest <= 10) tspeed=2;
        if (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 ;                    // ソフトの終了
}
/*
0938名前は開発中のものです。2006/03/26(日) 11:36:55ID:erP5z/In
*/
//ステージ初期化
void Stage_Initialize()
{
    Stage_Num = Stage_Num + 1;

    ZeroMemory(Enemies, sizeof(Enemies)); //敵
    ZeroMemory(bl, sizeof(bl)); //敵の弾
    
    for (int cnt=0 ; cnt<MAX ; cnt++)
    {
        Enemies[cnt].enable = 1;    //利用中(0=否)
        Enemies[cnt].x = ( cnt * 64 ) % 640;    //X座標
        Enemies[cnt].y = ( cnt * 64 ) / 640 * 64;    //Y座標
    }
    cx=320;
    cy=440;

    benable=0;
    tspeed=1;

    Teki_Rest=MAX;
    invasion = 0;
    Dead = 0;

/*
0939名前は開発中のものです。2006/03/26(日) 11:37:30ID:erP5z/In
*/
    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;
}

/*
0940名前は開発中のものです。2006/03/26(日) 12:18:50ID:erP5z/In
*/
//敵が弾を発射
void Enemy_Fire(int cnt)
{
    int teki_num=cnt;

    for ( cnt=0 ; cnt<EBULLET_MAX ; cnt++)
    {
        if (bl[cnt][0] == 0) {
            bl[cnt][0] = 1;
            bl[cnt][2] = Enemies[teki_num].x+16;
            bl[cnt][3] = Enemies[teki_num].y;
            break;
        }
    }

    return;
}

/*
ここで終了です

開発環境
VC++
DXライブラリ
*/
0941名前は開発中のものです。2006/03/26(日) 12:57:44ID:erP5z/In
>>921-940をコピペしたらコンパイルできるつもりだったのですが
>>933の文頭と文末に*/と/*をつけるのを忘れてたのでその追加だけお願いします
それでコンパイル通ります

外部サイトでも平気な人は>>929に同等のソースがあります
特に理由がなければこちらをどうぞ
0942名前は開発中のものです。2006/03/26(日) 13:06:08ID:5N7smiYS
Boot_Initialize関数が見つかりません><
0943名前は開発中のものです。2006/03/26(日) 13:27:16ID:erP5z/In
//うっかりさんでごめんこりん><

//起動時の初期化
void Boot_Initialize()
{
    HighScore=74;
    Score=0;
    
    HGJiki = LoadGraph( "jiki.bmp" ) ;
    HGTeki = LoadGraph( "teki.bmp" ) ;

    ClsDrawScreen();

    return;
}
0944名前は開発中のものです。2006/03/26(日) 15:01:41ID:5/XI8n21
どうしてここにソースを貼り付けるのか
何度言われてもわかんないの?
0945名前は開発中のものです。2006/03/26(日) 15:08:10ID:0dHxYm65
//うっかりさんでごめんこりん><
だそうです
0946名前は開発中のものです。2006/03/26(日) 15:20:13ID:3eYiH+Hg


やったーーー!!
透明発見 その名はgmode ですーーーーーすすすすslすslすslすlす!!!!!

これはんまさに透明!!!半透明も簡単うあはぁふあhかゆあじゅhjし最高!!!!



次は球を増やしたいんだけど
変数をどんどん増やしていくの大変なんだけど
なんか対策アル?
0947名前は開発中のものです。2006/03/26(日) 23:53:49ID:pcdMut/g
ソース貼りまくって埋め立てか。次スレはいらないな
レス数が900を超えています。1000を超えると表示できなくなるよ。