ページ 1 / 1
スーパーマリコ2 を作りました。
Posted: 2010年6月04日(金) 13:05
by wing
よかったら遊んでみてください。
また、ソースも一緒にアップしましたので、よかったらそちらも
見てください。
http://www1.axfc.net/uploader/Li/so/68591.zip
キー:7777
仕様
全部で11面です。
面のクリアーは、クリアーポイントにタッチ。
コインが100個でハートが一つ増えます。
操作方法
Sキーで決定(スタート)
矢印キーで移動
←、→ + X でスピードアップ
Zキー ジャンプ
感想をいただけるとうれしいです。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月04日(金) 16:57
by ムンバ
こんにちは。
遊ばせて頂きました。
2面の中盤?くらいの、はしごを連発して飛ぶ所で何度も落ちてしまい
今の所は、そこまでしか行ってません。(自分、鈍いので。)
これを、繰り返すとハートマークが1つずつですが増えていきます。
ハートマークの無限増殖法?になりますね。^^
私的には、時間(タイム)が関係無いので楽しく遊べますし
職場のポンコツPCでも、動きがスムーズに見れました。
背景の動きとかも、ゆったりとしていてゆっくり遊べて楽しかったです。
正直な感想は「wingさん、すごいっ!」と思いました。
こちらの、管理人さんや他の方々の製作された作品をやるたびに
だんだん、自分に自身が無くなる今日この頃でした。^^;
ソース、今後の参考にさせて頂きます。ありがとうございます。
自分も、がんばらねばっ!w
製作お疲れ様でした。
意地でも全面クリアしてみます!
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月04日(金) 18:33
by wing
ムンバさん、ありがとうございます。
まだまだ初心者です。ソースやファイルを見ると分かりますが、
龍神録プログラミングの館で勉強し、それが分かる程度です。
みなさんも結構違和感なく読めるのではないでしょうか。
ゲーム全体にいえることですが、Xキーを押しながら走ったり
ジャンプしたりしなければならないところがたくさんあります。
私もゲームは苦手なんで、例えば3面でゲームオーバーしたら
1面に戻らなければならないというのは苦痛なので、どこからでも
やれるように自分の都合で作っています。
ぜひほかの面もやってみてください。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 01:39
by ookami
全クリしました!ネタバレ含みます!
ステージにかならず1箇所難しいところ(プレーヤーを殺しにくるところ)があって、その直後にゴールがあるなど、なかなかスルドいレベルデザインですね。
動く床も、乗れたり潰されたり円を描いて動いていたり、作りこまれてるなと感じました。(潰される判定はちょっと厳しいかも?)
ソースコードですが、多くの処理がswitch(stage_num)で分岐する点が印象的でした。
似たパターンのソースコードが何度も出てくるので、私なら適当にまとめてしまいますね。ただ、このように冗長に書いておくのもメリットがあります (1面での修正が他の面に絶対に影響を及ぼさない。これは場合によってはすごいメリットになる) ので、好みの問題と言っていいと思います。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 10:19
by wing
ookamiさん、ありがとうございます。
動く床は私はリフトと呼んでいますが、当たり判定は相当試行錯誤しました。
キャラが一番高いところからリフトの上に着地する時、キャラのスピードは
16.0f を少し超えます。キャラはリフトにめり込むのでそれをリフトの
上へ戻していますが、めり込んだ時に"キャラがリフトに横から当たった時の
当たり判定"されてしまうので、影響がなくなるまで判定を甘くしました。
graph.cppは、switch(stage_num)で分けました。
それぞれのstageでてんとう虫やハチ、リフトのMAXが違うので、
for文の効率がいいかなと思いました。
もうクリアされたんですか。
リフトが入り組んだところはテストプログラムを作って、何度も
位置調整をしてぎりぎりで通かできるようにしたつもりなんですが。
感想ありがとうございました。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 10:32
by kai
遊ばせてもらいました。
なかなか凝ってて面白かったです。
簡単なバグ報告のみしときます。
①敵にあたる瞬間にジャンプボタンを押して死ぬと
リトライ後(全滅してから、新しく面から始めた時も含む)、
スタート直後はキーが初期化されておらず、いきなりジャンプしてから始まるようです。
②四角い物体に挟まれた時に壁にめり込むバグがあります。(スクリーンショット参照)
抜け出せないのでゲームを強制終了するしかないです。
③非常に細かい点ですが、死んで画面がフェードアウトした瞬間、
恐らくDrawFormatStringで書かれたと思われる文字が消えてしまいます。
見た目的にも、消さないほうがよろしいかと。
また、その死んだ瞬間にライフも減ってるのが確認しましたので
フェードアウトして完全に画面が真っ暗になったときに
-1したほうがいいんじゃないかなぁ
なんて思いました。
制作お疲れさまでした。
>ムンバさん
>こちらの、管理人さんや他の方々の製作された作品をやるたびに
>だんだん、自分に自身が無くなる今日この頃でした。^^;
非常にその気持ち、よく分かりますw
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 11:05
by wing
kaiさん、バグの報告ありがとうごさいました。
ソースも見れると思いますので、、、。
lift.cpp の
// キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy < 0.0f){
*Flag = 4;
ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
ch.vy = 1.0f;
if(wallY == 1)
ch.flag = 0;
}
if文の中で
ch.vy < 0.0fをch.vy <= 0.0f で直りました。
最初はこうなっていたとはずなんですが、当たり判定を調整しているうちに不都合があったので
= を消したんだと思うので、もう一度当たり判定全体を検証してみたいと思います。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 11:37
by wing
>ch.vy < 0.0fをch.vy <= 0.0f で直りました。
こうすると、リフトとキャラが横から当たった場合に
影響しますので、直りましたは間違いです。
もう少し検討してみたいと思います。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 12:53
by wing
めり込むバグを修正しました。
http://www1.axfc.net/uploader/Li/so/68680.zip
キーは7777
修正したのは
// キャラの上にリフトがある場合:ブロックとリフトに挟まれた時
if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy == 0.0f){
if(wallY == 1 && MoveX == 0.0f)
ch.flag = 0;
}
// キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy < 0.0f){
*Flag = 4;
ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
ch.vy = 1.0f;
if(wallY == 1)
ch.flag = 0;
}
キャラの上にリフトがある場合:ブロックとリフトに挟まれた時 を
キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合 の
上に足しました。
たいへん申し訳ありませんでした。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月05日(土) 14:37
by wing
アップしなおしました。
http://www1.axfc.net/uploader/Li/so/68690.zip
キーは7777
リフトの判定はじっくり再考したいと思います。
とりあえずこの辺で妥協します。
興味のある方はリフトの当たり判定を変更してみてください。
もうしばらくアップしておきます。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月06日(日) 01:13
by wing
lift_check関数を次のようにしたらうまくいきました。
void lift_check(float *X, float *Y, float MoveX, float MoveY, int *Flag){
*Flag = 0;
// キャラの右にリフトがある場合
if(abs(ch.x-*X) < CHIP_SIZE-8.0f && abs(ch.y-*Y) < CHIP_SIZE/2+CHAR_H/2-8.0f && ch.x < *X && ch.vx >= 0.0f){
*Flag = 2; // テストプレイの時、当たり判定があっているか調べる時に使った
if(ch.vy < 6.0f){
ch.x -= CHIP_SIZE-8.0f-abs(ch.x-*X)+MoveX;
if(wallX == -1)
ch.flag = 0;
}
}
// キャラの左にリフトがある場合
if(abs(ch.x-*X) < CHIP_SIZE-8.0f && abs(ch.y-*Y) < CHIP_SIZE/2+CHAR_H/2-8.0f && ch.x > *X && ch.vx <= 0.0f){
*Flag = 3;
if(ch.vy < 6.0f){
ch.x += CHIP_SIZE-8.0f-abs(ch.x-*X)-MoveX;
if(wallX == 1)
ch.flag = 0;
}
}
// バグの修正:下のif分を追加して解決:-4.0fに注目
// キャラの上にリフトがある場合:ブロックとリフトに挟まれた時
if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2-4.0f && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy == 0.0f){
if(wallY == 1 && MoveX == 0.0f) //↑
ch.flag = 0;
}
// キャラの上にリフトがある場合:ジャンプしてリフトの下辺に当たった場合
if(abs(ch.x-*X) < CHAR_W/2+CHIP_SIZE/2 && abs(ch.y-*Y) < CHAR_H/2+CHIP_SIZE/2 && ch.y > *Y && ch.vy < 0.0f){
*Flag = 4;
ch.y = *Y+CHIP_SIZE/2+CHAR_H/2;
ch.vy = 1.0f;
}
// キャラの下にリフトがある場合
if(abs(ch.x-*X) < CHIP_SIZE/2+CHAR_W/2-2.0f && ch.y+CHAR_H/2+1.0f > *Y-CHIP_SIZE/2 && ch.y < *Y && ch.vy >= 0.0f){
*Flag = 1;
ch.y = *Y-CHIP_SIZE/2-CHAR_H/2+MoveY; //ok
ch.vy = 0.0f;
ch.JumpFlag = 0;
if(CheckStatePad(configpad.shot) == 1)
ch.vy = -JUMP_SPEED;
if(wallY == -1)
ch.flag = 0;
}
if(*Flag == 1){
if(CheckStatePad(configpad.left) == 0 || CheckStatePad(configpad.right) == 0){
ch.vx = MoveX;
}
}
}
ダウンロードしてくれた方、ありがとうございました。
削除します。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月06日(日) 10:58
by けんたろうちゃん
気になります。
やってみたかった・・・
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月06日(日) 11:40
by wing
けんたろうちゃんさん、またアップします。
よろしければ遊んでみてください。
リフトの当たり判定をまた変えたので、今度こそ大丈夫だと思うんですが。
kaiさんに指摘されたこともいくつか直しています。
また、ソースも一緒にアップしますので、ソースの分からないとこの質問も歓迎です。
http://www1.axfc.net/uploader/Li/so/68787.zip
キーは7777
data,include,map,sourceのそれぞれのフォルダを使えば、プロジェクトが
作れるので、もっといい作品に仕上げてもらえればうれしいです。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月08日(火) 10:09
by けんたろうちゃん
ありがとうございました。
ソースコードとても参考になります。
Re:スーパーマリコ2 を作りました。
Posted: 2010年6月08日(火) 20:12
by wing
けんたろうちゃんさん、DLありがとうございます。
ソースコードはもっと効率のいい方法を見つけたら
どんどん改良してください。
分かりにくいところの質問も歓迎します。