HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0630
FUJIマップスクロール4解決


FUJI

リンク

2007/6/30(Sat) 17:12:35|NO.9194

こんにちわ。
今マップスクロールで凄く悩んでいます。

x=キャラの位置
window=ウィンドウの横幅
map=マップの最大幅
blank=マップスクロールが始まる位置

これらの変数を上手く駆使して出来ないでしょうか。
やっぱりこれだけで作るとなると大変でしょうか。

キャラを画面の真ん中に固定してスクロールするのは簡単ですが
キャラが画面の中程にいる場合は画面を固定して
画面の端の方に行くとスクロールが始まる。
みたいな感じです。

画面の真ん中に固定して動かす方法は出来ましたが
やっぱりこう言う方法が良いと思っているんです。

質問の仕方が明確では無いかも知れませんが
誰か分かる方教えて欲しいです。



この記事に返信する


eller

リンク

2007/6/30(Sat) 20:02:40|NO.9195

FUJIさん、こんばんは。
残念ながら(私の知る限りでは)FUJIさんが挙げた変数だけでは実現はできません。
画面のスクロール量を保存する変数が別途必要になります。

> キャラが画面の中程にいる場合は画面を固定して画面の端の方に行くとスクロールが始まる
というのがなんとなくわかったので、スクリプトを用意してみました。
cameraX, cameraYがスクロール量を保存する変数です。

// サンプルスクリプト
#const WAIT_TIME 3 // ウェイト[10ms] #const SPEED 5 // 移動スピード #const CHARACTER_SIZE 5 // キャラクタの描画サイズ screen 0, 480, 240 x = 0 : y = ginfo_winy / 2 // キャラクタの位置 cameraX = 0 : cameraY = 0 // 画面左上のマップ上での位置(=スクロール量) mapWidth = 750 // マップの幅 blank = 100 // マップスクロールが始まる位置 // 適当にマップを準備 buffer 1, mapWidth, ginfo_winy repeat 20 hsvcolor rnd(192), 100, 255 boxf rnd(ginfo_winx), rnd(ginfo_winy), rnd(ginfo_winx), rnd(ginfo_winy) loop gsel 0 // ★メインループ★ *main gosub *moveCharacter // キャラクタを動かす gosub *setCamera // 描画する位置を決める gosub *draw // いろんな描画処理 wait WAIT_TIME goto *main // キャラクタを動かす *moveCharacter stick key, 5 : speedX = SPEED * ((key >> 2 & 1) - (key & 1)) x = limit(x + speedX, 0, mapWidth) return // 描画する位置を決める *setCamera // (x - cameraX)が画面上でのキャラクタの位置になる if x - cameraX < blank { // キャラクタがblankより左側に移動した場合、カメラを移動させる cameraX = limit(x - blank, 0, mapWidth - ginfo_winx) } if ginfo_winx - blank < x - cameraX { // キャラクタが(ginfo_winx - blank)より右側に移動した場合、カメラを移動させる cameraX = limit(x + blank - ginfo_winx, 0, mapWidth - ginfo_winx) } return //いろんな描画処理 *draw redraw 0 gosub *drawMap // マップを描画する gosub *drawCharacter // キャラクタを描画する redraw 1 return // マップを描画する *drawMap pos 0, 0 : gcopy 1, cameraX, cameraY, ginfo_winx, ginfo_winy return // キャラクタを描画する *drawCharacter drawX = x - cameraX : drawY = y boxf drawX - CHARACTER_SIZE, y - CHARACTER_SIZE, drawX + CHARACTER_SIZE, drawY + CHARACTER_SIZE return
FUJIさんが知りたいのはおそらく*setCameraでの処理なのではないかと推測します。簡単にコメントを入れたので参考にしてください。
このスクリプトでは横方向しか考えていませんが、原理が分かれば縦方向も簡単に拡張できると思います。
limit()関数はこうした処理に便利なので、ぜひ利用してみてください。



FUJI

リンク

2007/6/30(Sat) 21:41:33|NO.9196

分かり辛い文章を分かってくれてありがとうございます!
ellerさんが作ってくれたスクリプトが正に答えでした。
limitってそうやって使えるんですね。
やっぱり変数があれだけでは駄目でしたか。

自分がテストで作っていたスクリプトに組み込んだら
望んだ通りの物になりました。
とても勉強になりました。



FUJI

リンク

2007/6/30(Sat) 21:48:06|NO.9197

念のために。
IP 58.92.78.27のFUJI(私)とこの質問者は全く関係のない別人です。



FUJI(質問者の方)

リンク

2007/6/30(Sat) 22:27:45|NO.9198

あ、すいません…。
名前が被っていたんですね、気付きませんでした。
前と同じ名前で質問すると邪魔かなと思って変えたのですが
余計に悪かったみたいです。
本物のFUJIさん、大変失礼しました。



ONION software Copyright 1997-2023(c) All rights reserved.