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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0812
pumpkinマップ作成の方法18解決


pumpkin

リンク

2015/8/12(Wed) 15:15:00|NO.70645

HSP初心者です。マップ作成の方法がいまだによく分かりません。
自分の知っている限りの知識だと、画像をpicloadとposで場所指定してひたすら貼り付けるしか方法しか思い浮かびません。
画面がスクロールしていくような大きなマップの場合、どのようにして作ればいいのでしょうか。



この記事に返信する


スペース

リンク

2015/8/12(Wed) 15:31:41|NO.70646

基本的に画像はpicloadでbuffer画面に読み込み、それをgcopyでメイン画面にコピーします。
何故かと言うと、picloadを何度も使うとHDD(SSD)に負担がかかり、更にソフト自体も遅くなるからです。

どういうマップを想定しているかわかりませんが、
横スクロールの場合画像を読み込んだbufferとは別にもう1つbufferを作り、そこにマップをgcopyで描き込んでから、
メイン画面にマップをコピーする方法が一般的ではないでしょうか?

ゲームのようなものを作ったことが無い為、詳しいことは他の方に任せます。



y.tack

リンク

2015/8/12(Wed) 16:14:36|NO.70647

ほい
http://wiki.hsp.moe/小ワザ/マップ移動.html

いやいや。僕が拙い解説するより
既出のページを参照してもらった方が わかりやすいと思うので
URL貼るのみのこと多くてスイマセン



pumpkin

リンク

2015/8/12(Wed) 16:20:24|NO.70648

例として、よくあるRPGのようなマップをつくるとしたら
「岩」とか「地面」とか「家」などの画像を用意して、

それらでbuffer画面を好きなように埋めつくし、マップ全体を作る

作ったマップをコピーする

メイン画面に貼り付けて、マップの表示させたい部分だけを表示させる でいいのでしょうか?



y.tack

リンク

2015/8/12(Wed) 16:41:39|NO.70650

buffer画面に全体を作成するのは メモリの無駄っぽくて
(大きくなければそれもあり)
マップの表示させたい部分だけ表示ですね

ここまではそんなに難しくなくて

キャラ(NPCとか含む)の移動とか
マップのスクロールは
自力でやるのは辛いかもしれません

2.61で良ければ
http://www.smith-project.jp/main/hsp/
ここのサンプルが参考になるかもしれません
解説文は3.xでも参考になりそうな気もします



(´ω`)

リンク

2015/8/12(Wed) 16:46:32|NO.70651

超基本的な機能だけのサムプルです。
ループ構造のマップの実装をしてます。(´ω`)

; 初期化 randomize screen 0, 400, 400, 0, (ginfo(20)-400)/2, (ginfo(21)-400)/2 gosub *create_chip gosub *create_map px = 50 : py = 50 gsel 0 : gosub *draw_map pos 0, 0 : font "MS Pゴシック", 16, 1 : color 255,255,255 mes "マウスクリックでマップスクロール開始\nマウスを動かせばその方向へスクロールします" onclick goto *startscroll stop *startscroll onclick 0 mcx = mousex : mcy = mousey *main ; このwait値を減らせば高速になる wait 2 ; クリック時からのマウスの位置で移動方向を決める ; 遊びは±20dot nx = mousex : ny = mousey if (mcx-20)<nx { px -= 1 } if (mcx+20)>nx { px += 1 } if (mcy-20)<ny { py -= 1 } if (mcy+20)>ny { py += 1 } if px<0 { px = 99 } if px>99 { px = 0 } if py<0 { py = 99 } if py>99 { py = 0 } gosub *draw_map goto *main *draw_map ; px, py を中心座標として25x25のマップを描く dim dmap, 25, 25 dx = px - 12 : dy = py - 12 ; 仮マップの生成(マップ端の折り返しを処理する) repeat 25 y = cnt : repeat 25 xx = dx + cnt if xx < 0 { xx += 100 } if xx > 99 { xx -= 100 } yy = dy + y if yy < 0 { yy += 100 } if yy > 99 { yy -= 100 } dmap(cnt,y) = map(xx,yy) loop loop ; マップを描画 redraw 0 repeat 25 y = cnt : repeat 25 ; マップのチップ番号から、拾ってくるバッファの位置を決定 cx = dmap(cnt,y) \ 4 : cy = (dmap(cnt,y) - cx) / 4 ; バッファからチップ画像をピーコ pos cnt*16, y*16 gcopy 10, cx*16, cy*16, 16, 16 loop loop title "(x,y)="+str(px)+","+str(py) redraw 1 return *create_map ; 100x100のマップをテケトーに作る ; 0〜15の16種類のチップ番号で構成 dim map, 100, 100 repeat 100 y=cnt : repeat 100 map(cnt,y) = rnd(16) loop loop return *create_chip ; バッファ10番に16x16サイズのチップを16コ(4x4)テケトーに作る ; 0 1 2 3 ; 4 5 6 7 ; 8 9 10 11 ; 12 13 14 15 ; 64x64サイズのグラフィックを読み込むように変更するのもよろし bgscr 10, 16*4, 16*4 repeat 4 _y=cnt : repeat 4 color rnd(255), rnd(255), rnd(255) boxf cnt*16, _y*16, (cnt+1)*16, (_y+1)*16 loop loop return



y.tack

リンク

2015/8/12(Wed) 16:48:50|NO.70652

実はsmithさんとこのサンプルプログラムは
僕も見ながらエディタに打ち込んでる途中で
写経って言うんですけど

難しい本もよくわからなくても読み通したら
ちょっとはわかるみたくなるので
サンプルスクリプトが理解出来なくても
写経したらちょっとはわかると思います



あり

リンク

2015/8/12(Wed) 18:17:07|NO.70654

マップ表示とスクロールのサンプルはHSPに同梱されていますよ。
sampleのgameフォルダ内のmapが付く名前のスクリプトがそうです。



pumpkin

リンク

2015/8/12(Wed) 18:34:13|NO.70656

矢印キーで移動(マップスクロール)にしたいので
右キーで背景を左に移動、左キーで背景を右に移動…とかでいいですよね?

>>ありさん
原因不明のエラー(「内部エラーが発生しました」)でサンプルのeditが使えないんですよ…w
サンプルに関しては(´ω`)さんのように提供してくださる方が居ますので、あまり重く考えてないのでほったらかしだったんですよw

今のところ解説動画とかサイトで勉強してるんですが
解説本とか買った方がいいですかね?



End

リンク

2015/8/12(Wed) 19:23:36|NO.70659

一つpumpkinさんにお尋ねしますが、マップを表示する際に、ループして表示させる方法はご存知ですか?


//----変数 x=20 :y=20 ;マップサイズ //----ループ repeat y :_y=cnt ;縦のループ repeat x :_x=cnt ;横のループ color rnd(255) , rnd(255) , rnd(255) ;色はランダム pos _x*16 , _y*16 :mes "■" ;キャラクター表示 loop loop



y.tack

リンク

2015/8/12(Wed) 19:42:37|NO.70661

僕は全然サンプル見てなくて恐縮なんですが
mapeditというサンプル
クックブックのマップエディターの延長線上のだと思うんですが
なぜ一ウィンドゥに編集部分とチップ選択部分が合わさってるんですか?
僕もクックブックのマップエディターを3.xに移植しようと思ったことがあるんですけど
マウスクリックの2つのウィンドゥへの振り分けが出来なかったんですよね



pumpkin

リンク

2015/8/12(Wed) 19:46:55|NO.70663

知りませんでしたw
これを上手く使えれば比較的簡単にマップを作れるんですな…



pumpkin

リンク

2015/8/12(Wed) 21:11:39|NO.70671

y.tackさんの返信スルーしてた…()
すみません、俺には理解不能でしたw
他の方の回答をお探しください



y.tack

リンク

2015/8/12(Wed) 21:22:13|NO.70672

僕もスレの趣旨から外れた書き込みをしてしまったので
新しくスレッドを立てた方が良さそうですね



End

リンク

2015/8/12(Wed) 23:03:33|NO.70675

>>これを上手く使えれば比較的簡単にマップを作れるんですな…
まずはここから理解していくと良いかと思います。
私もマップ系のゲームを作る際に、ここから学びました。
(´ω`)さんのプログラムも同じような事をしているので、もう一度見返してみてはどうでしょうか?
「これを上手く使えれば比較的簡単にマップを作れるんですな…」と仰っているならば、直ぐに理解できると思いますよ。



窓月らら

リンク

2015/8/12(Wed) 23:46:30|NO.70677

既に出ていますが、考え方としては、パターンを1枚の画像に並べます。
そしてその画像を仮想画面に置いて、そこから部分コピーしてきます。
パターンのサイズは任意で決めればいいのですが、
通常は 8x8 16x16 32x32 64x64 128x128 など。
これらはゲームの画面デザインに合わせて決定すればいいと思います。

そして、パターンに 番号 を割り振ります。
この番号管理にどれだけの容量を使うかで使えるパターン数が変わってきますが
私なんかがよく使うのは 1バイト(0-255)つまり最大256パターン。

この番号を、並べた画像の左上から 0..1..2..3.. と紐付ける。

マップデータはこの番号の並びです。
配列変数に入れるのが一番簡単な方法かと思います。
(私は配列は使わず peek poke で読み書きしますが、結果的には同じようなもの)

当たり判定もこの番号を利用してできますよね。
0番はスルー、1番は通り抜けできない等、仕様を決めて判定するだけ。



窓月らら

リンク

2015/8/13(Thu) 00:08:28|NO.70679

例えばあるサイズのパターンを1枚の画像に以下のように並べて
番号を割り当てます(数値は16進数)。

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |20|21|22|23|24|25|26|27|28|29|2A|2B|2C|2D|2E|2F| ・ ・ 以下 0xFF まで続く
1バイト管理の場合、私は横16縦16で並べます。
(この並びではないといけない、というわけではありません)
そして0番の座標が 0,0 として以下の式を使います。

// パターンサイズ 32x32 の場合 // パターンを並べた画像サイズは 512x512 となる // pn がパターン番号 px,py がパターンの左上座標 pn=16 // 0-255 px=(pn\16)*32 py=(pn/16)*32 mes "pn="+pn+" px="+px+" py="+py



窓月らら

リンク

2015/8/13(Thu) 00:35:03|NO.70680

マップデータはこの番号の並び。
まず、作ろうとしてるゲームの規模を考えてマップの縦横サイズを決定します。
そして何らかの方法でマップデータを用意します。大きく2つ、

1. コードに直接書く(配列変数に直接入れる)
2. 別のツールかプログラムでファイルに書き出したものから変数に読む

小規模だったり、理解するまでは 1 でテストする事をおすすめします。
しかし実際に本番で使うのは 2 の方法がおすすめです。
(2 の場合はテキストではなくバイナリ)

スクロールは、このマップデータのどの位置から読んで描画するかを
変化させる事で実現できます。配列なら例えば mapdata(mx+x,my+y)等とするだけ。
この場合、変数 mx,my が現在のマップ位置(描画基点)になります。
x,y は画面いっぱいに並べる分。

以下は慣れてきてから考えるべきこと:
描画については、処理効率を考えて新たに出現する部分を描画する方法と
画面全体のパターンを再描画する方法があるわけですが、
とりあえずそういう最適化は後々で良いかと思われます。
あと、これも理解できてからでいいのですが、マップデータ(番号)は
1バイトか、多くても2バイトで十分なので、配列に入れてしまうと
メモリの無駄になります(1つのパターンで4バイト消費してしまう)
だから1バイト管理なら peek poke を使います。



pumpkin

リンク

2015/8/13(Thu) 08:24:19|NO.70684

とりあえず今のところ有料ゲーム並みにマップ数の多いゲームは作る予定ない(というか作れる気がしない)ので
容量のことは気にせずミニゲームくらいの規模のゲーム作っていこうかなぁと
慣れてきたら容量のことも考えながら大規模なゲーム作って行こうと思います
ありがとうございました



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