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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1025
ケイコHSP初心者なので教えていただきたいです!48未解決


ケイコ

リンク

2015/10/25(Sun) 18:41:20|NO.72497

先週からHSPを勉強し始めた22歳の大学生です。
機械音痴すぎるわたしをどうか助けてください( ; ; )

つくりたいものの内容としましては、
自動販売機とほとんど同じようなイメージで

・ペットボトルの陳列された画像を複数枚使用(10×3の予定)しそれを提示
・制限時間の提示(5〜10秒の予定)
・商品の下にボタンの設置(自動販売機のようなイメージ)
・スタートすると複数枚の画像からランダムに選ばれた画像が提示され
・制限時間がカウントされていく
・商品が選択(ボタンを押す)されると終了
・10×3(予定)の商品のうちどの商品を選択したかと、制限時間何秒を残して選択したかを記録したい

というものです。
本やホームページで徐々に理解は深めているのですが、いざ作るとなるとさっぱりわかりません( ; ; )
教えていただける方は掲示板でもメールでも構わないので、助けてください( ; ; )



この記事に返信する


マソ子

リンク

2015/10/25(Sun) 19:11:03|NO.72498

こんにちわ(^^♪
みんな大好き マソ子です。

まずは画像を表示するところから始めてみまSHOW

> ・ペットボトルの陳列された画像を複数枚使用(10×3の予定)しそれを提示
まずは画像を表示するところから始めてみましょう

picload で画像表示ができるのはわかりますか?



ケイコ

リンク

2015/10/25(Sun) 19:14:16|NO.72499

マソ子さんこんばんは!(^ ^)

picload という命令で画像を表示できるというところは理解できているつもりです!

例えば複数枚の画像をランダムに表示することは可能なんでしょうか??(^_^;)



マソ子

リンク

2015/10/25(Sun) 19:45:34|NO.72500

picload "hogehoge.bmp"

で hogehoge.bmpという画像ファイル を表示できるのはわかりますよね?

> 複数枚の画像をランダムに
これには 配列変数 を使います。


array = "a.bmp","b.bmp","c.bmp" randomize // 乱数システムを初期化 picload array(rnd(3))

たぶん理解しにくいと思うので、その際はどこがわかるか、わからないのかを添えて再度質問ください(^^♪



ケイコ

リンク

2015/10/28(Wed) 15:17:12|NO.72582

マソ子さん連絡が遅くなり申し訳ありません( ; ; )
picload "hogehoge.bmp"

これで画像ファイルがアップされるのはわかります!
"hogehoge.bmp"は画像の例ということであってすよね?

array = "a.bmp","b.bmp","c.bmp"
randomize // 乱数システムを初期化
picload array(rnd(3))

これは3つの画像をランダムに提示している例であっていますか??



k

リンク

2015/11/3(Tue) 20:00:41|NO.72748

突然すいません^^;
>・商品の下にボタンの設置
これってボタンの数を30個設置ってことですか?



ケイコ

リンク

2015/11/3(Tue) 21:22:12|NO.72753

こんばんは!
ボタンを30個つけて、どれを選択したかを記録したいのですが
そういうことは無理ですかね??( ; ; )



スペース

リンク

2015/11/3(Tue) 22:30:39|NO.72758


#include "winmm.as" PicSizeX=80//画像のサイズ PicSizeY=70 LisX=10//マス目の数 LisY=3 buffer 1,PicSizeX*LisX,PicSizeY*LisY//buffer Font "メイリオ",25//今回は画像を用意するのが面倒だったので適当に文字を表示します。 repeat LisX ct=cnt repeat LisY Color 156+rnd(100),156+rnd(100),156+rnd(100)//色を指定 boxf ct*PicSizeX,cnt*PicSizeY,ct*PicSizeX+PicSizeX,cnt*PicSizeY+PicSizeY//単色で塗り潰し Color 0,0,0 pos ct*PicSizeX,cnt*PicSizeY+PicSizeY/2.0-25//位置を設定 mes ""+ct+"x"+cnt+""//文字を描画 loop loop Screen 0,PicSizeX*LisX,PicSizeY*LisY//メインウィンドウ repeat LisX ct=cnt repeat LisY pos PicSizeX*ct,PicSizeY*cnt:gcopy 1,PicSizeX*ct,PicSizeY*cnt,PicSizeX,PicSizeY//画像を表示 pos PicSizeX*ct,PicSizeY*cnt+PicSizeY-25:button gosub ""+ct+"x"+cnt+"",*Jump//ボタンを設置 loop loop timeGetTime//PCが起動してからの時間を取得 基準時間=stat//記録しておく オブジェクトID=-1 repeat timeGetTime 経過時間=double(stat-基準時間)//差分を記録。これが経過時間。単位はms。 title ""+(経過時間/1000)+"秒"//タイトルに経過時間を表示 if オブジェクトID!-1:break//クリックしたらループを抜ける if 経過時間>=10000:break//1万ms=10秒 await 30//ウェイト loop Dialog "終了!" stop *Jump Dialog ""+stat+"番目のボタンをクリック!" オブジェクトID=stat return
時間ないので適当に組んだだけですが。
ランダムにするとなると少し面倒になります。



k

リンク

2015/11/4(Wed) 07:46:07|NO.72776

>ボタンを30個つけて、どれを選択したかを記録したいのですが
>そういうことは無理ですかね??( ; ; )
button命令を30個書くのは大変だと思ってたら
スペースさんがrepeat命令で書くプログラムを書いてくれたので
かなり参考になると思います



ケイコ

リンク

2015/11/4(Wed) 13:49:30|NO.72780

スペースさんKさん返信ありがとうございます(^ ^)

HSPをはじめたのが、つい最近でして...


#include "winmm.as"
PicSizeX=80//画像のサイズ
PicSizeY=70
LisX=10//マス目の数
LisY=3
buffer 1,PicSizeX*LisX,PicSizeY*LisY//buffer
Font "メイリオ",25//今回は画像を用意するのが面倒だったので適当に文字を表示します。
repeat LisX
ct=cnt
repeat LisY
Color 156+rnd(100),156+rnd(100),156+rnd(100)//色を指定
boxf ct*PicSizeX,cnt*PicSizeY,ct*PicSizeX+PicSizeX,cnt*PicSizeY+PicSizeY//単色で塗り潰し
Color 0,0,0
pos ct*PicSizeX,cnt*PicSizeY+PicSizeY/2.0-25//位置を設定
mes ""+ct+"x"+cnt+""//文字を描画
loop
loop
Screen 0,PicSizeX*LisX,PicSizeY*LisY//メインウィンドウ
repeat LisX
ct=cnt
repeat LisY
pos PicSizeX*ct,PicSizeY*cnt:gcopy 1,PicSizeX*ct,PicSizeY*cnt,PicSizeX,PicSizeY//画像を表示
pos PicSizeX*ct,PicSizeY*cnt+PicSizeY-25:button gosub ""+ct+"x"+cnt+"",*Jump//ボタンを設置
loop
loop
timeGetTime//PCが起動してからの時間を取得
基準時間=stat//記録しておく
オブジェクトID=-1
repeat
timeGetTime
経過時間=double(stat-基準時間)//差分を記録。これが経過時間。単位はms。
title ""+(経過時間/1000)+"秒"//タイトルに経過時間を表示
if オブジェクトID!-1:break//クリックしたらループを抜ける
if 経過時間>=10000:break//1万ms=10秒
await 30//ウェイト
loop
Dialog "終了!"
stop
*Jump
Dialog ""+stat+"番目のボタンをクリック!"
オブジェクトID=stat
return

ここに書かれてることがほとんど理解できていない状況なのですが( ; ; )
もしよろしければ一つ一つ解説していただければ助かります( ; ; )

imprezagf2@yahoo.co.jp

こちらに連絡していただいても、掲示板の方でも構わないです( ; ; )



ケイコ

リンク

2015/11/4(Wed) 17:15:00|NO.72781

スペースさん、Kさん

スペースさんのスクリプトを実際に打ち込んでみて、起動してわかったのですが
1つの画像に30個ボタンを設置することが難しいようなのですが

例えば、あらかじめ30個の商品が載っている画像を
100枚ほどランダムに提示し、その提示が始まると同時に5秒のカウントダウンが始まる

5秒経つまたはEnterを押すと終了するというふうにはできたりするでしょうか??

何度もすいません( ; ; )



スペース

リンク

2015/11/4(Wed) 17:21:19|NO.72782

まず、HDL(HSP Document Library)はご存じですか?
HSPエディターでf1、もしくはメニューのヘルプ→HSP命令リファレンスを開く から開くことが出来ます。
もしわからない命令があったらそこで検索することをお勧めします。
もしHDLに無い場合はインターネットで「HSP 検索したい命令」で検索するといいでしょう。
ではプログラムの解説を始めます。


#include "winmm.as"
これはtimeGettimeを使う為にwinmm.asというファイルをインクルードしています。
winmm.asとは通常のHSPと同じコートが書かれており、メインのソースコードに直接コピペして書いても構いません。
ですがそうすると無駄に長くなったり見づらくなったりするので、適度にインクルードを使う事で可読性をあげています。
winmm.asにかかれている内容ですが、簡単に言うと外部DLLを呼び出すコードが大量に書かれています。
この中に今回使うtimeGettimeが含まれています。
DLLとは主にC言語で書かれたプログラムを他の言語でも使えるようにしたものです。

TimeGetTimeの詳しい説明は後でします。



PicSizeX=80//画像のサイズ PicSizeY=70 LisX=10//マス目の数 LisY=3
この行で、今後頻度に使う値を変数に代入しています。
各場面で数字で描くよりも変数で書いたほうが可読性が高く、
後から数字を変えるのも楽です。
ちなみに似たようなもので、#constという命令があります。
詳しい説明をHDLを見てください。

変数はPicSizeX、PicSizeYが画像のサイズです。
LisX、LisYは列の数です。


buffer 1,PicSizeX*LisX,PicSizeY*LisY//buffer
HSPにはウィンドウの種類が主に2つあります。
1つは通常のScreen命令で作成できる画面。
もう1つがbuffer命令で作成できる仮想画面です。
仮想画面は通常の画面とは違い、表示されません。
従って何度もソフト内で使う画像を保存する時に使用します。
PicLoadでいいじゃないか!と思うかもしれませんが、
PicLoadは記録ドライブ(HDDやSSD)から直接読みだしているので、
何度も使うと記録ドライブに負担をかけ、更に時間もかかります。
従ってbufferに1度読み込んでおき、必要に応じてメイン画面にコピー表示した方が遥かに楽なんです。


Font "メイリオ",25//今回は画像を用意するのが面倒だったので適当に文字を表示します。 repeat LisX ct=cnt repeat LisY Color 156+rnd(100),156+rnd(100),156+rnd(100)//色を指定 boxf ct*PicSizeX,cnt*PicSizeY,ct*PicSizeX+PicSizeX,cnt*PicSizeY+PicSizeY//単色で塗り潰し Color 0,0,0 pos ct*PicSizeX,cnt*PicSizeY+PicSizeY/2.0-25//位置を設定 mes ""+ct+"x"+cnt+""//文字を描画 loop loop
ここは、本来なら画像を表示するので、もっと短くなります。
Font "メイリオ",25でフォトを指定。
その次、ループが二重になっていますよね。
恐らく特に分かりづらかったのがここだと思います。
repeat~loopは繰り返す命令です。
「repeat 繰り返したい回数」と書き、繰り返す回数を指定します。
今回はrepeat LisXと書いています。
LisXには10が代入されているので、10回ループすることになります。
其の次の行でct=cntと書いていますね。
cntとはシステム変数で、ループした回数が代入されています。
cntの値をctに代入しています(理由はもう少し後に説明します)
その後またrepeat~loopを使っていますよね。
(今回は19~25行のループを1回目のループ、21~24行の2回目のループを呼びます)
これは1回目のループはX列、2回目のループはY列の描画の為です。
2回目のループの中でcntの値を取得すると、2回目のループ回数が取得されてしまいます。
従って1回目のループ回数も取得したい!という場合は2回目のループに入る前にct=cntと書き、システム変数から通常の変数に値をバックアップしておかなければいけません。

repeat 5 ct=cnt repeat 5 pos ct*20,cnt*20:mes "●" Dialog "ct:"+ct+"\ncnt:"+cnt+"" loop loop
このプログラムを実行してみてください、ctとcntの変化がよくわかると思います。

ループ内にあるColor、rnd、boxf、pos、mesはHDLを見れば詳しい説明が乗っているので説明は省略します。


Screen 0,PicSizeX*LisX,PicSizeY*LisY//メインウィンドウ
ここでメインウィンドウのサイズを決定しています。


repeat LisX ct=cnt repeat LisY pos PicSizeX*ct,PicSizeY*cnt:gcopy 1,PicSizeX*ct,PicSizeY*cnt,PicSizeX,PicSizeY//画像を表示 pos PicSizeX*ct,PicSizeY*cnt+PicSizeY-25:button gosub ""+ct+"x"+cnt+"",*Jump//ボタンを設置 loop loop
ここでループが二重に成っているのは先ほど説明したのと同じ理由です。
重要なのが22行目~23行目です。
今思うと少し書き方が悪かったですね。
間に:が入っていますが、これは命令を続けて書くためです。
意味としては改行と同じ効果です。
適度に:を使うことでコードの可読性が上がります。
ですがHSP始めた時はこれを使われると非常にわかりづらいですよね。
(少なくとも自分はそうでした。)

posはHDLに書いてあると通り、描画する位置を決定します。
psoに対応している命令・対応していない命令があるので、注意が必要です。
その次のgcopyは仮想画面からメイン画面に画面の一部をコピーする命令です。
gcopyにはパラメーター(引数)を5つ指定でき、それぞれの説明はHDLに書いています。
次の行のposはbuttonの描画位置を決めるためです。
buttonとはボタンを描画する命令のことで、
ボタンをクリックすると指定したラベルにジャンプします。
基本的には、

button "ボタンに表示するテキスト",*ラベル
という書き方をします。
ですがこのプログラムではbuttonとp1の間にgosubと書いていますよね。
これはサブルーチンジャンプというもので、書かない場合は通常のラベルジャンプを行います。
通常のラベルジャンプは1度ジャンプしたらそれっきり。
ですがサブルーチンジャンプを行うと、ジャンプ先でreturnと書くとジャンプ元に戻ってきます。
なぜ戻す必要があるのか?という説明はこの後に説明します。
まずはジャンプ先で何をやっているのかを説明します。
ジャンプ先は39行目の

*Jump Dialog ""+stat+"番目のボタンをクリック!" オブジェクトID=stat return
この部分です。
まずDialogでクリックしたボタンの番号を表示し、オブジェクトIDにstatの値を代入します。
statにはクリックしたボタンのオブジェクトIDが代入されています。
オブジェクトIDとはオブジェクト(ボタンや入力ボックス等)を設置すると自動的に割り振られるもので、
0から順番に割り振られます。
このオブジェクトIDを記録しておけば、どのボタンがクリックされたのかがわかります。
そしてオブジェクトIDを変数に代入した後、returunでジャンプ元に戻ります。


timeGetTime//PCが起動してからの時間を取得 基準時間=stat//記録しておく オブジェクトID=-1
TimeGetTimeを使うと、statというシステム変数にPCが起動してからの時間が代入されます。
単位はms。つまり1000で1秒です。
システム変数とは様々な命令が共通で使用する変数のことで、システム変数は複数あります。
主に使うのはcnt、stat、start、ginfo系等です。他にも大量にあるので、ここで全て説明することは出来ません。
HDLで「システム変数」と検索してみてください。
次の行で基準時間という変数にstatの値を代入しています。
次、オブジェクトIDという変数を-1にしていますよね。これは次のループ内の説明で説明します。

次のループは無限ループで、経過時間をカウントする為です。
1ループ毎にTimeGetTimeを使い、最新のPCが起動してからの時間を代入します。
この時取得した値から基準時間の値を引くことで、経過時間がわかる、というカラクリです。
何度も引き算で計算するのは可読性が低くなるので、一旦経過時間という変数に経過時間を代入します。
title ""+(経過時間/1000)+"秒"でタイトルに経過時間を表示しています。

その次のifが重要です。
命令の意味は説明せずともわかると思いますがifとは条件分岐の命令です。
日本語で言うと「もしも」ですね。

ここでは「もしもオブジェクトIDが-1以外だったらループを抜ける」と書いています。
!がそれ以外、という意味です。
ボタンがクリックされると、オブジェクトIDという変数にクリックしたボタンのオブジェクトIDが代入されます。
オブジェクトidは0から始まるので、必ず-1以外になります。
つまり-1以外ならボタンをクリックしたという事です。
ではなぜわざわざサブルーチンジャンプにしたのかというと、ループは必ず指定回数ループして抜けるか、
breakで抜ける必要が有る為です。
もしただのラベルジャンプだと、ループが正常に終われないまま抜けるので、そのうち「サブルーチンやループのネストが深すぎます」というエラーが発生します。
詳しくは以下のスレッドを見てください。
http://hsp.tv/play/pforum.php?mode=pastwch&num=4721

その次のifは経過時間が1万ms、つまり10秒以上になったらループを抜けるというものです。
つまり制限時間ですね。
説明は以上です。わからないことがあったら気軽に聞いてください。
どの部分がどうわからないかを書くと、回答する側としても回答しやすくなります。



スペース

リンク

2015/11/4(Wed) 18:44:46|NO.72785

誰も答えていないようなのでケイコさんの質問に答えます。

array = "a.bmp","b.bmp","c.bmp" randomize // 乱数システムを初期化 picload array(rnd(3))
の部分はケイコさんの認識であっています。
ちなみに書き方が複数あり、

arry(0)="a.bmp" arry.1="b.bmp" arry.2="c.bmp"
()で囲む書き方と.で区切る書き方は、どちらも同じです。
その後の「picload array(rnd(3))」も、
「picload array.rnd(3)」という書き方ができます。
rndは関数と言い、使うと数字や文字列が返ってきます
例えばmes rnd(20)という書き方をした場合、0~19までの数字がランダムに表示されます。
関数で指定するパラメータ(引数)は必ずカッコで囲む必要がります。



>あらかじめ30個の商品が載っている画像を
>100枚ほどランダムに提示し、その提示が始まると同時に5秒のカウントダウンが始まる
>5秒経つまたはEnterを押すと終了すると言うふうに

先ほど私が貼ったスクリプトを少し変えるだけで出来ます。
まず時間経過で終了するには「if 経過時間>=10000:break」の部分を書き換えてください。
エンターキーで終了するには、Getkeyで入力したキーを検出し、
ifでエンターキーが入力された時にループを抜けるようにすれば出来ます。

先程も言ったようにランダムに画像を表示するのは少し面倒です。
まず、スクリプトの先頭に以下のモジュールを書きます。

randomize #module //重複のない乱数を配列変数に代入するモジュール #deffunc rndnum array a max=length(a) repeat max b=rnd(cnt+1) a(cnt)=a(b) a(b)=cnt loop return #global
このモジュールを書くと、rndnmuという命令を新たに追加することが出来ます。
モジュールとはなんぞや?という場合は以下のページを見るとわかりやすいと思います。
http://chokuto.ifdef.jp/advanced/module.html

次に、

LisX=10//マス目の数 LisY=3
の後に

dim arrayX,LisX dim arrayY,LisY rndnum arrayX//配列変数に乱数を代入。 rndnum arrayY//配列変数に乱数を代入。
を書いてください。
dimは変数を配列変数として初期化する命令です。
rndnumは先程のモジュールで追加した命令で、
簡単に言うと配列変数に乱数を”被らないように”代入します。
代入される乱数の範囲は0から、配列変数の要素数(つまり配列変数の数)-1までです。
それをそれぞれXとY用の配列変数に代入します。

次はメインウィンドウに画像を表示する部分を変えます。

pos PicSizeX*ct,PicSizeY*cnt:gcopy 1,PicSizeX*ct,PicSizeY*cnt,PicSizeX,PicSizeY//画像を表示
この部分を、

pos PicSizeX*ct,PicSizeY*cnt:gcopy 1,PicSizeX*arrayX(ct),PicSizeY*arrayY(cnt),PicSizeX,PicSizeY//画像を表示
に書き換えます。
何処が変わったかというと、gcopyのコピー元の座標指定です。
PicSizeX*ctをPicSizeX*arrayX(ct)
PicSizeY*cntをPicSizeY*arrayY(cnt)
に書き換えています。
描画位置は変わらないのですが、コピー元の位置がarrayに代入されている乱数なので、
ランダムにあっちをコピーしたりこっちをコピーしたりします。
最後に*Jump先のDialogを以下のように書き換えてください。

Dialog ""+stat+"番目のボタンをクリック!\n画像の位置は"+arrayX(stat/LisY)+"x"+arrayY(stat\LisY)+""
クリックしたボタンの番号を元に画像の位置を割り出すにはこのDialogのような計算式で実現できます。



k

リンク

2015/11/4(Wed) 19:42:51|NO.72791

>ここに書かれてることがほとんど理解できていない状況なのですが( ; ; )
>もしよろしければ一つ一つ解説していただければ助かります( ; ; )

もしなにもわからないというのであれば
私はまずスクリプトエディタの右上のヘルプの
HSPプログラミングマニュアルの

3. スクリプト記述の基本

を読んで基本を理解するほうが近道だと思います

あるいは動画で勉強するのもいいかもしれません

HSPゲームプログラミング講座
http://www.nicovideo.jp/watch/sm11275469

とにかく基本ができていないと回答者さんもどういう風に
解説していいのか困ると思います



ケイコ

リンク

2015/11/9(Mon) 12:50:12|NO.72884

スペースさん!Kさん!いろいろとご指導ありがとうございます(:_;)

返信が遅くなり申し訳ありませんでした
今日まで3日かけて空いてる時間で基礎の基礎は理解してきたつもりです。。


30個の商品というのは考えないで

画像100枚をランダムに提示し、提示とともに10秒のカウントダウンがスタート
(1⇒10ではなく10⇒1のように減っていくのが理想です)
10秒経つと終了またはEnterキーを押すと終了
というようなプログラムを作成しようと思うと
どのようなスクリプトになるか
もう一度1から教えていただけないでしょうか??(*_*)



k

リンク

2015/11/9(Mon) 23:28:20|NO.72900

>画像100枚をランダムに提示し

array = "a.bmp","b.bmp","c.bmp" randomize // 乱数システムを初期化 picload array(rnd(3))
これの応用でもできると思うんですけど
他の方法でということでしょうかー^^

>提示とともに10秒のカウントダウンがスタート

#include "winmm.as" timeGetTime//PCが起動してからの時間を取得 基準時間=stat//記録しておく 単位はミリ秒 repeat timeGetTime カウント=10-(stat-基準時間)/1000//差分を1000で割って秒単位に redraw 0 cls font "MS ゴシック",40 pos 100,100 mes ""+カウント+"秒"//経過時間を表示 redraw 1 stick stk if stk=32 : break//エンターキーを押したらループを抜ける if カウント<=0 : break//0秒ならループを抜ける await 30//ウェイト loop Dialog "終了!"
timeGetTimeはすでに解説されてますね
>TimeGetTimeを使うと、statというシステム変数にPCが起動してからの時間が代入されます。
>単位はms。つまり1000で1秒です。
>システム変数とは様々な命令が共通で使用する変数のことで、システム変数は複数あります。
>主に使うのはcnt、stat、start、ginfo系等です。他にも大量にあるので、ここで全て説明することは出来ません。
>HDLで「システム変数」と検索してみてください。
>次の行で基準時間という変数にstatの値を代入しています。

他の命令はF1キーを押せば出てきます^^



ケイコ

リンク

2015/11/10(Tue) 00:46:42|NO.72907

Kさんこんばんは!
部分部分では解説を見たりするとわかるようになってきました!

ただ、スクリプト全体を1から作るとなると自分一人ではいまいち自信がないので
教えていただければと思いました(*_*)
やり方はおすすめのもので構わないので最初から最後までスクリプトを1度お願いできないでしょうか??

あとすごく初歩的な質問なのですが、HSP講座等の画像提示を何度やってみてもうまくいかないのですが
何か原因があるのでしょうか??(´・ω・`)



k

リンク

2015/11/10(Tue) 20:05:52|NO.72916

このスクリプトは画像サイズが640×480の場合です
画像サイズが違う場合screenの数値を変えるとか
しなければ はみ出したり 余白ができたりします

#include "winmm.as" screen 0,640,520 sdim array,255,100 //画像の登録 array(0)=dir_exe+"\\hsptv\\sozai1.jpg" array(1)=dir_exe+"\\hsptv\\sozai2.jpg" array(2)=dir_exe+"\\hsptv\\sozai3.jpg" array(3)=dir_exe+"\\hsptv\\sozai4.jpg" array(4)=dir_exe+"\\hsptv\\sozai5.jpg" array(5)=dir_exe+"\\hsptv\\sozai6.jpg" array(6)=dir_exe+"\\hsptv\\sozai7.jpg" array(7)=dir_exe+"\\hsptv\\sozai8.jpg" array(8)=dir_exe+"\\hsptv\\sozai9.jpg" array(9)=dir_exe+"\\hsptv\\sozai10.jpg" randomize // 乱数システムを初期化 pos 0,40 picload array(rnd(10)),1 timeGetTime//PCが起動してからの時間を取得 基準時間=stat//記録しておく 単位はミリ秒 font "MS ゴシック",40 repeat timeGetTime カウント=10-(stat-基準時間)/1000//差分を1000で割って秒単位に redraw 0 color 0,0,0 boxf 0,0,649,39 color 255,255,255 pos 0,0 mes ""+カウント+"秒"//経過時間を表示 redraw 1 stick stk if stk=32 : break//エンターキーを押したらループを抜ける if カウント<=0 : break//0秒ならループを抜ける await 30//ウェイト loop Dialog "終了!" end

>あとすごく初歩的な質問なのですが、HSP講座等の画像提示を何度やってみてもうまくいかないのですが
>何か原因があるのでしょうか??(´・ω・`)

まずはスクリプトを貼ってください、でないと答えようがないです^^



ケイコ

リンク

2015/11/10(Tue) 20:39:33|NO.72919

Kさん

そもそもの画像のあげ方がいまいちわかってないのですが、どうするのが正解なのでしょうか??



チルノ

リンク

2015/11/10(Tue) 21:19:28|NO.72925

私もHSP初心者なのですが協力できるとこがあれば協力したいと思います。



k

リンク

2015/11/10(Tue) 21:38:57|NO.72927

>画像のあげ方
ごめんなさい この辺がよくわからないんですが

1、携帯とかで撮った写真をパソコンに移せない
2、画像ファイルはパソコンにあるがファイルをどこに移動していいかわからない
3、スプリクトは書いたが画像ファイルの読み込みに失敗する
4、ブログのようにこの掲示板に画像を貼りたい
5、画像ファイルのアップローダへのあげ方

1か2なのかなーと思いつつ3以降も書いてみる^^;
何番でしょうか? これにはないですか?



ケイコ

リンク

2015/11/10(Tue) 21:42:38|NO.72928

2です(°_°)



k

リンク

2015/11/10(Tue) 21:57:03|NO.72931

2の解説をしてみます^^
スプリクトを書き
スプリクトエディタの左上のファイルのところにある
名前を付けて保存をします
そしたらhspファイルがその場所に作成されるので
その場所と同じフォルダに画像ファイルを移動しますと
picloadなどでファイル名を書いてあれば実行時に表示されます



スペース

リンク

2015/11/10(Tue) 23:08:42|NO.72934

既にKさんが基本は書いているので、自分はそれ以外の部分を解説します。

まずHSPにはソースフォルダという物があります。
ソースフォルダとはソースコード(.hsp)が保存されている場所の事です。
HSPエディタを起動した直後、どこにもソースコードが保存されていない場合はマイドキュメントになっています。
従ってマイドキュメントに画像を保存し、picloadでファイル名を指定し読み込むことは出来ます。
ですがそれだと管理がしづらい為、基本的には好きな場所に専用のフォルダを作りその中にソースコードと画像をファイルを入れるようにしましょう。
ソースフォルダはソースコードを保存した瞬間に保存した場所へ変更される為、開き直したり等の作業は不要です。

ソースフォルダの確認はエディタのメニューの「ツール」の「ソースフォルダを開く」から、
プログラム内で確認する場合はdir_curというシステム変数から確認できます。
もしソースフォルダを移動したい場合はchdirでできます。
詳しくはHDLから確認してください。

ついでに絶対パスと相対パスも解説します。

絶対パスとは「C:\hsp34\hsptv\sozai2.jpg」というように、記録ドライブから指定するタイプです。
相対パスとは「hsptv\sozai2.jpg」というように途中から指定するタイプです。
途中から指定して何故しっかりファイルの場所がわかるのか?というと、
自動的にソースフォルダのパスを合体している為です。
例えばソースフォルダのパスが「C:\hsp34」だとした場合、
内部では「C:\hsp34\hsptv\sozai2.jpg」と成っているわけです。
なぜこんな面倒なことをする必要があるかというと、例えば絶対パスで画像を指定した場合、
後からソースコードと画像を入れたフォルダーを移動しようとした場合、プログラム内のパスをすべて変えなければいけません。
ですが相対パスにした場合、自動的にソースフォルダまでは補間されるので、変える必要がありません。



ケイコ

リンク

2015/11/11(Wed) 17:56:34|NO.72945

この前試しにやってみたときは
Kさんの番号でいうところの3の状態にもなったんですが
あれはどういう原因が考えられるのでしょうか??



kanamaru

リンク

2015/11/11(Wed) 18:24:47|NO.72946

kさんではないですが、回答したいと思います。
考えられる原因としては、
・画像のパスが正しくない。
・画像ファイルが壊れている
(・画像の作成方法)
です。
わかりにくいと思うので、
少し解説すると、二つ目は、画像の形式が正しくない場合、
三つ目は、画像ソフトによって、画像の形式に違いがあり、その違いによって、
読み込めない場合です。



スペース

リンク

2015/11/11(Wed) 18:40:56|NO.72947

kanamaruさんの言うように画像編集ソフトによっては同じpngでビュアー等問題なく読み込める場合でも、
HSPでは読み込める画像・読み込めない画像があります。
ファイルのパスが間違ってるか、画像の問題か・・・どうやって確認するかと言うと、
ファイルサイズを取得することでファイルのパスがあっているかどうかを確認できます。
exist "filename"と言う命令で指定したファイルサイズを取得できます。

"filename"で指定したファイルが存在するかをチェックして、そのファイルサイズを取得します。exist命令が実行されると、システム変数strsizeに結果が反映されます。

ファイルが存在する場合は、そのファイルサイズがstrsizeに代入されます。
もしファイルが存在しなかった場合は、-1がstrsizeに代入されます。

ちなみにhspではフォルダーとファイル名の間の区切り文字(フォルダーとフォルダーの区切り文字も)は「\」ではなく「\\」です。
もし「フォルダー名\ファイル名.png」と言う風な書き方をしている場合、\\に直すと正しく読み込めるはずです。



k

リンク

2015/11/11(Wed) 23:19:56|NO.72950

>Kさんの番号でいうところの3の状態にもなったんですが
スクリプトを実行したときに何か表示がでませんでしたか?
ファイルがありませんとか 文法が間違っているとか

picload で書くファイル名は拡張子も書かなくてはならないんですが
ケイコさんのパソコンが拡張子を表示しない状態になっていることも
考えられますね 画像ファイルの拡張子がわからないときは

右クリックでプロパティを選ぶと JPEG イメージ (.JPG)とか出るので
.JPGが拡張子です

画像ファイル名がtestなら test.JPG と書きます

拡張子は他の場合もあります(.PNG とか .BMP とか)

その場合はそれぞれtest.PNG test.BMPと書かないと
うまく読み込めません

ほかにも原因が考えられるので
試しにやってみたときのスクリプトを見せてもらえば
なにかアドバイスできるかも



ケイコ

リンク

2015/11/12(Thu) 00:54:52|NO.72951

先ほど画像のアップに成功しました!
ありがとうございます!

10秒のカウントダウンを
10.00まで計測したいのですがその場合はどうすればよいのでしょうか??



k

リンク

2015/11/12(Thu) 07:44:42|NO.72953

>先ほど画像のアップに成功しました!
>ありがとうございます!
おめでとうございますー^^

なにが原因でどういう風に解決したかを書いていただけると
今後も回答者さんが答えやすくなりますよー^^



スペース

リンク

2015/11/12(Thu) 10:36:03|NO.72954

変数にはstr型、int型、doubule型があり、
strは文字。
intは整数。
doubleは実数です。
恐らくケイコさんはint型、つまり整数で計算していると思います。
少数点を表示したい場合はdouble型、実数にする必要があります。
以下がサンプルです。

a=12345 mes ""+a+"←小数点は表示されない" mes ""+double(a)+"←小数点も表示される" mes ""+double(a/10)+"←aを/10にしてからdouble型にしているので小数点切り捨てに成る" mes ""+(double(a)/10)+"←aをdoubule型にしてから割るとうまくいく。"



ケイコ

リンク

2015/11/13(Fri) 23:55:01|NO.73002

みなさん質問に答えていただきありがとうございます!
Kさんのスクリプトに自分の画像のスクリプトを代入する場合
72916の投稿のどの部分をどのように変更すればいいのでしょうか??

また、画像の提示から終了までの記録をとることは可能でしょうか??
いずれ記録をデータとして管理したいのですが!



スペース

リンク

2015/11/13(Fri) 23:58:04|NO.73003

ノートパットでテキストファイルの読み込み・保存ができます。
HDLで検索してみてください。



k

リンク

2015/11/14(Sat) 21:55:37|NO.73020

>Kさんのスクリプトに自分の画像のスクリプトを代入する場合
>72916の投稿のどの部分をどのように変更すればいいのでしょうか??

仮にケイコさんのスプリクトが
picload "test.jpg"でしたら

array(0)=dir_exe+"\\hsptv\\sozai1.jpg"のところを
array(0)="test.jpg"に変更します^^



ケイコ

リンク

2015/11/17(Tue) 13:07:49|NO.73081

#include "winmm.as"
screen 0,640,520
sdim array,255,100
//画像の登録
array(0)=dir_exe+"\\hsptv\\sozai1.jpg"
array(1)=dir_exe+"\\hsptv\\sozai2.jpg"
array(2)=dir_exe+"\\hsptv\\sozai3.jpg"
array(3)=dir_exe+"\\hsptv\\sozai4.jpg"
array(4)=dir_exe+"\\hsptv\\sozai5.jpg"
array(5)=dir_exe+"\\hsptv\\sozai6.jpg"
array(6)=dir_exe+"\\hsptv\\sozai7.jpg"
array(7)=dir_exe+"\\hsptv\\sozai8.jpg"
array(8)=dir_exe+"\\hsptv\\sozai9.jpg"
array(9)=dir_exe+"\\hsptv\\sozai10.jpg"
randomize // 乱数システムを初期化
pos 0,40
picload array(rnd(10)),1

timeGetTime//PCが起動してからの時間を取得
基準時間=stat//記録しておく 単位はミリ秒
font "MS ゴシック",40
repeat
timeGetTime
カウント=10-(stat-基準時間)/1000//差分を1000で割って秒単位に
redraw 0
color 0,0,0
boxf 0,0,649,39
color 255,255,255
pos 0,0
mes ""+カウント+"秒"//経過時間を表示
redraw 1
stick stk
if stk=32 : break//エンターキーを押したらループを抜ける
if カウント<=0 : break//0秒ならループを抜ける
await 30//ウェイト
loop
Dialog "終了!"
end

今回こちらのKさんのスクリプトをベースに画像を変えて使用しようと思うのですが
このスクリプトのカウントダウンを10秒から10.00秒に変更し
カウントダウンの表示をタイトルのところに持って行きたいのですが
その場合の変更したスクリプト(どこをどのように)を教えていただけると助かります( ; ; )

画像などの問題はクリアできました!ありがとうございます!



スペース

リンク

2015/11/17(Tue) 13:19:29|NO.73082

変数にはstr型、int型、doubule型があり、
strは文字。
intは整数。
doubleは実数です。
恐らくケイコさんはint型、つまり整数で計算していると思います。
少数点を表示したい場合はdouble型、実数にする必要があります。
以下がサンプルです。


a=12345 mes ""+a+"←小数点は表示されない" mes ""+double(a)+"←小数点も表示される" mes ""+double(a/10)+"←aを/10にしてからdouble型にしているので小数点切り捨てに成る" mes ""+(double(a)/10)+"←aをdoubule型にしてから割ると上手くいく。"



ケイコ

リンク

2015/11/17(Tue) 17:10:14|NO.73084

スペースさん( ; ; )

#include "winmm.as"
screen 0,640,520
sdim array,255,100
//画像の登録
array(0)=dir_exe+"\\hsptv\\sozai1.jpg"
array(1)=dir_exe+"\\hsptv\\sozai2.jpg"
array(2)=dir_exe+"\\hsptv\\sozai3.jpg"
array(3)=dir_exe+"\\hsptv\\sozai4.jpg"
array(4)=dir_exe+"\\hsptv\\sozai5.jpg"
array(5)=dir_exe+"\\hsptv\\sozai6.jpg"
array(6)=dir_exe+"\\hsptv\\sozai7.jpg"
array(7)=dir_exe+"\\hsptv\\sozai8.jpg"
array(8)=dir_exe+"\\hsptv\\sozai9.jpg"
array(9)=dir_exe+"\\hsptv\\sozai10.jpg"
randomize // 乱数システムを初期化
pos 0,40
picload array(rnd(10)),1

timeGetTime//PCが起動してからの時間を取得
基準時間=stat//記録しておく 単位はミリ秒
font "MS ゴシック",40
repeat
timeGetTime
カウント=10-(stat-基準時間)/1000//差分を1000で割って秒単位に
redraw 0
color 0,0,0
boxf 0,0,649,39
color 255,255,255
pos 0,0
mes ""+カウント+"秒"//経過時間を表示
redraw 1
stick stk
if stk=32 : break//エンターキーを押したらループを抜ける
if カウント<=0 : break//0秒ならループを抜ける
await 30//ウェイト
loop
Dialog "終了!"
end

サンプルの意味はわかってるつもりなのですが
このスクリプトの場合だとどこをどのように変更するべきなのかが
わかっていません( ; ; )

あとカウントダウンをタイトルに持って行きたいです( ; ; )

よければスクリプトをそのまま書き換えて教えていただきたいです( ; ; )



kanamaru

リンク

2015/11/17(Tue) 18:09:24|NO.73086

30行目をmesじゃなく、titleにするだけでタイトルバーにカウントダウンを表示できます。
正確には、表示用のboxfなどを削除する必要もありますが。



ケイコ

リンク

2015/11/17(Tue) 18:18:48|NO.73087

kanamaruさんありがとうございます!

<<表示用のboxfなどを削除する必要もありますが
というのは、消してしまっても大丈夫ということでしょうか??


timeGetTime//PCが起動してからの時間を取得
基準時間=stat//記録しておく 単位はミリ秒
font "MS ゴシック",40
repeat
timeGetTime
カウント=10-(stat-基準時間)/1000//差分を1000で割って秒単位に
redraw 0
color 0,0,0
boxf 0,0,649,39
color 255,255,255
pos 0,0
title ""+カウント+"秒"//経過時間を表示redraw 1
stick stk
if stk=32 : break//エンターキーを押したらループを抜ける
if カウント<=0 : break//0秒ならループを抜ける
await 30//ウェイト
loop
Dialog "終了!"
end

ちなみにいらない部分というのはどこからどこまででしょうか??
あと、カウントダウンのところを小数点にするスクリプトもよければ教えていただきたいです( ; ; )
実際にスクリプトを書き換えていただけるとありがたいです( ; ; )



スペース

リンク

2015/11/17(Tue) 21:23:06|NO.73091

カウントに代入する時に実数で計算してください。



ケイコ

リンク

2015/11/18(Wed) 13:47:08|NO.73097

それがいまいちどういうことじゃわかってないです(*_*)



k

リンク

2015/11/18(Wed) 22:40:11|NO.73110

実数にするときはdoubleを使います
タイトルに表示だと以下のスプリクトになります
かなり短くなりますね^^

#include "winmm.as" timeGetTime//PCが起動してからの時間を取得 基準時間=stat//記録しておく 単位はミリ秒 repeat timeGetTime カウント=10.0-double(stat-基準時間)/1000.0//差分を1000で割って秒単位に title ""+カウント+"秒"//経過時間を表示 stick stk if stk=32 : break//エンターキーを押したらループを抜ける if カウント<=0 : break//0秒以下ならループを抜ける await 30//ウェイト loop Dialog "終了!" end



ケイコ

リンク

2015/11/19(Thu) 10:37:20|NO.73116

Kさんありがとうございます( ;∀;)

ちなみに依然教えていただいたノートパットというのがいまいちよくわかりませんでした。。。



k

リンク

2015/11/19(Thu) 20:32:41|NO.73126

スクリプトエディタの右上のヘルプの
HSPプログラミングマニュアルの

3.14.メモリノートパッド命令

のところにノートパットの説明があります^^

以下抜粋
>メモリノートパッド命令は、簡単に言えばWindowsの「メモ帳」
>のようなテキスト エディタを使うような感覚で、
>複数行を含んだ文字列を扱うための命令セットです



ケイコ

リンク

2015/11/25(Wed) 10:39:08|NO.73258

ご無沙汰になってすいません( ; ; )
みなさんのおかげで満足のいくプログラムの作成に成功しました!
本当にありがとうございます( ; ; )

最後になんですが、プログラムを起動して画像がアップされる際に
全体が表示できず一部拡大したような状態でアップされてしまうのですが
どうすれば画面全体をアップすることが可能でしょうか??
screenの数値を変えても画像は拡大されたままでした( ; ; )

すいません、どなたかよろしくお願いします!



スペース

リンク

2015/11/25(Wed) 10:49:00|NO.73259

プログラムを完全に把握できていない気がします。
まずは1行1行読み、わからないことがあったらHDL等で調べる癖をつけてください。
画像が拡大、というのはgcopyに指定する引数を間違っているのでは?
もし私のソースコードをメインに使っているのでしたら、PicSizeXとPicSizeYの値を変えれば良いはずです。



ケイコ

リンク

2015/11/25(Wed) 11:30:22|NO.73261

スペースさんこんにちは
作ったプログラムはKさんのものをベースにしています
screen命令の数値を大きくしてみたのですが
そもそも私の使用している画像が大きいようで
screenを大きくするのではなく
使用している画像そのもののサイズを小さくしたいのですが
それを調べてもわかりませんでした
もし、お分かりなのであれば教えていただきたいです( ; ; )



スペース

リンク

2015/11/25(Wed) 11:42:16|NO.73262

>>ケイコさん
ソースコードがわからない以上、これ以上回答できません。
画像のサイズを変更するには画像編集ソフトを使う必要があります。
縮小だけならwindowsに付属されているペイントでもできます。



x

リンク

2015/11/25(Wed) 18:19:39|NO.73267

画像のサイズを変えたいとのことでしたのでこちらをお試しください。
内容はloadnameの画像をzoomsize%の大きさに変倍して、savenameで保存するものです。
上3行の内容を自分の設定に合わせて書き換えてください。



loadname="test.bmp"//元画像名
savename="test2.bmp"//保存する画像名(拡張子は.bmpのみ)
zoomsize=80//縮小%

bgscr 1,1,1
picload loadname
max_x=ginfo(10):max_y=ginfo(11)//元画像の大きさを調べる
x=max_x*zoomsize/100:y=max_y*zoomsize/100//倍数の計算
screen 0,x,y:gzoom x,y,1,0,0,max_x,max_y//変倍コピーした画像を表示

bmpsave savename
title "右上×を押して終了"
gsel 1,-1//枠のないウィンドウを消去
stop



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