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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0917
ラビットパタパタ ベストテン ランキング を 作りたい6解決


ラビット

リンク

2024/9/17(Tue) 10:52:17|NO.102228

はじめまして
パーティーでランキングを紹介するものを作りたいのですが、
昔のベストテンという番組でやっていた、パタパタを文字盤が回転する様子が
うまく作れません。
何かいいアイディアがあったら教えてください。



この記事に返信する


レピッシュ

リンク

2024/9/17(Tue) 17:39:44|NO.102229

こんにちは

2Dで作るならgzoomで縦方向を伸縮させて
それっぽく見えるものが作れました


#enum MAIN_WIN = 0 #enum MAIN_BUF #enum NUM1_BUF #enum NUM2_BUF #define SPEED 1 //数を増やせば早くなります seq_no = 0 angle = 0 screen MAIN_WIN,256,256,screen_normal buffer MAIN_BUF,256,256,screen_normal buffer NUM1_BUF,64,64,screen_normal font "MS ゴシック", 64, 1 color boxf 0,0 color 255,255,255 pos 0,0 mes "1" buffer NUM2_BUF,64,64,screen_normal font "MS ゴシック", 64, 1 color boxf 0,0 color 255,255,255 pos 0,0 mes "2" repeat if angle >= 32 : angle = 0 : seq_no ^= 1 : else : angle += SPEED gsel MAIN_BUF color 255,255,255 boxf 0,0 pos 96,96 gcopy NUM2_BUF,0,0,64,64 switch seq_no case 0 pos 96,96+angle gzoom 64,32-angle,NUM1_BUF,0,0,64,32 pos 96,128 gcopy NUM1_BUF,0,32,64,32 swbreak case 1 pos 96,128 gcopy NUM1_BUF,0,32,64,32 gzoom 64,angle,NUM2_BUF,0,32,64,32 swbreak swend gsel MAIN_WIN gcopy MAIN_BUF,0,0,256,256 await 17 loop

1から2へのアニメーションを繰り返します
参考になれば幸いです



沢渡

リンク

2024/9/17(Tue) 19:32:52|NO.102230

レピッシュさんのコードを参考に、私もやってみました。

#const w 300 //アイテムの横幅 #const h 60 //アイテムの縦幅 #const h_half h/2 //その半分 #const item_num 10 //アイテムの数 #const speed 12 //1回転にかけるフレーム数(秒間60フレーム) //小さいほど速くなり、大きいほど遅くなります #const wait_num 2 //回転の後の「間」のフレーム数 #const turn_num 20 //回転させる数 #define boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1 sdim text,64,10 text="りんご","みかん","ぶどう","いちご","すいか","メロン","なし","かき","パパイヤ","キウイ" //画像を用意 buffer 1,w,h*item_num : gsel 1 color 0,0,0 : boxf : color 255,255,255 font msgothic,56 repeat 10 pos 20,cnt*h+4 : mes text(cnt) color 0,0,0 : boxf2 0,cnt*h+h_half-1,w,2 //それっぽく見せるために中央に黒い線を入れる color 255,255,255 loop gsel 0 x=20 : y=100 //表示座標 boxf2 x,y,w,h n=0 //選択されているアイテム objsize 100,30 : pos 0,450 s="" repeat 10 if cnt : s+="\n" s+=text(cnt) loop combox n,,s pos 100,450 button gosub "表示",*go flag=0 //回転中フラグ(回転中にボタンを押しても何も起きないようにするため) tgt_old=-1 //前回表示したアイテム(-1は何も表示されていない) randomize stop *go if flag : return flag=1 tgt=0 //表示するアイテム repeat turn_num cnt0=cnt repeat if cnt0=turn_num-1 : tgt=n : else : tgt=rnd(item_num) //最後に表示するアイテムはお目当てのアイテム if item_num<3 : break //アイテム数が2以下だと無限ループになりかねないので if (cnt0=turn_num-2 & tgt=n) | tgt=tgt_old : continue //同じアイテムが連続で表示されないようにし、 //かつ、最後の一つ前のアイテムに //お目当てのアイテムは表示されないようにする break loop half_flag=0 //半分経過したフラグ repeat speed redraw 0 a=h_half-int(cos(M_PI*cnt/speed)*h_half) //新しいアイテムの占める部分 if half_flag=0 { //後半に入った判定 if a>h_half { //後半に入った pos x,y : gcopy 1,0,h*tgt,w,h_half half_flag=1 } } if half_flag=0 { //回転前半 if a>0 { pos x,y : gcopy 1,0,h*tgt,w,a } if tgt_old>=0 & a<h_half { pos x,y+a : gzoom w,h_half-a,1,0,h*tgt_old,w,h_half } } else { //回転後半 a-=h_half if a>0 { pos x,y+h_half : gzoom w,a,1,0,h*tgt+h_half,w,h_half } if tgt_old>=0 & a<h_half { pos x,y+h_half+a : gcopy 1,0,h*tgt_old+h_half+a,w,h_half-a } } redraw 1 await 16 loop redraw 0 pos x,y : gcopy 1,0,h*tgt,w,h //最後に全体を表示 redraw 1 repeat wait_num : await 16 : loop tgt_old=tgt loop flag=0 return



ラビット

リンク

2024/9/18(Wed) 08:07:56|NO.102232

レピッシュさん、沢渡さん、ありがとうございます。お二人のコードを参考に作ってみます。
これからもアドバイスよろしくお願いします。



ラビット

リンク

2024/9/19(Thu) 09:59:49|NO.102239

沢渡さんのを参考に1位の下に2位を入れようとしたのですが、出てきません。どうしたらよいか教えていただけないでしょうか。初心者なものですみません。

#const w 305 //アイテムの横幅
#const h 40 //アイテムの縦幅
#const h_half h/2 //その半分
#const item_num 10 //アイテムの数
#const speed 12 //1回転にかけるフレーム数(秒間60フレーム) //小さいほど速くなり、大きいほど遅くなります
#const wait_num 2 //回転の後の「間」のフレーム数
#const turn_num 20 //回転させる数

#define boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1

title "ランキング・ベストテン"
screen 0,400,680,,10,10
color 0,0,255 : boxf
; ;wait 100
font msgothic,30
color 255,255,255
pos 40,20
mes "好きな果物ベストテン"
color


sdim text,64,10
text="りんご","みかん","ぶどう","いちご","すいか","メロン","なし","かき","パパイヤ","キウイ"


//1位の画像を用意
buffer 1,w,h*item_num : gsel 1
color 0,0,0 : boxf : color 255,255,255
font msgothic,34
repeat 10
pos 20,cnt*h+4 : mes text(cnt)
color 0,0,0 : boxf2 0,cnt*h+h_half-1,w,2 //それっぽく見せるために中央に黒い線を入れる
color 255,255,255
loop
gsel 0

x=75 : y=90 //表示座標
boxf2 x,y,w,h
n=0 //選択されているアイテム
objsize 40,30 : pos 390,90
s=""
repeat 10
if cnt : s+="\n"
s+=text(cnt)
loop
combox n,,s
pos 35,95
objsize 30,30
button gosub "1位",*go
flag=0 //回転中フラグ(回転中にボタンを押しても何も起きないようにするため)
tgt_old=-1 //前回表示したアイテム(-1は何も表示されていない)
randomize
stop

*go
if flag : return
flag=1
tgt=0 //表示するアイテム
repeat turn_num
cnt0=cnt
repeat
if cnt0=turn_num-1 : tgt=n : else : tgt=rnd(item_num) //最後に表示するアイテムはお目当てのアイテム
if item_num<3 : break //アイテム数が2以下だと無限ループになりかねないので
if (cnt0=turn_num-2 & tgt=n) | tgt=tgt_old : continue //同じアイテムが連続で表示されないようにし、
//かつ、最後の一つ前のアイテムに
//お目当てのアイテムは表示されないようにする
break
loop
half_flag=0 //半分経過したフラグ
repeat speed
redraw 0
a=h_half-int(cos(M_PI*cnt/speed)*h_half) //新しいアイテムの占める部分
if half_flag=0 { //後半に入った判定
if a>h_half {
//後半に入った
pos x,y : gcopy 1,0,h*tgt,w,h_half
half_flag=1
}
}
if half_flag=0 { //回転前半
if a>0 {
pos x,y : gcopy 1,0,h*tgt,w,a
}
if tgt_old>=0 & a<h_half {
pos x,y+a : gzoom w,h_half-a,1,0,h*tgt_old,w,h_half
}
} else { //回転後半
a-=h_half
if a>0 {
pos x,y+h_half : gzoom w,a,1,0,h*tgt+h_half,w,h_half
}
if tgt_old>=0 & a<h_half {
pos x,y+h_half+a : gcopy 1,0,h*tgt_old+h_half+a,w,h_half-a
}
}
redraw 1
await 16
loop
redraw 0
pos x,y : gcopy 1,0,h*tgt,w,h //最後に全体を表示
redraw 1
repeat wait_num : await 16 : loop
tgt_old=tgt
loop
flag=0
return

//2位の画像を用意
buffer 1,w,h*item_num : gsel 1
color 0,0,0 : boxf : color 255,255,255
font msgothic,34
repeat 10
pos 20,cnt*h+4 : mes text(cnt)
color 0,0,0 : boxf2 0,cnt*h+h_half-1,w,2 //それっぽく見せるために中央に黒い線を入れる
color 255,255,255
loop
gsel 0

x=75 : y=150 //表示座標
boxf2 x,y,w,h
n=0 //選択されているアイテム
objsize 40,30 : pos 390,150
s=""
repeat 10
if cnt : s+="\n"
s+=text(cnt)
loop
combox n,,s
pos 35,155
objsize 30,30
button gosub "2位",*go2
flag=0 //回転中フラグ(回転中にボタンを押しても何も起きないようにするため)
tgt_old=-1 //前回表示したアイテム(-1は何も表示されていない)
randomize
stop

*go2
if flag : return
flag=1
tgt=0 //表示するアイテム
repeat turn_num
cnt0=cnt
repeat
if cnt0=turn_num-1 : tgt=n : else : tgt=rnd(item_num) //最後に表示するアイテムはお目当てのアイテム
if item_num<3 : break //アイテム数が2以下だと無限ループになりかねないので
if (cnt0=turn_num-2 & tgt=n) | tgt=tgt_old : continue //同じアイテムが連続で表示されないようにし、
//かつ、最後の一つ前のアイテムに
//お目当てのアイテムは表示されないようにする
break
loop
half_flag=0 //半分経過したフラグ
repeat speed
redraw 0
a=h_half-int(cos(M_PI*cnt/speed)*h_half) //新しいアイテムの占める部分
if half_flag=0 { //後半に入った判定
if a>h_half {
//後半に入った
pos x,y : gcopy 1,0,h*tgt,w,h_half
half_flag=1
}
}
if half_flag=0 { //回転前半
if a>0 {
pos x,y : gcopy 1,0,h*tgt,w,a
}
if tgt_old>=0 & a<h_half {
pos x,y+a : gzoom w,h_half-a,1,0,h*tgt_old,w,h_half
}
} else { //回転後半
a-=h_half
if a>0 {
pos x,y+h_half : gzoom w,a,1,0,h*tgt+h_half,w,h_half
}
if tgt_old>=0 & a<h_half {
pos x,y+h_half+a : gcopy 1,0,h*tgt_old+h_half+a,w,h_half-a
}
}
redraw 1
await 16
loop
redraw 0
pos x,y : gcopy 1,0,h*tgt,w,h //最後に全体を表示
redraw 1
repeat wait_num : await 16 : loop
tgt_old=tgt
loop
flag=0
return



沢渡

リンク

2024/9/19(Thu) 23:32:18|NO.102249

画像を一度用意したのにまた同じ画像を用意するのも、
全く同じ内容のサブルーチンを二度書くのも無駄ですし、
そのコードでは「//2位の画像を用意」以降の部分に飛ぶ方法がありません。
配列を利用するなどして、1位や2位のパラメータだけを異なるものにして、
処理は共通のものにするとよいと思います。


#const w 300 //アイテムの横幅 #const h 60 //アイテムの縦幅 #const h_half h/2 //その半分 #const item_num 10 //アイテムの数 #const speed 12 //1回転にかけるフレーム数(秒間60フレーム) //小さいほど速くなり、大きいほど遅くなります #const wait_num 2 //回転の後の「間」のフレーム数 #const turn_num 20 //回転させる数 #define boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1 randomize title "ランキング・ベストテン" screen 0,640,680,,10,10 color 0,0,255 : boxf ; ;wait 100 font msgothic,30 color 255,255,255 pos 40,20 mes "好きな果物ベストテン" color sdim text,64,10 text="りんご","みかん","ぶどう","いちご","すいか","メロン","なし","かき","パパイヤ","キウイ" //画像を用意 buffer 1,w,h*item_num : gsel 1 color 0,0,0 : boxf : color 255,255,255 font msgothic,56 repeat 10 pos 20,cnt*h+4 : mes text(cnt) color 0,0,0 : boxf2 0,cnt*h+h_half-1,w,2 //それっぽく見せるために中央に黒い線を入れる color 255,255,255 loop gsel 0 ranks=2 //何位まで表示するか //アイテムやボタンやコンボボックスの表示座標等を配列で記述 dim x0,ranks : dim y0,ranks //アイテムの表示座標 dim but_x,ranks : dim but_y,ranks //ボタンの表示座標 dim com_x,ranks : dim com_y,ranks //コンボボックスの表示座標 dim but_id,ranks //ボタンID dim n0,ranks //コンボボックスに割り当てる変数 dim tgt_last,ranks //表示しているアイテム。-1の場合は何も表示していない //配列に値を代入する。「何位まで表示するか」を増やした場合は、これに代入する値の数も増やす。 x0=75,75 y0=90,150 but_x=35,35 but_y=95,155 com_x=390,390 com_y=90,150 tgt_last=-1,-1 s="" repeat 10 if cnt : s+="\n" s+=text(cnt) loop repeat ranks boxf2 x0(cnt),y0(cnt),w,h n0(cnt)=0 objsize 100,30 pos com_x(cnt),com_y(cnt) combox n0(cnt),,s pos but_x(cnt),but_y(cnt) objsize 30,30 button gosub str(cnt+1)+"位",*go but_id(cnt)=stat loop stop *go if flag : return //押されたボタンをサーチ selected=-1 repeat ranks if stat=but_id(cnt) : selected=cnt : break //statには押されたボタンのオブジェクトIDが入っている loop if selected=-1 : return flag=1 x=x0(selected) : y=y0(selected) : n=n0(selected) tgt_old=tgt_last(selected) tgt=0 //表示するアイテム repeat turn_num cnt0=cnt repeat if cnt0=turn_num-1 : tgt=n : else : tgt=rnd(item_num) //最後に表示するアイテムはお目当てのアイテム if item_num<3 : break //アイテム数が2以下だと無限ループになりかねないので if (cnt0=turn_num-2 & tgt=n) | tgt=tgt_old : continue //同じアイテムが連続で表示されないようにし、 //かつ、最後の一つ前のアイテムに //お目当てのアイテムは表示されないようにする break loop half_flag=0 //半分経過したフラグ repeat speed redraw 0 a=h_half-int(cos(M_PI*cnt/speed)*h_half) //新しいアイテムの占める部分 if half_flag=0 { //後半に入った判定 if a>h_half { //後半に入った pos x,y : gcopy 1,0,h*tgt,w,h_half half_flag=1 } } if half_flag=0 { //回転前半 if a>0 { pos x,y : gcopy 1,0,h*tgt,w,a } if tgt_old>=0 & a<h_half { pos x,y+a : gzoom w,h_half-a,1,0,h*tgt_old,w,h_half } } else { //回転後半 a-=h_half if a>0 { pos x,y+h_half : gzoom w,a,1,0,h*tgt+h_half,w,h_half } if tgt_old>=0 & a<h_half { pos x,y+h_half+a : gcopy 1,0,h*tgt_old+h_half+a,w,h_half-a } } redraw 1 await 16 loop redraw 0 pos x,y : gcopy 1,0,h*tgt,w,h //最後に全体を表示 redraw 1 repeat wait_num : await 16 : loop tgt_old=tgt loop flag=0 tgt_last(selected)=tgt_old return



ラビット

リンク

2024/9/20(Fri) 13:03:45|NO.102255

沢渡さん ありがとうございます。
アドバイスを元にほぼ完成させました。
下の順位を選ぶ場所をかくして、パーティーで使いたいと思います。
本当に助かりました。

#const w 450 //アイテムの横幅
#const h 60 //アイテムの縦幅
#const h_half h/2 //その半分
#const item_num 10 //アイテムの数
#const speed 12 //1回転にかけるフレーム数(秒間60フレーム) //小さいほど速くなり、大きいほど遅くなります
#const wait_num 2 //回転の後の「間」のフレーム数
#const turn_num 20 //回転させる数

#define boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1

randomize

title "ランキング・ベスト5"
screen 0,900,675,,0,0
color 0,0,255 : boxf
;wait 100
font "HG創英角ポップ体",50
color 255,255,255
pos 40,20
mes "THE 昼からヒッパレ2024"
color

sdim text,64,10
text="Bling-Bang-Bang-Born","GOAT","BON","Masterplan","さよーならまたいつか!-Sayonara","大日向 欣也","佐藤 茉季","仙道 愛葵","松野 拓生","横井 悠弥"

//画像を用意
buffer 1,w,h*item_num : gsel 1
color 0,0,0 : boxf : color 255,255,255
font msgothic,56
repeat 10
pos 20,cnt*h+4 : mes text(cnt)
color 0,0,0 : boxf2 0,cnt*h+h_half-1,w,2 //それっぽく見せるために中央に黒い線を入れる
color 255,255,255
loop
gsel 0

ranks=10 //何位まで表示するか
//アイテムやボタンやコンボボックスの表示座標等を配列で記述
dim x0,ranks : dim y0,ranks //アイテムの表示座標
dim but_x,ranks : dim but_y,ranks //ボタンの表示座標
dim com_x,ranks : dim com_y,ranks //コンボボックスの表示座標
dim but_id,ranks //ボタンID
dim n0,ranks //コンボボックスに割り当てる変数
dim tgt_last,ranks //表示しているアイテム。-1の場合は何も表示していない

//配列に値を代入する。「何位まで表示するか」を増やした場合は、これに代入する値の数も増やす。
x0=100,100,100,100,100,550,550,550,550,550
y0=90,180,270,360,450,90,180,270,360,450
but_x=35,35,35,35,35,35,95,155,215,275
but_y=95,185,275,365,455,580,580,580,580,580
com_x=35,115,195,275,355,435,515,595,675,755
com_y=640,640,640,640,640,640,640,640,640,640
tgt_last=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

s=""
repeat 10
if cnt : s+="\n"
s+=text(cnt)
loop
repeat ranks
boxf2 x0(cnt),y0(cnt),w,h
n0(cnt)=0
objsize 60,30
pos com_x(cnt),com_y(cnt)
combox n0(cnt),,s
pos but_x(cnt),but_y(cnt)
objsize 50,50
button gosub str(cnt+1)+"位",*go
but_id(cnt)=stat
loop
stop

*go
if flag : return
//押されたボタンをサーチ
selected=-1
repeat ranks
if stat=but_id(cnt) : selected=cnt : break //statには押されたボタンのオブジェクトIDが入っている
loop
if selected=-1 : return
flag=1
x=x0(selected) : y=y0(selected) : n=n0(selected)
tgt_old=tgt_last(selected)
tgt=0 //表示するアイテム
repeat turn_num
cnt0=cnt
repeat
if cnt0=turn_num-1 : tgt=n : else : tgt=rnd(item_num) //最後に表示するアイテムはお目当てのアイテム
if item_num<3 : break //アイテム数が2以下だと無限ループになりかねないので
if (cnt0=turn_num-2 & tgt=n) | tgt=tgt_old : continue //同じアイテムが連続で表示されないようにし、
//かつ、最後の一つ前のアイテムに
//お目当てのアイテムは表示されないようにする
break
loop
half_flag=0 //半分経過したフラグ
repeat speed
redraw 0
a=h_half-int(cos(M_PI*cnt/speed)*h_half) //新しいアイテムの占める部分
if half_flag=0 { //後半に入った判定
if a>h_half {
//後半に入った
pos x,y : gcopy 1,0,h*tgt,w,h_half
half_flag=1
}
}
if half_flag=0 { //回転前半
if a>0 {
pos x,y : gcopy 1,0,h*tgt,w,a
}
if tgt_old>=0 & a<h_half {
pos x,y+a : gzoom w,h_half-a,1,0,h*tgt_old,w,h_half
}
} else { //回転後半
a-=h_half
if a>0 {
pos x,y+h_half : gzoom w,a,1,0,h*tgt+h_half,w,h_half
}
if tgt_old>=0 & a<h_half {
pos x,y+h_half+a : gcopy 1,0,h*tgt_old+h_half+a,w,h_half-a
}
}
redraw 1
await 16
loop
redraw 0
pos x,y : gcopy 1,0,h*tgt,w,h //最後に全体を表示
redraw 1
repeat wait_num : await 16 : loop
tgt_old=tgt
loop
flag=0
tgt_last(selected)=tgt_old
return



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.102228への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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