|
|
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
| |
|