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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0723
はじめたてリンゴキャッチ19解決


はじめたて

リンク

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



fall

リンク

2012/7/23(Mon) 23:22:42|NO.47866

配列変数は複数のものを落とすときに必須になってきますので覚えたほうがいいですね



あり

リンク

2012/7/24(Tue) 10:17:57|NO.47884

ヒントというか答え以上のスクリプトが載ってしまっていますが
自分の力だけではどうにも上手くいかない場合の参考用に
リンゴキャッチゲームに関する過去ログへのリンクを貼っておきます。
http://hsp.tv/play/pforum.php?mode=pastwch&num=32364

見る見ないの判断はお任せします。



はじめたて

リンク

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
、、、、、、
とするだけです



fall

リンク

2012/7/25(Wed) 22:58:45|NO.47942

流星群さんに反論するわけではないですが、果物のかずだけ配列変数を用意した方がいいかと思います(なにかと分かりやすい



fall

リンク

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



fall

リンク

2012/7/25(Wed) 23:21:12|NO.47944

ミスがありました
fruitsは表示させる果物の数ではなくて画面に表示させることのできる果物の数の限界です
ラベルを付けるのを忘れました(即効で考えたので)



YSR

リンク

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

ああ……こういう時に構造体があったら便利なんだろうな(遠い目)



KA

リンク

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の種類を決定するのを一度のみにしないとだめなんですけど・・・
日本語おかしいですね。
上手く説明できません><



YSR

リンク

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



fall

リンク

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

みなさんどうもありがとうございました!
なんとか作れました。



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