|
|
2012/7/23(Mon) 19:12:00|NO.47846
こんにちは、最近HSPをはじめました。
何か作ってみようと考えて、リンゴキャッチゲームを作ってみることにしました。
早くも手詰まりになってしまったので、質問させていただきます。
ひとつのリンゴを落としてかごでキャッチするのはできますが
複数のリンゴを落とすことが出来ません。
他に質問できる人もいないので、助けてください……!
|
|
2012/7/23(Mon) 19:51:28|NO.47848
配列、repeat cnt loopの使い方を覚える
randomize //ランダム初期化
dim x,10 //xと言う変数を10個纏めて確保(これが配列で x(0)で一つ目x(1)で二つ目を扱える)
dim y,10
repeat 10//10回繰り返し
x(cnt)=rnd(600) //cntにはループ回数に応じた数値が入ってる(rndはランダムな数値を取り出してる)
y(cnt)=-rnd(1000)
loop
*main
redraw 0
stick k
if k {end}
gradf 0,0,640,480,1,0,128 ; 画面クリア
color 255
repeat 10
y(cnt)+5
pos x(cnt),y(cnt)
mes "@"
loop
redraw 1
await 15
goto *main
|
|
2012/7/23(Mon) 23:22:42|NO.47866
配列変数は複数のものを落とすときに必須になってきますので覚えたほうがいいですね
|
|
2012/7/25(Wed) 21:32:02|NO.47938
すいません、ありがとうございます。
配列などの勉強をして、自分で考えてリンゴを落とせました。
そこで新たな疑問なんですが、リンゴだけでなくいろいろな種類の果物を落とし
さらに果物の種類によって得点を分けるにはどうしたらいいですか……?
てんで見当もつきません……
|
|
2012/7/25(Wed) 22:12:53|NO.47940
解説任せてください。
配列変数を使用した例
dimでkudamono,10とかく。これがしゅるい
で、kudamono=0は無し、1はりんご、2はばなな、3はみかんとすると
スコアアップのソースに
if kudamono=1 : score+10
if kudamono=2 : score+20
if kudamono=3 : score+30
、、、、、、
とするだけです
|
|
2012/7/25(Wed) 22:58:45|NO.47942
流星群さんに反論するわけではないですが、果物のかずだけ配列変数を用意した方がいいかと思います(なにかと分かりやすい
|
|
2012/7/25(Wed) 23:17:38|NO.47943
例えば
↓表示させたい果物の数に変えてください
fruits=200
//りんご
dim apple_x,fruits
dim apple_y,fruits
dim apple_vx,fruits
dim apple_vy,fruits
dim apple,fruits
//バナナ
dim banana_x,fruits
dim banana_y,fruits
dim banana_vx,fruits
dim banana_vy,fruits
dim banana,fruits
//オレンジ
dim orange_x,fruits
dim orange_y,fruits
dim orange_vx,fruits
dim orange_vy,fruits
dim orange,fruits
~中略~
APPLE_KAZU=;(りんごの発射される数を自分で決めてください)
gosub *APPLE
if (frame\4)=1 {
repeat APPLE_KAZU
gosub *SEARCHAPPLE
if num_a!-1 {
apple(num_a)=1
apple_x(num_a)=;X座標の原点
apple_y(num_a)=;Y座標の原点
apple_vx(num_a)=;(進むスピード(と方向)を自分で決めてください)
apple_vy(num_a)=;(進むスピード(と方向)を自分で決めてください)
}
loop
}
~中略~
num_a=-1
repeat fruits
if apple(cnt)!1 :num_a=cnt :break
loop
~中略~
repeat fruits
if a(cnt)=1 {
apple_x(cnt)+=apple_vx(cnt)
apple_y(cnt)+=apple_vy(cnt)
pos apple_x(cnt)-3,apple_y(cnt)-3
;gcopy命令で表示
}
loop
|
|
2012/7/25(Wed) 23:21:12|NO.47944
ミスがありました
fruitsは表示させる果物の数ではなくて画面に表示させることのできる果物の数の限界です
ラベルを付けるのを忘れました(即効で考えたので)
|
|
2012/7/26(Thu) 00:49:54|NO.47947
>fallさん
種類分けを配列にするんならいっそ#defineで種類決めたらいいだろ常考……
2次元配列禁止なんて誰も言ってないし
うっかりあらかた(衝動的に)書いてしまった……
;プリプロセッサ命令
;種類分けをマクロで規定
#enum KIND_APPLE = 1
#enum KIND_BANANA
#enum KIND_ORANGE
;その他設定
#const FLUITS_KIND 3 ;フルーツの種類
#const MAX_FLUITS 200 ;表示する最大数
#const FLUITS_SUM_FIRST 10 ;最初に降らせる数(適当)
;変数初期化
;配列宣言
;(元ソースじゃそれぞれ100個までと読めたが合ってるか?)
dim fluits_x,FLUITS_KIND,MAX_FLUITS ;座標
dim fluits_y,FLUITS_KIND,MAX_FLUITS
dim fluits_vx,FLUITS_KIND,MAX_FLUITS ;速度
dim fluits_vy,FLUITS_KIND,MAX_FLUITS
dim fluits_sum,FLUITS_KIND ;各フルーツの数
;配列初期化
for fkind,0,FLUITS_KIND
fluits_sum(fkind)=FLUITS_SUM_FIRST
next
for fkind,0,FLUITS_KIND
repeat fluits_sum(fkind)
fluits_x(fkind,cnt)= ;---------------
fluits_y(fkind,cnt)= ;この部分は
fluits_vx(fkind,cnt)= ;自分で決める
fluits_vy(fkind,cnt)= ;---------------
loop
next
;データ読み込み
buffer 1 :picload "fluits.bmp" ;適当
;その他
chara_x= :chara_y= ;キャラの初期座標
;メインルーチン
repeat
redraw 0 ;以下、画面描画
;初期化
color :boxf ;適当に画面を初期化(clsより速い)
;各種判定(例:当たり判定)
for fkind,0,FLUITS_KIND
repeat fluits_sum(fkind)
if (/*判定条件*/) {
;なんだかんだ
}
loop
next
;座標移動
;キャラ
stick ky,1+4
if ky&1 {
;「←」が押された際の処理
}
if ky&4 {
;「→」が押された際の処理
}
;果物
for fkind,0,FLUITS_KIND
repeat fluits_sum(fkind)
fluits_x(fkind,cnt)+=fluits_vx(fkind,cnt)
fluits_y(fkind,cnt)+=fluits_vy(fkind,cnt)
loop
next
;描画処理(ループ内は適当)
;キャラ
pos chara_x,chara_y
gcopy 1,0,0,32,32
;果物
for fkind,0,FLUITS_KIND
repeat fluits_sum(fkind)
pos fluits_x(fkind,cnt),fluits_y(fkind,cnt)
gcopy 1,(fkind+1)*32,0,32,32
loop
next
redraw 1 ;画面更新
await 5 ;適当なウェイト
loop
ああ……こういう時に構造体があったら便利なんだろうな(遠い目)

| |
|
2012/7/26(Thu) 11:25:51|NO.47948
YSR さんのような無理矢理C風にしたスクリプトは、初めての人
には逆に難しくなるので、記憶に留める程度にして下さい。
|
|
2012/7/26(Thu) 22:20:06|NO.47954
流星群さんのやり方でやってみました
自分のやり方が間違っているとは思うんですけど
果物が落ちてくるときにリンゴになったりみかんになったりしてしまいました……
また、一つ果物を取った瞬間に画面上のほかの果物が全てみかんになったり
同じものしか落ちてこなかったりもします。
kudamonoという配列を作って、1のときはリンゴを落とす、2のときはみかんを落とす
というふうにやりました。
|
|
2012/7/26(Thu) 22:23:07|NO.47956
ソースがないのでなんともいえませんが
配列kudamono
はゲットする、又は落ちたときにのみ0にし、
kudamonoの種類を決定するのを一度のみにしないとだめなんですけど・・・
日本語おかしいですね。
上手く説明できません><
|
|
2012/7/27(Fri) 18:21:35|NO.47973
>KAさん
>無理矢理C風にしたスクリプト
>逆に難しくなる
お、おう……以後気をつける
>はじめたてさん
要するに、例えば最大10個の場合、
kudamono(0)からkudamono(9)に0か1か2か3
(0は何も無し、1以降は「りんご」「みかん」等を表す)
ってことだな。で、0以外なら果物を表示するわけだ。
処理としては、
・一旦画面を初期化する
・キャラを描く
・配列kudamonoを全部調べて、0意外なら果物を描く
・地面に落とすとかゲットするとかしたらその果物(kudamono)を0にする
てなとこか?
>画面上のほかの果物が全てみかんになったり
>同じものしか落ちてこなかったり
「全部」ってことはkudamono(0)~kudamono(9)=2ってしてしまったのかな?
「次の果物を落とす処理」をどうしているのかはソース無いから分からないけど、
kudamono(0)~kudamono(9)から0なとこを探して1とか2とかにする&落とす
ってことをすればいいんじゃない?
|
|
2012/7/28(Sat) 16:29:09|NO.48004
randomize //ランダム初期化
dim x,10 //xと言う変数を10個纏めて確保(これが配列で x(0)で一つ目x(1)で二つ目を扱える)
dim y,10
dim kudamono,10
*main
redraw 0
kcnt=0
stick k
if k {end}
gradf 0,0,640,480,1,0,128 ; 画面クリア
kaddf=(rnd((30))=0)//60分の1で果物追加フラグセット
repeat 10
if kudamono(cnt)>0 {//1以上なら果物がセットされてる
if y(cnt)<480{//画面内
y(cnt)+5
pos x(cnt),y(cnt)
if kudamono(cnt)=1 {color 255:mes "りんご"}
if kudamono(cnt)=2 {color 255,185:mes "みかん"}
kcnt++//画面内の果物の数
}else{//画面外
kudamono(cnt)=0//果物クリア
}
}else{//果物がセットされてない
if kaddf {//果物追加
x(cnt)=rnd(600)
y(cnt)=-20
kudamono(cnt)=rnd(2)+1//果物セット
ktotal++//果物総数
kaddf=0//果物追加フラグクリア
}
}
loop
color 255,255,255
pos 0,0
mes ktotal
mes kcnt
redraw 1
await 15
goto *main
|
|
2012/7/29(Sun) 09:08:59|NO.48009
>kaddf=(rnd((30))=0)//60分の1で果物追加フラグセット
コメント間違ってた・・・
60じゃなくて30・・・
|
|
2012/7/29(Sun) 11:00:04|NO.48014
りんごキャッチゲームのスクリプトを載せてくれませんか?
|
|
2012/8/8(Wed) 21:46:47|NO.48328
すみません、数日間パソコンが使えませんでした……
今のところこんな感じです。
randomize
max = 3 //一画面に表示する落下物の最大数
dim x,10 //果物x座標用配列
dim y,10 //果物座標用配列
dim food,10 //果物種類用
personX = 0 //人のx位置
personY = 440 //y位置
repeat 10 //果物初期位置をランダムに決定
x(cnt)=rnd(600)
y(cnt)=-rnd(max*100)
loop
*Main
repeat
redraw 0
color 0,0,0 //画面クリア
boxf
repeat max //果物の最大数分繰り返す
y(cnt)+5 //果物のy座標を下げる
pos x(cnt),y(cnt)
color 255,255,255
mes "りんご"
if (x(cnt) > personX) & (x(cnt) < personX+15) & (y(cnt) > personY) & (y(cnt) < personY+20){//果物の中心が人に当たっていれば
/* 15=人の頭の少し右あたり 20=人の縦幅 */
pos x(cnt)-20,y(cnt)-20
color 255,100,255
mes "キャッチ"
x(cnt)=rnd(640) //座標をランダムに
y(cnt)=-rnd(max*100)
}
if y(cnt) < 480 : food(cnt) = 0 //画面外のとき果物クリア
loop
stick key,1|4
if (key = 1){ //左カーソルキーでx座標左へ
personX-=4
}
if (key = 4){ //右カーソルキーでy座標右へ
personX+=4
}
pos personX,personY
color 28,255,28
mes "○" //人表示
mes "大"
redraw 1
await 30
loop
数種類の果物を落とせるようにするのが今したいことです。
|
|
2012/8/8(Wed) 23:30:43|NO.48333
>数種類の果物を落とせるようにするのが今したいことです。
NO.48004のとは少し方法違うけど
種類増やす時楽なやり方
randomize
max = 3 //一画面に表示する落下物の最大数
dim x,10 //果物x座標用配列
dim y,10 //果物座標用配列
dim food,10 //果物種類用
personX = 0 //人のx位置
personY = 440 //y位置
//果物種類 0=無し 1=りんご 2=みかん 3=メロン
fname="無し","りんご","みかん","メロン"
fscore=0,10,20,50
repeat 10 //果物初期位置をランダムに決定
x(cnt)=rnd(600)
y(cnt)=-rnd(max*100)
food(cnt)=rnd(3)+1//1~3を指定(0=無し 1=りんご 2=みかん 3=メロン)
loop
*Main
repeat
redraw 0
color 0,0,0 //画面クリア
boxf
repeat max //果物の最大数分繰り返す
if y(cnt) > 480 : food(cnt) = 0 :mis+//画面外のとき果物クリア
if food(cnt)>0 {//果物種類が指定されてたら
y(cnt)+5 //果物のy座標を下げる
pos x(cnt),y(cnt)
color 255,255,255
mes fname( food(cnt) )//果物種類別名前表示
if (x(cnt) > personX) & (x(cnt) < personX+15) & (y(cnt) > personY) & (y(cnt) < personY+20){//果物の中心が人に当たっていれば
/* 15=人の頭の少し右あたり 20=人の縦幅 */
score + fscore( food(cnt) )//種類別スコア加算
pos x(cnt)-20,y(cnt)-20
color 255,100,255
mes "キャッチ"
food(cnt) = -10 //0になるまでのフレーム数を負数で指定
}
}else{
if food(cnt)=0 {//果物セット
food(cnt)=rnd(3)+1
x(cnt)=rnd(640) //座標をランダムに
y(cnt)=-rnd(max*100)
}else{//0になるまで"キャッチ"を表示
food(cnt)+
pos x(cnt)-20,y(cnt)-20
color 255,100,255
mes "キャッチ"
}
}
loop
stick key,1|4
if (key = 1){ //左カーソルキーでx座標左へ
personX-=4
}
if (key = 4){ //右カーソルキーでy座標右へ
personX+=4
}
pos personX,personY
color 28,255,28
mes "○" //人表示
mes "大"
title "スコア : "+score+" ミス : "+mis
redraw 1
await 30
loop

| |
|
2012/8/21(Tue) 19:00:42|NO.48733
みなさんどうもありがとうございました!
なんとか作れました。
|
|