仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。 2025年からzennに移行

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

技術解説「ぽんこつ自動車」

技術解説「ぽんこつ自動車」その4 見えないところに手をかけない

お待たせしました!

久々の技術解説ですね!


とはいえ、そもそもこのコーナー楽しみにしている人はいるのでしょうか・・・(泣)



ま自分のためにやってる部分もあるんで別に寂しくなんかないです・・・・全然・・(ノ_-。)



さて今日は技術解説というより、プログラミングしているときのちょっとしたコツみたいなものを書いてみます。


以下のプログラムはポンコツ自動車のタイトル画面のプログラムです。


マウスポインタをかざすと「GAME START」の文字が大きくなるプログラムです。



repeat -1
await 25
redraw 0
pos 0,0:gcopy 11,0,0,640,480
ifrvdhus=0
if mousex<270:if mousey<373:if mousex>120:if mousey>350:ifrvdhus=2
color 255,255,255:font "MS ゴシック" , 18+ifrvdhus*4 , 1
pos 120-ifrvdhus*5,350-ifrvdhus*2:mes "GANE START"
font "MS ゴシック" , 15
pos 230,460:mes "ハイスコア "+最高+""
getkey key,1:if key:if ifrvdhus:break
redraw 1
loop


ま、人のプログラムなんで見にくいと思いますが・・・


マウスポインタが一定の範囲内にあるとifrvdhusって変数が2になるプログラム


if mousex<270:if mousey<373:if mousex>120:if mousey>350:ifrvdhus=2

という部分に注目してください


これは、文字が大きくなっても小さくなっても、ポインタ当たり判定の範囲が同じ大きさである、ということを意味してます。


実はこれ、手抜きなんです!


本当は、文字が大きくなったら、その分だけポインタの当たり判定範囲を大きくしないといけないのですが、

ちょっとくらいなら誰も気づかないだろう、と思って・・・手を抜きました(笑)



でもこれはプログラマーにとって必要なスキルでもあります。


納期が迫っているのに、誰も見ないようなどうでもいいところに時間をかけているようでは


作業の遅いプログラマーと思われてしまって、いいことが一つもありません。


これでは肝心なところが完成せずに結局ゲーム開発中断、ということになりかねません!


面倒なところや時間がかかる割には誰も評価してくれなさそうなところは(自己満足のためなら別です)


迷わず手を抜きましょう!


しかし、それでは手抜きばっかの必要最低限のことしかできないプログラマーと思われてしまうので

自分の得意分野とするところには時間をかけて、ゲームのクォリティを上げることも大切です。


次回:ついに自作ゲーム2作目公開?

技術解説「ぽんこつ自動車」その3 フェードアウト

技術解説って回を重ねるごとに、簡単になっていく気がします・・・


最初のほうなんか、3平方の定理の応用とか凄いことやってましたよね・・・


今日はきっと一番簡単です!


画面をフェードアウトさせるプログラムについて解説します。


フェードアウトとは、最初画面がうっすらと暗くなり、だんだん濃く暗くなり、もっと濃くなり、最後には真っ黒になる。この一連のことを言います。

これができるだけでゲームの見栄えがかなり変わってくるものです。


必要なものは、grectという命令とフェードアウトさせる画面


最初、フェードアウトさせる画面を別のバッファにコピーします


例、buffer 1,640,480,0:gcopy 0,0,0,640,480 ;バッファID1に現画面(ID0)をコピー


次にフェードアウトさせるフレーム数を考えます。だいたい16くらいがちょうどいいです。


毎フレームの手順としては、①バッファID1を現画面にコピー、②grectで真っ黒の画面を半透明コピー、③フレームが進むごとに半透明率を上げていく。


repeat 16

pos 0,0::gmode 0 ;①

gcopy 1,0,0,640,480 ;①

color 0,0,0:gmode 3,640,480,a+16 ;②

grect 320,240,0,640,480 ;②

a+=16 ;③

redraw 1

redraw 0

await 26

loop


こんな感じになります。


変数aを省略したいならgmode 3,640,480,a  gmode 3,640,480,16*cnt+16


に替えればおkですね。


注意すべき点はaが256を振り切らないようにすることです。


256を振り切るとたまに思わぬバグが発生します。


もしフェードアウトさせるフレーム数が16では足りなく32とかにする場合は

16*cnt+16 を 8*cnt+8
してください。


次回:1億桁×1億桁の開発状況報告②

技術解説「ぽんこつ自動車」その2 GAMEOVER関数

GAMEOVER画面みました?


なかなか面白いプログラム使ってるんですよあれ!


49b49c87.png

GAMEOVERの文字が上から滑らかーに落ちてきて、下で一旦停止して、上に滑らかに戻って、また真ん中で停止する。


実は、あのプログラム毎フレーム毎フレームの座標を計算で出してるんです。


それもy=t・sinωtの式を使うだけで一発で作れます!


図を見てくれれば分かりますが、

tに時間を代入すれば、計算式よりyが算出されます。


yはそのまま座標として使えるので


pos 160+cnt*45,160+int(3.0*double(sreg)*sin(0.038*sreg))

座標指定はこんなプログラムになってます。


doubleは無視して考えてください

sregがtだと考えて

0.038がωだと思えば

t・sinωt

の式に見えてきませんか?


実際sregにはフレーム数が代入されています。


右側の文字ほど遅れさせたいなら、sregにフレーム数の値を代入するときに

右側の分だけ1とか2とか引けば、図のような(後ろにくっついてくるような)感じに出来上がります


sin cos の使いかたって、結構多彩なんですね!

何か滑らかにグラフィックを移動させたいなんて場合にはsin cos をつかってみるのもいいでしょう。

技術解説「ぽんこつ自動車」その1 自動コース作成プログラム

このゲームのプログラムの特徴は何と言っても、「スクロール」


前のフレームの画面を左に10ドットずらしてコピーすれば

あとは


ここの10×480ドット部分だけboxf命令でステージを作成すれば完成。
766776f6.png

これを、ループさせるとステージが進みます。


とても簡単


当たり判定は背景の色で確認しているので、障害物1つ1つの座標なんかも気にしないでok!


つまり障害物用の変数を作らなくて良い、とてもプログラマーに優しいゲームなんですね!


障害物の作り方も簡単。


ここの10×480ドット部分で、boxf命令でステージを作った後、一定確率でまた、boxf命令で四角を作ってあげればいいんですね。


color 200,200,20:boxf 630,0,640,480 ;緑の背景を作成

color 0,0,0:boxf 630,a,640,a+100 ;黒の道を作成

if rnd(50)=0:b=rnd(80):color 200,200,20:boxf 630,a+b,640,a+b+20 ;50分の一の確率で10×20ドットの障害物を作成


メインルーチンはこんなもんです。

aという変数は黒の道の一番上のy座標が代入されている変数です。


これを増減させることで、道も上下します。


道の幅も変化させたいなら100の部分を変数に置き換えてやれば、自分の思い通りにできます。


次回:技術解説「ぽんこつ自動車」その2 GAMEOVER関数

プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ