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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0124
ヒビノ氏RPGの町の人たちモドキ作ってみたんですが・・・7解決


ヒビノ氏

リンク

2013/1/24(Thu) 18:36:14|NO.52013


//キャラクターを自由に動かす //#include "設定.txt" //上の#includeで外部テキストファイルを読み込んでフレームスキップと町の人口? //見たいなのを変数に代入して設定しています //今はとりあえず直下に変数を定義しておきます frameskip=1 people=10 //←自由に変更可能 screen 0,640,480 font msgothic,24 chara_number=people randomize dim x,chara_number dim y,chara_number dim r,chara_number dim g,chara_number dim b,chara_number dim xgo,chara_number dim ygo,chara_number repeat chara_number x.cnt=rnd(640) y.cnt=rnd(480) r.cnt=rnd(255) g.cnt=rnd(255) b.cnt=rnd(255) loop //0は自分 goto *main //------------------------------------- #deffunc drawp stick key,15 //十字キーで動かせる物体がひとつ存在します、peopleの値をおおきく if key&1 : x.0-=2 //しすぎると埋もれてしまいますが; if key&2 : y.0-=2 if key&4 : x.0+=2 if key&8 : y.0+=2 repeat chara_number //画面からはみ出ないための処理 if cnt!0 { x(cnt)-=1 : y(cnt)-=1 if count\16=0 : xgo(cnt)=rnd(3) : ygo(cnt)=rnd(3) x.cnt+=xgo.cnt*1 : y.cnt+=ygo.cnt*1 } if x(cnt)>628 : x(cnt)=628 if y(cnt)>480 : y(cnt)=480 if x(cnt)<12 : x(cnt)=12 if y(cnt)<32 : y(cnt)=32 loop return #deffunc drawp2 //ここで描画順を決定 //各人(長方形)のy座標を0〜480それぞれ参照し、描画させています repeat 481  ycheck=cnt //各ループが参照するy座標 repeat chara_number ya=y.cnt if ya!ycheck : continue color r.cnt,g.cnt,b.cnt //もし現在参照しているy座標と物体のy座標が一致したら、 boxf x(cnt)-12,y(cnt)-32,x(cnt)+12,y(cnt) //その物体を描画。 loop loop return *main gmode 0 repeat count=cnt redraw 0 color 255,255,255 : boxf drawp if frameskip!1 : if count\frameskip=0 : continue drawp2 redraw 1 await 1000/60 loop

上のスクリプトは、RPGでマップ上を歩くスプライト(長方形)の相互の前後関係も含めて描画させるものです。
特定のスプライトより上の座標にいればそのスプライトの下(後ろ)に表示され、逆も然りです。

ここで#deffuncで定義したdrawp2命令のy座標を参照している部分について、
簡単に言えば毎フレームでy座標の小さい順にスプライトを描画させているんですが、
スクリプトがちょっと複雑すぎるような気がしまして・・・(実際、これをつくってみたら
かなり処理が遅くなりました)

いちいちy座標ごとにすべてのスプライトのy座標との一致を確認しているのが面倒なきがします。

もう少しシンプルに記述できる方法、または以上のものと異なるもっと効率のいい処理の方法
がなにかありましたらアドバイスください。



この記事に返信する


どこぞのだれか

リンク

2013/1/24(Thu) 18:47:16|NO.52014

y座標でソートすればいいと思います。



@key

リンク

2013/1/24(Thu) 20:32:09|NO.52017

探したらそれについて語ってるページがありました

http://www8.plala.or.jp/Anomalies/Feed/3/3_journal_01.html

C言語ベースですが文法は似ています
for文はrepeatのようなもので、

for (int i = 0; i < 5; i++) { }
はHSPでの

i=0 repeat   /*処理*/   i++   if(i<5)break loop
と同じです(i++とif(略)は逆だったかも・・・?)



@key

リンク

2013/1/24(Thu) 20:34:06|NO.52018

追記です
上記のページは難読なので頑張ってください
自分もそんなにわかりませんでしたー



ヒビノ氏

リンク

2013/1/24(Thu) 21:22:12|NO.52021

二方ともありがとうございます!試してみます



トウジ

リンク

2013/1/24(Thu) 22:31:08|NO.52022

#deffunc drawp2//ここで描画順を決定
//各人(長方形)のy座標を0〜480それぞれ参照し、描画させています
repeat people//481を人数分だけにする
//ycheck=cnt//いらない
//repeat chara_number//いらない
//ya=y.cnt//いらない
//if cnt==0 : continue//いらない
color r.cnt,g.cnt,b.cnt
boxf x(cnt)-12,y(cnt)-32,x(cnt)+12,y(cnt)//その物体を描画。
//loop//いらない
loop
return

drawp2の部分だけをいじってみました。
それ以外もいろいろ変えればもっといいかもね。



暇人

リンク

2013/1/24(Thu) 23:52:54|NO.52024

ソートは色々あるけど
http://ja.wikipedia.org/wiki/ソート
軽くて安定ソートなら
http://ja.wikipedia.org/wiki/バケットソート
が実装が簡単で扱いやすい

goto *mainの手前に

//y座標順にキャラNoを入れる二次元配列 dim Sort_no,481,chara_number //同じy座標に複数存在する可能性が有るのでキャラ数分確保(全部同じ座標にはならないだろうけど一応)
を追加

drawp2を
	
#deffunc drawp2//ここで描画順を決定 dim Sort_nocnt,481//最初に確保してmemsetで初期化したほうが軽いけど repeat chara_number//振り分け Priority=y(cnt)//優先度としてのy座標 Sort_no( Priority , Sort_nocnt(Priority) )=cnt //Sort_no( y座標 , 同じラインのキャラ数 )=キャラNo Sort_nocnt(Priority)++ //同じラインのキャラ数加算 loop repeat 481 Priority=cnt//優先度 repeat Sort_nocnt(Priority)//同じラインのキャラ数分ループ no=Sort_no(Priority,cnt)//キャラNo color r.no,g.no,b.no boxf x(no)-12,Priority-32,x(no)+12,Priority//その物体を描画。 loop loop return
に置き換え



ヒビノ氏

リンク

2013/1/25(Fri) 09:48:22|NO.52028

>トウジさん
そのスクリプトだと各物体のy座標の小さい順に描画されないですよね・・・
私の意図しているものと違います、すみません。

>暇人さん
同じy座標上の複数の物体を考慮する考え方もいいですね、参考になりました!ありがとうございます。



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