へっどめにゅー
  • TOP
  • RSS
  • ABOUT
  • ツイッター
  • リンク集
1: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:43:04 ID:matorai
立ったら書く


引用元:http://hayabusa.2ch.net/test/read.cgi/news4vip/1391431384/

3: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:43:37 ID:matorai
よし立った


7: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:45:36 ID:matorai
どうせHello,Worldとかお前ら見飽きてるだろうからSTG作るぞ。

C言語とかじゃスレ内で終わらんだろうし
RubyとかPython使ってもいいんだがアンチ覚悟で今回はHSP使うぞ


8: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:46:07 ID:uASN+gfI0
>>7
簡単に違い説明下しあ


9: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:47:49 ID:matorai
>>8
Cは冗長だし、ややこしい概念の説明に時間がかかりすぎる。
RubyやPythonはCよりは楽だけど
まず外部ライブラリ入れる説明に時間掛かるし、バージョンで対応がまちまちだから
簡単なのなら手っ取り早いHSPでも使うかみたいな感じです。


10: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:48:36 ID:matorai
取り敢えず
http://hsp.tv/idman/download.html
こっからFree DownLoad HSPっての押してインストーラー使って入れてくれ。


11: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:48:43 ID:o7cUJf9s0
Unityなら10分で作れる


12: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:49:56 ID:matorai
>>11
すまんUnity使った事ない。

で、入れ終わったら取り敢えずHSPスクリプトエディタってやつ開いてくれ。


14: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:51:48 ID:matorai
取り敢えずHello,World.だけは表示させておいたほうが良いかと思うから
1|[EOF]ってところに
print"Hello,World."と書いてF5押してみてくれ。
多分Hello,Worldって表示されるはず


15: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:54:05 ID:uASN+gfI0
ゲームでプログラミングっつったら清永光るじゃん


16: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 21:55:19 ID:matorai
>>15
正月にあったな

スレ立てて放置も問題だろうから需要なくともある程度は進めます。
今のHello,Worldが出たウィンドウがあると思うけどそれは消してもう一回エディタの方開いて、
取り敢えずメインループから作っていこう。
repeat
title""+cnt
await 16
loop
これ書いて実行したら多分ウィンドウのタイトルが1秒間に60ずつ増えていくと思う。
もうこれでメインループは閑静だ


20: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:03:24 ID:matorai
次は自機を出して動かしてみるぞ、
さっきのコードを
x = 300
y = 200
repeat
redraw 0
color 0, 0, 0 : boxf
color 255, 0, 0
boxf x-16, y-16, x+16, y+16
await 16
redraw 1
loop
こうすると黒い背景に赤い■が出ると思う。
これを自機として進めていく。
color 0, 0, 0 : boxfはループの頭に入る画面初期化処理、redrawはちらつき防止の命令だからこう書いとくって
覚えとくだけで問題なし。
x,yは今の自機の場所を表していて、今xは300,yは200になっている。此処らへんは後で説明する


21: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:06:58 ID:matorai
すまん
自機描画処理の説明忘れてた
boxf x-16, y-16, x+16, y+16っていうのは、
今は
300-16, 200-16を始めとして、
300+16,200+16までの矩形(■)を指定した色で塗りつぶすという命令です。
その前にあるcolor 255, 0, 0で色を指定しています。
これはRGB値なんだけど、RGB値はわかると思うので省略。


25: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:13:39 ID:matorai
さっきのままだとx,yとせず300,200と直で書いた方が早そうだが、
それだと状況に応じてキャラを表示する場所を変えられなくなるから、
x,yという可変の値にしてるんだが、まあ取り敢えずx=300の前に
#module
#deffunc move var x, var y
stick key, 15
if(key&1) : x -= 2
if(key&2) : y -= 2
if(key&4) : x += 2
if(key&8) : y += 2
return
#global
を追加して、
color 255, 0, 0
boxf x-16(ryの間に
move x, yを追加してみてくれ。


26: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:15:32 ID:matorai
おっとスペースが消えてしまってるがまあいいかすまん


28: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:19:10 ID:matorai
1つ1つ解説していくぞ。
#deffunc moveっていうのは
自機の移動の処理をまとめたものをmoveと書くとやってくれるようになる機能です。
#deffuncから
return
までがmoveという名前1つで実行されます。が、
これをすると#deffunc~returnの中にx,yがないので使えません(中にあるものしかつかえません)
なので、var x, var yと書いてやっています。
これをすると、move内でもx,yを使えるようになります。


29: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:21:16 ID:matorai
さて中身だが、
stick key,15と書かれているのがあると思うが、
これは、どのキーが押されているかを数字で返してくれる。
で、このキーを判別するのに固有の値が使われていて、
各アローキーが、←↑→↓の順に1,2,4,8となっている。


31: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:23:43 ID:matorai
で、key&数字とすると欲しいキーが押されているかを教えてくれる。
if分は、()の中に書かれたものが正しいかどうかを判別して、正しければ:の後のコードを実効する。
この場合、key&数字の数字が押されている場合、
x--等が実行されて、x=300などがx=299等になる。
++,--というのは、今の値+1,-1を意味している。


32: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:25:27 ID:matorai
ミスだこっちのコードと違いがあったすまん
--,++の説明は無しで頼む


34: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:29:04 ID:matorai
次は敵を作ろうと思うが、
正直簡単なものなら普通のSTGより弾幕の方が遥かに簡単なので弾幕でいこうとおもう。
今回、敵をenemyとし、敵の場所を示す変数をenemy_x, enemy_yとして書いていきます。
取り敢えずこんな感じの作りたいみたいなイメージを貼っておくけど自分で作ってから見たいという人は
見ないように。
https://www.dropbox.com/s/8vsdiornx4q8x56/enemy.zip



36: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:29:55 ID:rSyaSehM0
これは期待
でもHSPよりもいいのがあったんじゃないか?


37: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:32:59 ID:matorai
>>36
確かにDXRuby,Ruby/SDL,pygame辺りでも良かったかもな。
個人的に一番早く書けそうってのも理由だったから
もし終わった後需要あればちょっとだけ他言語で書いてソースだけでも載っけとくか。
で、取り敢えず
x=300
y=200
の一つ下に、
enemy= 1
enemy_x=300
enemy_y=16を追加してくれ。
出来れば
半角スペースを使って=の頭を揃えた方が良いと思う。


38: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:34:10 ID:uASN+gfI0
これ打ち終えたらゲームが完成してるの?


44: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:39:18 ID:matorai
>>38
取り敢えずある程度のゲームは完成しますよ。
どちらかというとゲームのシステムがですが。

次いきます。
次に、追加忘れですが、
もう一つetime = 90を追加してください。


40: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:36:58 ID:matorai
以降はこれを敵関連の座標として、
次に敵弾も作っていきます。自機弾も作成しても良いのですが、殆ど自機と一緒なので先に敵弾から。
敵弾は多分32個ぐらい出すので、
dim eshot, 32
dim eshot_x, 32
dim eshot_y, 32
dim eshot_mx, 32
dim eshot_my, 32
と書いて欲しい。
これで、
敵弾があるかどうか。敵弾x座標,敵弾y座標,敵弾の進行x,敵弾の進行yを表します。
進行座標は、あとで大切になってくるのでその時に説明します(move x, move yの略です)


43: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:39:16 ID:sXe3iAVf0
JavaScriptで中点変位法すらも出来ない俺でも出来ますか?


46: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:40:53 ID:matorai
>>43
全く問題無いです。
etime = 90はenemy_yの次の行に。
これは敵が弾を出すまでの間の時間とします。


47: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:44:19 ID:matorai
次、少しdimの説明します。
dim eshot, 32とすると、
shot(0)からshot(31)まで、別の数値を持たせることが出来ます
shot(0) = 30
shot(5) = 50
print shot(0)
print shot(5)
とすると、
30
50
と表示されます。
これにより、
eshot0 =
eshot1 =
といった冗長な事を書かなくて済むようになります。


49: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:49:10 ID:matorai
取り敢えず誰かわかってる人も余り口にしない様に。
で、次はいよいよ敵弾を作成します。
今のソースはこんな感じになっているとOKです。
no title

取り敢えずcolor 0, 0, 0 : boxfの次の行に、
if(cnt\etime == 0){

}
と書いてください。
これは、90F(1.5秒)事に実行されることになります。
cntはrepeatで繰り返された回数で、\は割り算の余りを出します。
つまりループ回数が90の倍数になる事に実行されます。


51: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:51:00 ID:cVCiaePj0
ツクール歴10年だけど
読んで全くなにも分からなかった
俺は泣いた


53: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:53:09 ID:matorai
>>51
説明わかりにくかったらすまん…
PC版ツクールのXP,VX辺りのRubyとかツクール5やってたら一発でわかるはずだから
説明不足かもしれん…
で、取り敢えず
このifの{

}の中に
repeat 8

loop
と書いてください。


56: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:55:27 ID:cVCiaePj0
>>53
スクリプト系さわってりゃ良かったんだろうが2000一筋だった
タイヘンダナーって思いながらちら見しとく


54: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:53:40 ID:matorai
すまんやっぱり説明不足か何処ら辺説明したほうがいい?


55: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:55:16 ID:xb/+gFZ70
>>54
#moduleとか#globalがなんのこっちゃい


57: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:56:22 ID:matorai
>>55
ああ、
#moduleと#globalっていうのは、
#deffunc~returnは単体で使うとエラー出るから、その間を塞ぐ決まり文句みたいなもんとして捉えてもらってOKです。
実際普通にプログラミングする上では大した意味合いないです。


58: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:57:36 ID:xb/+gFZ70
>>57
なるほど、おまじないか
ありがとう


59: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 22:58:49 ID:matorai
*move
stick key, 15
if(key&1) : x -= 2
if(key&2) : y -= 2
if(key&4) : x += 2
if(key&8) : y += 2
return
っていう書き方をして
move x, yをgosub*moveって書くことも出来るんだけど、
この書き方より#deffunc使ったほうが色々と面倒がないので、
(例えば*moveの方だけど、中でkeyを使うと*moveじゃないところまで影響が及ぶけど、
#deffunc内でkeyを使っても外とは隔離されているので影響なし。)


63: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:03:56 ID:matorai
さて、本題に戻ります。
repeat 8

loopの中で敵弾を作ります。
そのために、eshotの中身を確認して、今ある弾か、消えている弾かを判別します。
eshotが0の時、消えている。1の時、存在しているとします。
(ココらへんはHSPにtrue,falseの概念が無いので代替しています)


64: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:05:39 ID:matorai
このために、中身検索処理を作ります。
repeat 8

loop
の中に、
find = -1
repeat 32
if(eshot(cnt) == 0) : find = cnt : break
loop
と書きます。今からこれの説明をします。


66: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:08:59 ID:matorai
まず、検索して見つけるという意味で、結果をfindの中に入れます。
findが-1の時は見つからなかった。それ以外の時はその数値が空いているとして、
まずeshotの分だけループします。
(本当は「repeat length(eshot)」推奨です。)
その後に、もしeshot(cnt) == 0、つまり、今調べているeshotの値が空きであれば、
findにループ回数を入れて、このループを中止します(これ以上調べる必要が無いため)


68: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:12:42 ID:matorai
わかりやすく書くと
find = -1 //初期化
repeat length(eshot)
if(eshot(cnt) == 0){ //もしいま調べている敵弾が使用されていなかったら
find = cnt //findにメモ
break //repeat-loopを抜ける
}
loop
こんな感じです。わかりますかね?


71: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:17:39 ID:matorai
で、これでもしfindが-1(見つからなかった)ではない場合、敵弾を出します。
repeat 8

//findの処理がここにはいる

if(find != -1){

}
loop
と書いてください。
find処理とloopの間です。


72: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:19:57 ID:matorai
で、
eshot(find) = 1
eshot_x(find) = enemy_x
eshot_y(find) = enemy_y
と書いてください。
これで、敵弾が出現して、敵の位置から敵弾を発射します。


73: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:22:32 ID:matorai
で、ここで1つ追加を。
repeat 8の一つ前、
if(cnt\etime == 0){の下に、
ang = 0を追加してください。これは弾の発射角となります。
で、ちょっとまた修正で申し訳ないですが、
y = 400
enemy_y = 128にお願いします。


75: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:29:24 ID:matorai
で、eshot_y(find) += enemy_yの下に
ang += 45と書き、その下に、
eshot_mx(find)= sin(deg2rad(ang))*3
eshot_my(find)= cos(deg2rad(ang))*3
こう書いてください。
これの説明を今からします。


77: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:32:35 ID:matorai
これは、サインコサインを用いて、45°感覚で敵弾を出すためのコードです。
先ず、angで+45°し、sin,cosを使うためにラジアン値に変換します。
x座標はsin値、y座標はcos値を使うとOKです。
講座開いた身で申し訳ないのですが、私自身これは感覚で使っています。
三角関数は三角関数なのですが、要は好きな角度をdeg2radを通した後にxはsin,yはcosを使うとその方向への値が帰ってきます。
しかしこのままでは遅すぎるため、*3で速度を三倍にしています。


78: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:34:15 ID:matorai
ここらへんについては、STG 三角関数
などで調べれば欲しい種類の弾の資料が沢山出てきます。
私はこの亜種と自機狙い弾しか基本的に使っていないので、作りたいものに合わせて各自で調べていただければ
幸いです。自機狙い弾の紹介の前にこれの描画処理を書きたいと思います。


80: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:35:44 ID:matorai
では当たり判定を除けば最後、敵弾描画ですね。
これも凄い単純な理屈で、弾の数分だけループしてやって、もし弾が存在するなら
x,yにmx,my分を足してやるだけでOKです。


81: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:38:20 ID:matorai
動かした後にわからんかったら質問は出来る限り答えます。
取り敢えず>>80を実現するソースは以下となります。
repeat length(eshot)
if(eshot(cnt) == 1){
eshot_x(cnt) += eshot_mx(cnt)
eshot_y(cnt) += eshot_my(cnt)
color 255, 255, 0 : boxf eshot_x(cnt)-8, eshot_y(cnt)-8, eshot_x(cnt)+8, eshot_y(cnt)+8
}
loop
繰り返した後に、あるかどうかをifで判別。
その後color命令で黄色を指定してやって、その後にboxfで描画です。


83: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:39:12 ID:matorai
が、これを実行すると、弾切れを起こすので、
color 255, 255, 0 ~(ryの前の行に
if(eshot_x(cnt)<0 or eshot_y(cnt)<0 or eshot_x(cnt)>>640 or eshot_y(cnt)>>480) : eshot(cnt) = 0
これを入れてやってください。


85: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:40:20 ID:matorai
これは、
敵弾が画面外(このウィンドウは横640px,縦480pxになっています)に出ると、
消す(0にする)処理です。
orでつなぐことによって、書かれた条件のいずれかがあっていたら、その先の:以降の命令を実行してくれます。


86: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:42:14 ID:matorai
多分これを実行すると、敵が見えないですが、敵弾が飛んでくるはずです。




88: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:44:19 ID:matorai
あ、あと、リアルタイムで更新しているソースがこちらなので、
必要であればDLしていただければわかると思います
https://www.dropbox.com/s/px0e6wiszt28c1t/code.hsp


89: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:47:06 ID:matorai
取り敢えず今日はここまででよろしいでしょうかね?
解説書いてて寝落ちの危険性が…
よければあしたの22時半頃に続きのスレを立てます。
今日の時点でのまとめは追えなくなるかもしれないので今日置いておきます。


90: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:49:37 ID:e/MG1eTX0
日本語でおk
もしくはCで


92: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:51:40 ID:matorai
>>90
やっぱりわかりにくかったか…すまん。何分こういうの初めてなもんで

じゃあ明日にします。
明日立てるときは、
「昨日に続き簡単なSTG風ゲームプログラミング講座やる」かなんかで立てます。
本当に中途半端ですが、残すはもうちょっと弾幕らしい弾幕と、当たり判定のみなので、明日は早く終わると思います。
あと、今回のソース、etimeの値を変えると面白いことになるはずです。


94: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:54:46 ID:x4JBhsXw0
>>92
なんでここで書こうと思ったのか


95: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:56:52 ID:matorai
>>94
ム板でやるには場違い過ぎるしたまーに立ってるしvipで。
と思ったところからはじまって折角なら
じゃんけんやHello,WorldやFizzBuzzは書き飽きてるだろうと思ってじゃあSTGでするかってかんじです


93: 以下、名無しにかわりましてVIPがお送りします 2014/02/03 23:53:25 ID:matorai
取り敢えず今日のコードとか丸々入ったzipです
(Dropboxフォルダ移動だけで終わるから安定しない)
http://www.dotup.org/uploda/www.dotup.org4847050.zip


96: 中卒無職 2014/02/03 23:57:03 ID:M2OOYzCq0
いったいどのような人をターゲットにしていたのか分からんが





   

オススメ記事一覧

コメントする
名前
コメント

※ブラウザはchromeもしくはfirefoxでお願いします。
  • コメントがありません
コメントする
名前
コメント

管理人への要望やコメントで言えない事などはコチラへどうぞ。

名前
メッセージ


スポンサードリンク

...

人気記事

お知らせ

このブログについて


相互リンク募集中です!

RSS・相互リンクはメールにてご連絡ください!

メールアドレス
ennenu1998@gmail.com

カテゴリー別アーカイブ

月別アーカイブ

おススメ記事

免責事項

公開されている文章・画像・動画は、各関連企業や団体とは一切関係ありません。使用している版権物の知的所有権は、それぞれの著作者・団体に帰属しております。著作権所有者様からの警告及び修正、撤去のご連絡があった場合は、迅速に対処、又は、削除致します。
アクセスランキング ブログパーツ

他サイト人気記事