2008年04月02日

【講座】HSPよく使うフレーズ 第40回

こんにちは、うすあじです。

今回も掲示板に来た質問をFAQ風にまとめて紹介します。

■その1

質問)「HSP教室をみましたが、ボタンを押すたびに1増えるのが
よくわかりません。」

HSP教室 入門編
その3 プログラムを作ってみよう(2)
http://hspcenter.com/hspsc3/hsp3.html

; Sample 002
year=1997
mes "押すと増えるぞ!"
button "+",*up_year
mes year
stop
*up_year
year+=1
print year
stop


答え)
「year+=1」
これは「year=year+1」と同じ意味です。

増えた値がyearにはいるので、最初に1なら次は2と増えていきます。
1回目は1997なら「year=1997+1」で、yearは1998になります。
次に動いたら「year=1998+1」というわけです。

算数などと違って、プログラムでは「=」は、式の右を左側にいれる、
という意味があります。

■その2

質問)「グラフィックを読み込みたいのですが、
マイドキュメントになくてもできますか?」

答え)マイドキュメントの中でなくてもOKですよ。
exeと同じフォルダなら

picload "filename.jpg"

という感じで出来ます。

1つ下の"image"なら

picload "image¥¥filename.jpg"
(¥¥は半角で入力してください。)
Cのすぐ下なら

picload "C:¥¥filename.jpg"

のように書きます。
¥¥のかわりに/で書くことも出来ます。

picload "C:/filename.jpg"


以上。

というわけで、書籍「はじめてのHSP3」の質問も送って下さいね。
http://www.amazon.co.jp/exec/obidos/ASIN/4777513394/hspcenter-22/

(うすあじ)   

投稿者 usuaji : 01:21

2008年02月27日

【講座】HSPよく使うフレーズ 第39回

ある掲示板にかきこまれた内容が、私の書いたスクリプトに
ついての質問だったので、書き込んだ返事をご紹介します。

質問は「HSP3.1プログラミング入門」のマップ表示のスクリプト。
改造してマップチップの数が増えているようで、
わからないことがいくつかあるようです。

・質問1
マップチップを増やしたのですが、うまく表示されません。

答え)
>gcopy 1,pb*32,0,32,32
こちらがマップの素材から実際の画面にコピーする命令です。
「pb*32」というのが元のマップのX座標を計算しています。

もとのサンプルでマップの素材が

01234

という順番で、横にグラフィックが並んでいます。

pbにマップチップの番号0~4がはいっていれば、
pb*32で必要なマップチップX座標が得られます。

改造後のマップチップは32*32のチップが横に
32並んでるんでしょうか?

その場合、チップ番号を32で割った商をY座標、
余りをX座標にしてマップチップの座標を得る必要があります。

・質問2
「pb = code-'0'」の意味がわかりません。
何をしている命令ですか?

答え)
「'0'」は、文字の「0」のキャラクターコードです。
文字として変数MAPにはいっている、「01234」などから
文字コードの「0」の分をひくと、数字の「01234」になります。
文字列と数値を変換するテクニックの一つです。

ということで、詳しい解説とスクリプトは
「HSP3.1プログラミング入門」P166”マップ表示の基本”を
みてください。

(うすあじ)

投稿者 usuaji : 12:30

2007年11月02日

【講座】HSPよく使うフレーズ 第38回 割合の決まった乱数

0から9までを1回ずつという様な特殊な乱数が欲しい!という
場合がたまにあります。
トランプのカードを配るようなときですね。

こんな場合は先に配列を用意して、その配列をシャッフルします。

サンプルでは20回実験して、その様子を表示します。

使うときは頭から順番にとりだすといいかも。

dim table,100
randomize
MAXNUM=10
repeat 20
gosub *rndsub
wait 1
loop
stop
;
*rndsub
repeat MAXNUM
table(cnt)=cnt
wait 1
loop
;gosub *hyouji
repeat MAXNUM
a=rnd(cnt+1)
tmp=table(a)
table(a)=table(cnt)
table(cnt)=tmp
wait 1
loop
gosub *hyouji
return
stop
;表示サブルーチン
*hyouji
disp=""
repeat MAXNUM
disp+= ""+table(cnt)+" "
wait 1
loop
mes disp
return
[rnd_sim.hsp / hsp3]

(うすあじ)

投稿者 usuaji : 09:36

2007年10月09日

【講座】HSPよく使うフレーズ 第37回 オブジェクトの更新

掲示板の質問にあった”再描画しないでインプットボックスの
情報を更新する”という件について。
a=10
input a
この後、変数の内容が変わっても画面は自動的に
更新されるわけではありません。
CLSで画面を消去して、再度画面を書き直せば値は更新されますが、
それも見栄えがよくないし、面倒。
そんなときはobjprmを使います。
インプットボックスやボタンのような、配置したオブジェクトには、
順番に0からID番号がつきます。
こちらの例の場合はID=0。
a=10
input a
wait 100
objprm 0,20
stop
こんな感じで値の更新が出来ます。
(うすあじ)

投稿者 usuaji : 00:54

2007年08月22日

【講座】HSPよく使うフレーズ 第36回 ファイルには拡張子

うすあじです。

今回も掲示板の質問からのネタ。

「picload "hoge"でファイルが無いと言われます。
jpg形式で保存したのですが、どうしたらいいですか?」

といった、内容のもの。

これは、HSPをはじめたばかりの人がぶつかりやすい壁の一つです。

ファイルには拡張子があります。
WindowsXpでは、拡張子まで表示できる設定に変更しないと、拡張子が
表示されません。

設定の変更は、ファイルを表示しているウィンドウを開いて、
メニューの「ツール」から「フォルダオプション」の「表示タブ」を開いて、
”登録されている拡張子は表示しない”のチェックは外してください。

これで拡張子が表示されます。

今回の拡張子は

hoge.jpg
hoge.jpeg

のどちらかだと思います。


また、”ファイルとフォルダ表示”のところは

・”すべてのファイルとフォルダを表示する”をチェック。
・"隠しファイル及び隠しフォルダを表示しない”のチェックしない。

で、さらに最適な設定になります。

ということで、picloadのファイル名には、
拡張子を含めたものを書いてください。

例)
picload "hoge.jpg"

いろいろ実験してみてください。

(うすあじ)

投稿者 usuaji : 00:29

2007年08月05日

【講座】HSPよく使うフレーズ 第35回 stick命令の結果

今回はHSPセンターの掲示板にあった質問から、すこしまとめてみた。

stick命令を使う質問のなかで

stick kk
という命令に続いて

if kk=16: 処理

if kk&16: 処理

という文は同じか?という疑問です。

上記の例ではstick命令の後になにも書いていないので、
キーを押し下げた瞬間のみに反応します。

押し下げ中は常に反応する設定で書き直してみます。

repeat
stick kk,2047,0
title ""+kk
wait 1
loop

これでコントロールキーを押したまま、スペースキーを押してみて
ください。

2進数の話しになりますが、キーに対応するビットが立つという状況です。

同時にスペースキーとそれ以外を押すというのは、
あまり無い状況ですが、このような状況になります。

この場合
>if kk=16: 処理
こちらの判定文では動きませんが、
>if kk&16: 処理
こちらなら動くはずです。

この場合の&は数値にマスクをして1ビットを取り出す効果があります。

このスクリプトを実行して、コントロールキーを押したまま、
スペースキーを押してみてください。

repeat
a="":b=""
stick kk,2047,0
if kk=16:a="イコール "
if kk&16:b="アンド "
title ""+kk+a+b
wait 1
loop

さて、最初の「stick kk」の場合は、本当に同時にキーを押し下げる
という事はほとんど無いので、=も&も同じようになりそうですが、
厳密に言えば違うという事です。

(うすあじ)

投稿者 usuaji : 12:21

2007年07月25日

【講座】HSPよく使うフレーズ 第34回 総集編2

テレビじゃ野球が雨で中止のときとか、総集編的なものをやりますな。
このコーナーでも前回から総集編として、スクリプトを集めてみました。

すべてHSP3用で、たいていの場合コピー&ペーストで動きます。
実際に試してみてください。

●第6回テキストファイルを読む

notesel buf
noteload "test.txt"
sdim tmp,1000
repeat notemax
noteget tmp,cnt
mes ""+cnt+":"+tmp
wait 1
loop
stop

[HSP3用 text1.hsp]

サンプル1
サンプル2
サンプル3
サンプル4

[test.txt]

●第7回 画像を回転する
screen 2,200,200
color 200,0,0
boxf
color 255,255,255
font "",50
mes "うすあじ"
mes "ソフト"
gsel 0
pos 200,200
gmode 0,200,200
repeat 629
color 255,255,255:boxf
r=0.01*cnt
grotate 2,0,0,r
redraw 1
await 1
redraw 0
loop
stop

[HSP3用 rote.hsp]

●第8回 EXEのファイル名を指定
#packopt name "sample"
#packopt xsize 200
#packopt ysize 100
mes "test"
stop

[HSP3 exetest.hsp]

●第9回 画像を変形する
dim x1,10
dim y1,10
dim x2,10
dim y2,10
x1.0=30,170,200,0
y1.0=0,0,200,200
x2.0=0,200,200,0
y2.0=0,0,200,200
screen 2,200,200
color 200,0,0:boxf
color 255,255,255
font "",40,2
mes "納豆は"
mes "ねばねば!"
mes "するぞー!"
gsel 0
gmode 200,200
gsquare 2,x1,y1,x2,y2
stop
[HSP3用 squ.hsp]

● 第10回 limit命令は便利
//limit.hsp
screen 0,640,480
cls 4
wsize=50
*top
title ""+x
x=mousex
x=limit(x,0,640-wsize)
redraw 0
color 0,0,0:boxf
color 0,255,0:boxf x,400,x+wsize,410
redraw 1
wait 1
goto *top

[HSP3用 limit.hsp]

それじゃ、いろいろ試して感想を聞かせてね!

(うすあじ)

投稿者 usuaji : 23:42

2007年07月11日

【講座】HSPよく使うフレーズ 第33回 総集編1

長い連載やアニメでは、ネタが尽きて来ると総集編的なものを
やりますな。
このコーナーでも今回から総集編として、いままでの
スクリプトを集めてみました。

すべてHSP3用で、たいていの場合コピー&ペーストで動きます。
実際に試してみてください。

[1]プレゼントの抽選を行う

;抽選スクリプト
randomize
wait 100
a=rnd (75)+1
mes a
stop

[2]複数の拡張子を指定する

dialog "jpg;*.jpeg;*.bmp;*.gif",16,"画像ファイル"
if stat=0:stop
picload refstr,0
mes refstr
stop

[3]時刻を表示する

(1)時刻表示 画面に表示

*top
redraw 0 ;描画モード0
color 255,255,255:boxf ;全画面を描画
color 0,0,0:pos 0,0 ;カラー設定、座標設定
mes "Time is "+gettime(4)+":"+gettime(5)+":"+gettime(6)
redraw 1 ;描画モード1
await 50 ;ウェイト
goto *top

(2)時刻表示 タイトルバーを使う

*top
title "Time is "+gettime(4)+":"+gettime(5)+":"+gettime(6)
await 50 ;ウェイト
goto *top

[4]ゲームっぽいキー入力

screen 0,200,400
color 0,0,0:boxf
color 0,255,0
mx=5:my=18
*top
;キー入力
getkey key_left,37 ;<-
getkey key_right,39 ;->
;座標変化
if key_left:mx-=1
if key_right:mx+=1
;座標チェック
if mx<0:mx=mxx
if mx>11:mx=mxx
mxx=mx:myy=my
;画面再描画
color 0,0,0:boxf
color 0,255,0
pos mx*16,my*16
mes "▲"
wait 10
goto *top

[5]ゲームっぽいキー入力2 弾がでる

screen 0,200,400
color 0,0,0:boxf
color 0,255,0
mx=5:my=18
*top
;キー入力
getkey key_left,37 ;<-
getkey key_right,39 ;->
getkey key_space,32 ;space
;座標変化
if key_left:mx-=1
if key_right:mx+=1
;座標チェック
if mx<0:mx=mxx
if mx>11:mx=mxx
mxx=mx:myy=my
;弾移動
if tf {
ty-=1
if ty<0:tf=0
}
;弾
if key_space and tf=0 :gosub *tamamake
;画面再描画
color 0,0,0:boxf
color 0,255,0
pos mx*16,my*16
mes "▲"
if tf:pos tx*16,ty*16:mes "|"
wait 2
goto *top
*tamamake
tf=1:tx=mx:ty=my-1:return

(うすあじ)

投稿者 usuaji : 01:26

2007年06月12日

【講座】HSPよく使うフレーズ 第32回 スコア表示

掲示板に質問があったから、作ってみたよ。

今回はグラフィックでスコア表示をする方法のご紹介。

メルマガのサンプルではグラフィックを用意するのが難しいので、
最初の数行でID1に作成してみた。

1文字20かける20ドットで数字のグラフィックが作成できれば、
それをpicloadで読み込んで使うといいよ。

構造は単純。数字を文字に変換して、1文字ずつ取り出して、
それをまた数字にしている。

その数字を使ってgcopyで表示したい数字のグラフィックをコピー。
コツとしては、"0000"を文字列に足すところかな?

自分で作ったグラフィックで、スコアが表示されるとカッコイイよね。

//font make
screen 1,200,200
color 0,0,0:boxf
repeat 10
pos cnt*20+7,2:color 100,100,100:mes cnt
pos cnt*20+5,0:color 255,255,255:mes cnt
wait 1
loop
//main
screen 0,640,480
color 0,0,0:boxf
//score up
repeat 2000
scr=cnt
gosub *score_put
await 1
loop
stop
//
*score_put
redraw 0
scr1="0000"+str(scr)
scrtxt=strmid (scr1,-1,4)
title ""+ scrtxt
repeat 4
num=int(strmid (scrtxt,cnt,1))
pos 100+cnt*20,100
gcopy 1,num*20,0,20,20
await 1
loop
redraw 1
return

//[gscore.hsp/hsp3]

(うすあじ)

投稿者 usuaji : 04:07

2007年05月30日

【講座】HSPよく使うフレーズ 第31回 青い宇宙の冒険

シューティングゲーム風のインターフェイスを作ってみたり、
弾(たま)を出したりしてると、突然宇宙が作りたくなった。

星が流れる背景はシューティングの基本!
青い宇宙は男のロマン!

なんつって、これは、昔のコンピュータの処理能力の問題。
最初のころはキレイな地形を動かしたりが難しかったんだよねぇ。

さて、宇宙はどうしたらうまくいく動くのかな?
と考えると、基本は配列を使う、と想像できる。

それから速度が何通りかあるといいな。
とか、そんな事を考える。

星をpsetでやってみると、ちょっとドットが小さいかな?
ということで、boxfで試す。
やっぱりちらつくのでredrawを入れてみる。

なんか沢山の星が動いてるなぁ。
星の数と画面のサイズは定数にしてみよう!
変数じゃなくて定数ね。
最初から決めちゃうヤツ。
定数はなぜか大文字。
これを300とかにすると・・・ちょっと最初に時間がかかる。

というわけで、キレイに動いたので今回はコレまで。

#define STAR_NUM 100
#define X_MAX 640
#define Y_MAX 480
dim sx,STAR_NUM
dim sy,STAR_NUM
dim ss,STAR_NUM
screen 0,X_MAX,Y_MAX
randomize
repeat STAR_NUM
sx(cnt)=rnd(X_MAX)
sy(cnt)=rnd(Y_MAX)
ss(cnt)=rnd(5)+1
loop
color 0,0,0:boxf
*top
redraw 0
color 0,0,0:boxf
repeat STAR_NUM
cc=50+((ss(cnt)-6)*200)
color cc,cc,cc
//pset sx(cnt),sy(cnt)
boxf sx(cnt),sy(cnt),sx(cnt)+2,sy(cnt)+2
sy(cnt)=sy(cnt)+ss(cnt)
if sy(cnt)>X_MAX:sy(cnt)=0
loop
redraw 1
await 10
goto *top
[star_move.hsp / hsp3用]

(うすあじ)

投稿者 usuaji : 22:19 | コメント (0)

2007年05月15日

【講座】HSPよく使うフレーズ 第30回 ペイントソフト(2)

今回は、HSPセンターの掲示板にあった質問をきっかけに
ズームを使ってみたくなった。

ちなみにHSPセンターはこちら。
http://hspcenter.com/

それで「第12回 ペイントソフトっぽいもの」で作った
簡易ペイントソフトを改造して、リアルタイムで
拡大してくれるものを作ったよ。

実行すると拡大画面が隠れちゃうかもしれないけど、
ウィンドウをずらして確認してみてね。

なんだか拡大してドットがすごいハッキリしてるのがいいなぁ。

1つ基本的なソフトをつくったら、新しい機能を付けたり
できるのもHSPの楽しいところ。

マウスで操作、右のボタンで置くキャラクタを変更できて、
左ボタンでそのキャラを置けます。

欠点としては画面の端では動きがおかしくなる点。
いろいろ方法はあるんだけど、今回はこの辺で。

//zoom editor zoom.hsp
screen 1,300,300
screen 0,640,480
dim paint_char,10,10
paint_char(0)="●"
paint_char(1)="・"
paint_char(2)="★"
paint_char(3)="■"
*top
title ">"+paint_char(n)
x=mousex:y=mousey
stick key,256
if (key & 256):pos x-10,y-10:color 0,0,0:mes paint_char(n)
if (key & 512):n=(n+1) & 3
gsel 1
xofset=x-30:xofset=limit(xofset,0,640)
yofset=y-30:yofset=limit(yofset,0,480)
gzoom 300,300,0,xofset,yofset,60,60
color 255,0,0:boxf 136,136,148,148
gsel 0
await 1
goto *top

[zoom.hsp / hsp3用]

(うすあじ)

投稿者 usuaji : 01:03

2007年05月01日

【講座】HSPよく使うフレーズ 第29回 連続して同じ値が出ない乱数

乱数を作るとき、連続して同じ値が出ては困る!という場合もおおいハズ。
乱数を求めたあとにif文で同じかチェックして戻す、というのもできるけど、
スマートじゃないよねぇ。

そんな時には、最初から同じ値が出ないように計算すればOK。
なんで同じ値にならないかというと・・・ま、それは自分で考えてね。

前回の値はmmだから、最初の一回が0以外になっちゃうのは手抜きだね。

randomize
sdim name,20,20
name.0="オレンジ"
name.1="りんご"
name.2="バナナ"
name_num=3
repeat 10
gosub *rnd_sub
mes ""+mm +") "+ name.mm
wait 5
loop
stop
*rnd_sub
m=mm+rnd(name_num-1)+1
if m>=name_num:m=m-name_num
mm=m
return
[hsp3/rnd_banana.hsp]

(うすあじ)

投稿者 usuaji : 11:59

2007年04月19日

【講座】HSPよく使うフレーズ 第28回 パスワード入力

HSPセンターの掲示板に質問があって、”パスワード入力”を作りたいと
いうのがあったので、ちょっと作ってみた。

そして、さらにメルマガ用に改造してみたよ。

入力はinput、比較はifを使うとできる。

inputにはちょっとコツがあって、いったん処理をとめてユーザーの
入力を待つ処理が必要。それにはbuttonと組み合わせて使うと便利だよ。

”hsp”がパスワードになってます。
暗号にしたり、ファイルに書き出せるようになると面白いね。

sdim pw,100
sdim errmes,100
*screen_init
cls
if errmes!"" :mes errmes
mes "パスワードを入力して<GO>ボタンをクリックしてください。"
input pw
button "GO",*check
stop
*check
if pw="hsp" {
goto *main
} else {
errmes="パスワードが違います。"
goto *screen_init
}
stop
*main
cls
mes "パスワード認証に成功しました。"
stop
[pass.hsp/hsp3]

(うすあじ)

投稿者 usuaji : 20:43

2007年04月03日

【講座】HSPよく使うフレーズ 第27回 15パズルのこと

今回は”kuroさん”からの質問。

”HSP ゲームプログラミング・クックブック ”のスクリプトに
関する内容だ。

ちょっと専門的?な質問だから”よく使うフレーズ”には
あまりふさわしくないかもね。

分からなくても落ち込まなくてイイタイプのテクニックです。

------------
はじめまして。 kuroと申します。

HSPゲームプログラミングクックブックの中に、「15パズル」のサンプル
スクリプトがあります。
その中の71-81行目、問題作成のため入れ替える場所を決める

rnd a,2
rnd b,3
if a{
cx=nx :cy=(ny+b+1)&3
}else{
cy=ny :cx=(nx+b+1)&3
}

【 秀和システム『HSPゲームプログラミング・クックブック』
”15パズル”P85 より引用 】

の部分のスクリプトの意味がよく分かりません。
どうして、空のマスに重ならず、かつ空のマスに接触するマスを
選ぶことができるのでしょうか。
------------

どうも!メールありがとう!

さて、どのようになってるか説明します。

空のブロックの座標はnx、nyです。
クリック対象の座標はcx、cy。

最初に変数aの乱数で、クリックする場所が、"xが同じ"か"yが同じ"か
を振り分ける。

クリックするにはXかYが、空のブロックと同じ必要があるからです。

構造は同じなので「cx=nx :cy=(ny+b+1)&3」の解説をします。

この場合はクリックするx座標は空の場所と同じ。
y座標は「(ny+b+1)&3」
分解すると
ny 空の座標
b 0から2
1 数値1
&3 0-3に変換する命令

となります。

■最初は&3なしで考えます。

ny=0の場合、bが0だと1
0   1  2  3
0【 】【空 】【 】【 】
1【 】【b=0】【 】【 】
2【 】【b=1】【 】【 】
3【 】【b=2】【 】【 】

という並びになります。(今回1の列だけを考えます。)
nyは0から3の可能性があるのですが、どの値の場合でもスタート位置が
ずれて、数値が循環するというのは分かりますか?

仮にny=3なら



【空 】
<ブロックここまで
【b=0】
【b=1】
【b=2】

このようにはみ出てしまいます。

■次に&3があると、はみ出た数値をうまく戻す処理がうまくできます。

2進数は

000
001
010
011
100
101
110
111

という値の増え方をします。

右側の2桁だけをみると同じパターンを繰り返しているのが分かります。

"2桁だけをみる処理"これが「&3」です。
(&「AND」は2桁を切り取るような結果になります。)

&3で

00、01、10、11 このループになるので、
はみ出た部分がぐるっともどります。

【b=0】
【b=1】
【b=2】
【空 】

こんな感じになります。


(バックナンバーの公開ページは図解入りだよ。)

以上です。

というワケでクックブックをもってないとわかりにくいネタで
ゴメンナサイ。

いまでも売ってるといいんだけどねぇ。

(うすあじ)

投稿者 usuaji : 00:56

2007年03月20日

【講座】HSPよく使うフレーズ 第26回 配列で移動

今回は”すごろく”のような表示を作ってみたよ。

クイズやシューティングゲームのステージ表示、すごろくなど、
決められた座標にキャラクターが移動する表示は結構面倒なもの。

キャラクタの位置が16ドット毎など、計算しやすい位置ではなく、
1つずつ違う場合には、座標を配列に入れておくと簡単にできる。

メルマガではグラフィックの用意が面倒なので、最初にバッファ2に
背景を作成しておく。自分でゲームを作る場合には、事前に
グラフィックツールなどで作成してもOK。

キャラクタの移動時には、その背景をgcopyして利用している。

サンプルはマウスのRボタン、Lボタンで移動、ESCキーで終了。

配列の数値は、いろいろ細工しながら何度か使ってるのもポイントだ。
配列っていろいろ使えて便利だよ。

dim px,10:dim py,10
px.0=50,200,450,300,100
py.0=20,50,100,230,300
ofset1=50:ofset2=40
//screen 2,640,480
buffer 2,640,480
cls 4
//ライン描画
color 0,200,255
repeat 4
x1=px(cnt)+ofset1:y1=py(cnt)+ofset1
x2=px(cnt+1)+ofset1:y2=py(cnt+1)+ofset1
line x1,y1,x2,y2
wait 10
loop
//パネル配置
repeat 5
x=px(cnt):y=py(cnt)
color 255,255,0:boxf x,y,x+100,y+100
wait 10
loop
color 255,255,255:pos 400,430
mes "[mouse R/L button] Move."
mes "[esc key] End."
//最初の画面作成
screen 0,640,480:gcopy 2,0,0,640,480
//メインループ
*mainloop
stick key,,1
if (key&128)!0:end
if (key&256)!0:panel--
if (key&512)!0:panel++
panel=limit(panel,0,4)
gosub *meput
await 10
goto *mainloop
stop
*meput
redraw 0
pos 0,0
gcopy 2,0,0,640,480
x=px(panel)+ofset2
y=py(panel)+ofset2
pos x,y
color 0,200,0
mes "★"
redraw 1
return

[hsp3/panel.hsp]

(うすあじ)

投稿者 usuaji : 23:07

2007年03月06日

【講座】HSPよく使うフレーズ 第25回 敵が弾を撃つ

【講座】HSPよく使うフレーズ 第25回 敵が弾を撃つ

前回、背景がスクロールするゲームのようなものでした。

今回は何をしようかな?と思っていたところに、ちょっと前に
掲示板に”敵が弾を撃つ”方法に関しての質問があったので、
ちょっと実験してみることにしたよ。

スクリプトが長くなるので、今回は背景スクロールは無しにして、
プレイヤーは動いて、敵は固定、弾がプレイヤーを目指して発車される、
という事にしてみた。

X座標とY座標をみて、割り算で1回分の増分を、と思ったけど
ここでは全部整数になっちゃうんだよねぇ。
おかげで、プレイヤーに向けて弾を撃ってきても全然あたらない
安全地帯が出来ちゃう。

小数点が扱えるようになると、もっと当たると思うんだけど・・・
正直、あまり高度な計算でもないし、動きも単純だなぁ。

まあ、その改造は見てる読者にお任せします。

いろいろ改装して、カッコ良く、正確に、弾を撃たせまくって下さいね。


screen 0,640,400
mx=200:my=300
//teki
tx=300:ty=40
gosub *tama_mk
*lp1
redraw 0
color 0,0,100:boxf
stick a,5,0
if a&4:mx+=10
if a&1:mx-=10
//me
mx=limit(mx,0,620)
title ""+dx+"/"+ystep
pos sx,sy:color 255,255,0:mes "*"
pos tx,ty:color 255,255,255:mes "■"
pos mx,my:color 0,200,0:mes "▲"
//tama
sx=sx+dx:sy=sy+dy
if sy>400:gosub *tama_mk
redraw 1
await 10
goto *lp1
//
*tama_mk
sx=tx:sy=ty:dy=5
if mx = sx {
dx=0
} else {
ystep=(my-sy)/dy
dx=(mx-sx)/ystep
}
return

[teki1.hsp/hsp3]

(うすあじ)

投稿者 usuaji : 21:22

2007年02月20日

【講座】HSPよく使うフレーズ 第24回 スクロールしてみる

何かゲームっぽいものを、という事で背景スクロールっぽいものを
考えてみた。

背景のスクロールは、別のバッファに用意した背景をずらして
コピーするとできる。

ループの最中になにか状態を維持したい時には、変数を用意して
値を保存しておくといいよ。

ここでは背景のコピー位置を変数iに置く。

最初に背景を640X400だけ作って、gcopyでなぜかコピーするのです。

なぜコピーにするかは秘密なんだけどねぇ。

いろいろ試してみると分かるよ。

screen 0,640,400
//back
buffer 3,640,800
color 100,0,0:boxf
color 50,0,0
repeat 50
rx=rnd (640):ry=rnd(400)
pos rx,ry:mes "★"
await 1
loop
pos 0,400:gcopy 3,0,0,640,400
*lp1
//scroll
redraw 0
pos 0,0:gcopy 3,0,400-i,640,i
pos 0,i:gcopy 3,0,0,640,400
gsel 0
stick a,5,0
if a&4:mx+=10
if a&1:mx-=10
//me
mx=limit(mx,0,620)
title ""+i
pos mx,300:color 0,200,0:mes "▲"
mxx=mx
redraw 1
await 10
i++;
if i>400:i=0
goto *lp1

[scroll.hsp / hsp3]

(うすあじ)

投稿者 usuaji : 22:54

2007年02月06日

【講座】HSPよく使うフレーズ 第23回 スライドショーの素

”スライドショーの素”を作ってみよう。

特定のフォルダに入ってるすべてのjpegファイルを表示させたい、
というような場合にいいね。
スクリーンセーバーで使うと面白そうだ。

さて、順番としては
・ファイル一覧を作る。
・ループでファイル一覧からファイル名を得る。
・そのファイルを表示。
という感じ。

ここではスクリプト(EXE)を置くフォルダの”jpg”というフォルダに
jpegファイルをまとめて置く。
それから拡張子はすべてjpgにする。

さて、順番に見ていこう。
”ファイル一覧”を作るにはdirlist命令を使う。
詳しい情報はHSPのエディタで「dirlist」と打ち込んで、
カーソルを重ねてF1キーを押すとヘルプが表示されるよ。

HSPの疑問点は
・ヘルプ
・HSPに同梱のサンプルスクリプト
・グーグルでの検索
で、かなり解決する。

ここで得られるファイル一覧は、パスのないファイル名のみで、
途中でmes命令で表示しているので、確認できる。

sample1.jpg
sample2.jpg

こんな感じ。
次にループの中で読み込む時にはpicloadのファイル名指定にフォルダを
足してあげてましょう

一通り表示ができたら、何度もループする用に改造するとか、
画面の中央に表示するようにとか、いろいろできそうだね。


sdim tmp,256
sdim buf,256,256
dirlist buf, "jpg\\*.jpg",0
mes buf
notesel buf
mes notemax
repeat notemax
noteget tmp,cnt
picload "jpg\\"+tmp,1
wait 100
loop
end

[hsp3/dirtest1.hsp]

(うすあじ)

投稿者 usuaji : 09:50

2007年01月23日

【講座】HSPよく使うフレーズ 第22回 クリップボードを使う

クリップボードに格納されたテキストを表示してみよう。

テキストを選択して”CTRL+C”で文字が入る場所がクリップボード。
この内容が随時見られたら面白いかも?というスクリプトです。

クリップボード関連の命令は

clipget クリップボードテキスト取得 (hspext)
clipset クリップボードテキスト転送 (hspext)
clipsetg クリップボード画像転送 (hspext)

という3つがあって、全てhspextを使います。
この場合、”hspext.as”を最初にインクルードしておきます。

今回はclipgetでクリップボードの内容を取得し、
タイトルバーに表示するスクリプトです。


#include "hspext.as"
screen 0,800,16
mes "[esc] key:Quit"
sdim buf,1000
*top
clipget buf,64
title ""+buf
stick key,0,0
if key&128:end
wait 10
goto *top

[bufput.hsp/hsp3]

(うすあじ)

投稿者 usuaji : 00:52

2007年01月10日

【講座】HSPよく使うフレーズ 第21回 テキストエディタ

初心にもどって、テキストエディタ風のものを作ってみる。

テキストの読み込み、書き出しにはnoteloadとnotesaveを使う。
長さも変数の指定もいらないので、お気楽です。

それから、buttonには、gotoとgosubが指定できるんですな。
便利になったもんです。

ちなみに、最初の1行は読み込むファイル”test.txt”が
なかったらエラーになるので、その対策。
これも便利ですねぇ。
HSP3になって、便利な命令が増えてます。
いろいろ調べてみると楽しいよ。

onerror gosub *txt_save
notesel buf
noteload "test.txt"
mesbox buf,200,200,1
button gosub "save",*txt_save
button goto "end",*txt_end
stop
*txt_save
notesave "test.txt"
return
*txt_end
end

[hsp3/textedit.hsp]
(うすあじ)

投稿者 usuaji : 21:54

2006年12月05日

【講座】HSPよく使うフレーズ 第20回 背景のあるテキスト表示

前回に引き続き、別バッファの活用方法について説明するよ。

今回はアドベンチャーゲームのようなものを考えてみよう。
背景が単色なら、背景と同じ色でboxfすれば、文字を消せる。
だけど、背景にグラフィックがあって、そこに文字を重ねると、
文字を消すのが難しくなる。

こんな場合には、画面消去というか初期化のために、バッファを
用意してグラフィックを読み込んでおこう。
画面消去の時は、全体をコピーするか、文字のエリアだけを
コピーすればOK。

今回のサンプルでは画面全体をコピーした。

サンプル実行用のグラフィックはこちら
http://www.hspcenter.com/hsptvm/archives/sample.jpg
(WEBブラウザで表示後、右クリックで画像を保存。)

320*240くらいの他のグラフィックでも大丈夫だよ。


screen 0,320,240,0
font "MS ゴシック" , 20 , 17 ; フォントを設定
buffer 2,320,240,0 ;背景
picload "sample.jpg",1
;メイン
gsel 0
mx=20:my=100
a="こんにちは~":gosub *mes_put
wait 100
a="メシがうまい~~!":gosub *mes_put
wait 100
a="1行目だ。\nそして2行目だ。":gosub *mes_put
wait 100
a="-終わり-":gosub *mes_put
wait 100
stop
*mes_put
gosub *bak_put
gmode 2
pos mx+2,my+2:color 0,0,0:mes a
pos mx,my:color 255,255,255:mes a
return
*bak_put
gsel 0:gmode 0:pos 0,0
gcopy 2,0,0,320,240
return

[hsp3/adv_sample.hsp]

(うすあじ)

投稿者 usuaji : 21:13

2006年11月21日

【講座】HSPよく使うフレーズ 第19回 背景のあるキャラクタ移動

【講座】HSPよく使うフレーズ 第19回 背景のあるキャラクタ移動

ゲームで背景を出したい時があるよね。
海だったり、山だったり、RPGなら草原だったり。
最初のうちは背景は黒にしておいて、キャラクタの移動をするときに、
黒で消してから移動、という事になる。

でも、やっぱり写真や細かい絵と重ねたくなる。

というわけで、そんな時には、表示するスクリーンとは別に背景用の
バッファを用意して、消すときには、そこから画像をコピーする方法が
お勧めです。

で、今回のポイント

・画面全部を上書きしちゃってます。

・ちらつきは無視です。

・マウスの座標に”俺”を表示します。

・フォントの指定には3.1b6の新機能”かんたん入力”を活用。
エディタの黒い部分で右クリックしてみよう!

・グラフィックに重ね合わせるgcopyの前には「gmode 2」。
これで背景が黒の場合は透明色扱いになります。

という感じで作ってみたよ。
bufferの文字をscreenにかえると、謎がちょっと分かるかも。

1つバッファを増やすだけで、いろいろな事が出来そうだね。


screen 0,640,480,0
buffer 2,640,480,0 ;バック
buffer 3,100,100,0 ;キャラクタ
font "MS ゴシック" , 36 , 0 ; フォントを設定
;chr
color 0,0,0:boxf
color 0,200,0:mes "俺"
;back
gsel 2
font "MS ゴシック" , 80 , 0 ; フォントを設定
color 100,100,100:boxf
color 0,0,0
mes "■_■_■_■_"
mes "■_■_■_■_"
mes "■_■_■_■_"
;
gosub *bak_put
gosub *ore_put
;
*lab1
mx= mousex
my = mousey
title ""+mx+"/"+my
gosub *ore_put
wait 10
goto *lab1
stop
*ore_put
gosub *bak_put
gmode 2
pos mx,my
gcopy 3,0,0,32,32
return
*bak_put
gsel 0
gmode 0
pos 0,0
gcopy 2,0,0,640,480
return

[hsp3/erase_char.hsp]

(うすあじ)

投稿者 usuaji : 11:06

2006年11月07日

【講座】HSPよく使うフレーズ 第18回 キー入力のいろいろ

今回はちょっと初心にもどって、キー入力について集めてみたよ。

最初はstick命令。
キーボードやマウスのボタンのよく使うものを集めている。
アクションゲームの入力なんかでは、これ1つでもOKだよね。
使い方はぐるぐる回るループの中で値を入力してる。

ループの中で、if分で判断して、何かの仕事をするわけ。
今回のサンプルは全部スペースキーを押すと反応するよ。

;入力のいろいろ stick
*lp1
stick a,,0
if a&16:goto *hitkey
wait 1
goto *lp1
*hitkey
mes "hit!"
goto *lp1
[hsp3/stick.hsp]

次はgetkey命令。
stickと似てるけど、数字で入力するキーを指定する。
やっぱりぐるぐる回るところに配置するよ。
これもスペースキーをみてる。

;入力のいろいろ getkey
*lp1
getkey a,32
if a=1:goto *hitkey:else:cls
wait 1
goto *lp1
*hitkey
mes "hit!"
goto *lp1
[hsp3/getkey.hsp]

最後はonkey命令。
これは他のぐるぐる回るタイプとは違って、命令で宣言しておくと、
キーが押されるとラベルに飛んでしまうという、ちょっと強引な命令だ。
iparamには押したキーの情報が入る。
ためしにスペースキーを押してみると・・・32と表示される。
この数字、さっき見たような・・・

;入力のいろいろ キー割り込み
onkey goto *hitkey
stop
*hitkey
mes "hit!:"+iparam
stop
[hsp3/onkey.hsp]

というわけで、HSPにはいろんなキー入力があるから、
目的にあわせて選ぶといいね。

(うすあじ)

投稿者 usuaji : 03:39

2006年10月25日

【講座】HSPよく使うフレーズ 第17回 中央に表示する

グラフィックや文字を中央に表示したいと思うことは多いハズ。
決まった大きさのグラフィックなら、最初から中央になるようにposを
指定すればいいけど、

グラフィックを読み込んだりして、大きさが変わる場合は計算しないと
イケナイ。

今回は文字の場合で作ってみました。
文字の数を数えて、それに中央の座標から左側にどれくらい移動するか
を計算して、その位置に文字を表示します。

そこでのポイントは
・strlenでは半角1文字分で1文字。全角は2文字となる。
・フォントサイズ20では半角1文字分の幅は10。
・文字が中央に来るためには、文字幅の半分だけ、中央から左にずらす。

という感じです。

;center.hsp
screen 0,640,480
color 255,255,0
line 0,240,639,240
line 320,0,320,480
font msgothic,20:color 0,0,0
sdim word,1000
moji="【講座】HSPよく使うフレーズ"
xx=320-(strlen(moji)*5):yy=230
;mes strlen(moji)
pos xx,yy
mes moji
stop

[hsp3/center.hsp]

投稿者 usuaji : 01:25

2006年10月11日

【講座】HSPよく使うフレーズ 第16回 データを入力する

こないだのアンケートにもあったけど、入力画面のノウハウってのは
どんなのがあるかなぁ?と思って、いくつかスクリプトを書いてみたよ。

今回は生年月日などを入力するスクリプトの最小限のスクリプトはこちら。

;入力画面1 数値変数
pos 100,100
objsize 40,20
input year
input month
input date
button "表示",*step2
stop
*step2
mes ""+year+"年"+month+"月"+date+"日"
stop

[input1.hsp/HSP3]

数値を入れる部分が3つあって、そこに数値を入れたあとに
”表示”ボタンを押すと、入力した値を表示する。
一応、これでも動くのですが、いくつか気になる点があるかなぁ。

一番気になるのは、入力を始める前に”0”がワクに入っているという事。
何かを注文するとか、個数を表す場合には最初に0が出ててもいいけど、
年月日にはちょっと向かない感じがするね。
というわけで、文字変数として入力することにしてみよう。
最初に変数を文字列として用意し、それをinput文に使う。


;入力画面2 文字変数
year=""
month=""
date=""
pos 100,100
objsize 40,20
input year
input month
input date
button "表示",*step2
stop
*step2
mes ""+year+"年"+month+"月"+date+"日"
stop

[input2.hsp/HSP3]

これでも同じように表示する。
でも、この後、計算するときに面倒だったり、全角での入力や異常な値の
入力に対応できません。
困った。

ユーザーは選択するだけにしてみたらどうだろう?
とりあえず月だけ。

;入力画面3 combox
month_sel=0
objsize 40,24
pos 100,100
combox month_sel,100,"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12"
pos 100,200
button "表示",*step2
stop
*step2
month=month_sel+1
mes ""+month+"月"
stop

[input3.hsp/HSP3]

確かに出来るけど・・・
ちなみに、1を選ぶと0行目という感じになってるので、
最後の方に1を足すのがポイント。

もう1回、ユーザーが入力する形式で、しかもエラーメッセージ付きを
考えてみよう。

条件は
・年は1900から2100
・月は1から12
・日は1から31
・全ての値は半角の数字

というわけで、こんな感じです。

;入力画面4 文字変数+エラー
sdim error,10,30
error(0)="エラーメッセージ"
error(1)="年の値が1900未満か半角の数字ではありません。"
error(2)="年の値が2100以上です。"
error(3)="月の値が小さいか半角の数字ではありません。"
error(4)="月の値が大きすぎです。"
error(5)="日の値が小さいか半角の数字ではありません。"
error(6)="日の値が大きすぎです。"
year=""
month=""
date=""
*top
pos 100,100
objsize 40,20
input year
input month
input date
button "表示",*step2
stop
*step2
err_num=0
year_num=int(year)
if (year_num<1900){ err_num=1:goto *erorr }
if (year_num>2100){ err_num=2:goto *erorr }
month_num=int(month)
if (month_num<1){ err_num=3:goto *erorr }
if (month_num>12){ err_num=4:goto *erorr }
date_num=int(date)
if (date_num<1){ err_num=5:goto *erorr }
if (date_num>31){ err_num=6:goto *erorr }
mes ""+year_num+"年"+month_num+"月"+date_num+"日"
stop
*erorr
cls
mes error(err_num)
goto *top

[input4.hsp/HSP3]


えっ?"2100以上"ってのは2100を含んでるって?
まあ、そうなんだけどね。

ま、そのへんは気にせずに。
(うすあじ)

投稿者 usuaji : 00:30

2006年09月28日

【講座】HSPよく使うフレーズ 第15回 ゲームの素

さて、よく使うフレーズを紹介するこのコーナー。
いったい何を紹介しようかなぁ?と思ったところ、定番ゲームの
ブロック崩しの事を思い出したよ。

リアルタイムでユーザーが何かを操作して、ゲームを進める、
基本的なゲームの素として、ラケットの部分を紹介するよ。

今回は”マウス”の入力にあわせて、長方形のラケットを表示する
だけのスクリプトです。

ここで注目のポイントは3つ。

1.リアルタイムで変化する要素はループでつくる。

2.今回表示した座標(変数x)を変数xxに保存して、
  次回のループで利用している。

3.X座標が変化した場合のみラケットを消して描いている。

これで上からタマが落ちて来て反射すればスカッシュ。
リンゴが落ちてきて拾えばリンゴ拾いゲームになるね。
細かい部分は・・・まあ、いろいろいじって見ると何かわかるかも!
それから、4行目のboxfはウィンドウ全体を同じ色に塗りたい時に
便利だよ。

;racket.hsp
screen 0,640,480
color 0,0,0
boxf
*top
x=mousex
title ">"+x
if (xx!x){
title "move"
color 0,0,0
boxf xx,300,xx+70,310
pos x,300
color 0,200,0
boxf x,300,x+70,310
}
xx=x
wait 5
goto *top

[racket.hsp/HSP3]


(うすあじ)

投稿者 usuaji : 10:53

2006年08月29日

【講座】HSPよく使うフレーズ 第14回 続&の使い方

さて、今回は前回の記事をみてくれた「ぽち」さんからの
おたよりです。

「ぽち」さんは前回の「n=(n+1) & 3」を分かりやすく解説して
くれました。

せっかくなので、こちらに掲載します。

----ここから

ある数xを「2のn乗」の数で割ったあまりを求めたいとき、
例では、(n + 1)を4で割った余りを求めたいとき、

(n + 1) \ 4

とする代わりに、

(n + 1) & (4 - 1) → (n + 1) & 3

とすることが出来ます。
これはAND演算(論理積)の特徴で、割られる数と3の2進数11とのAND演算
は、以下のようになり、4で割った余りを求めることと同じ結果になりま
す。

xxxx xx00 & 11 → 0000 0000
xxxx xx01 & 11 → 0000 0001
xxxx xx10 & 11 → 0000 0010
xxxx xx11 & 11 → 0000 0011

演算の結果は0~3、xは0でも1でも必ず0になります。
ではなぜ、(n + 1) \ 4とする代わりに、分かり難い(n + 1) & 3としたか
と言えば、コンピュータのCPUの基本機能として、AND演算などのビット演
算はこれ以上に無いほど高速だからです。
これは、小さい頃から10進数で数を考える仕組みが出来ている人間の脳に
とって、10や100などの10のn乗で割った余りを瞬く間に求められることと
同じだと言えるかも知れません。

この手法は、「2のn乗」で割った余りを求めたいとき意外には使えません。
例えば、100は「2のn乗」ではありませんので、100で割った余りを求める
ために、

(n + 1) & 99

とはできませんので、注意してください。

----ここまで

前回の私の解説より、わかりやすいと思います。
「ぽち」さん、解説ありがとうございました。

というわけで、今回は1回分記事を書くのを夏休みにしちゃう、
うすあじなのでした。

(うすあじ)

投稿者 usuaji : 23:48

2006年08月17日

【講座】HSPよく使うフレーズ 第13回 &の上手な使い方

さて、今回は前回のおさらいです。

前回の記事に対して、読者の又吉さんと矢野さんから同様のメールを
頂きました。
又吉さんのメールを紹介します。

<又吉さんからのメール>
はじめまして、又吉です。
HSPTV!メルマガ第1号から読ませていただいています。
今回、HSPのスクリプトで解らない所があったので、
質問したいと思います。

[hsptv:00019]の
【講座】HSPよく使うフレーズ 第12回 ペイントソフトっぽいもの
に、紹介されていたスクリプトの
if (key & 512):n=(n+1) & 3
 ̄ ̄ ̄ ̄ ̄ ̄
下線部の、"&"の役割がわかりません。
これは、どういったことを行うのですか。
よかったら、教えてください。
<メールここまで>

「n=(n+1) & 3」ですよねぇ。
ちょっと変わった使い方です。

日本語で書くと、
「nに1を足して、3と論理演算のAND(&)をしたものをnに入れる」と
いう事です。

ここでは”nを1つ増やしたい”という目的と、
”nは最大3まで”という条件があります。

3は2進数で 0000 0011 なので、
nと3を&すると結果は

2進数で
00
01
10
11

のどれかに収まります。

今回の&の使い方は、指定したビットの値を取り出したい、
という場合に使うテクニックです。

ちなみに、変数 & 255 で255までの値を取り出せますが、
変数 & 100 では100までの値を取り出すことはできません。
これは2進数に変換してみるとわかります。

1111 1111 (255=128+64+32+16+8+4+2+1)

0110 0100 (100=0+64+32+0+0+4+0+0)
100だとこのようにとびとびになってしまいます。

論理演算についてはこちら
http://hspcenter.com/hspdt/faq4.html#ronri

また、下位2ビットを取り出す方法はこちらが参考になると思います。
http://hspcenter.com/hspdt/faq4.html#4bit

短いスクリプトを作って実験してみると理解が早いと思うので、
是非試してみてください。

repeat 20
moto=cnt
gosub *bincv
ct=ato
moto=cnt & 3
gosub *bincv
mes ct+" & 00000011="+ato+" ("+cnt+")"
wait 10
loop
stop
*bincv
ato=""
repeat 8
ato=""+(moto & 1)+ato
moto=moto>>1
loop
return

[bincv.hsp / hsp3用]


(うすあじ)

投稿者 usuaji : 00:00

2006年08月01日

【講座】HSPよく使うフレーズ 第12回 ペイントソフトっぽいもの

マウスを使ってペイントソフトっぽいものを作ってみよう。

コーヒーを飲みながら昔のパソコンの事を思い出していると、
MacPaintというソフトのことをちょっと思い出した。

マウスでちょっとヘボい絵を描くツールってどうやって作るのかな?
と思ったら簡単そうなので作ってみました。

マウスの位置はシステム変数mousexとmouseyでわかります。
これはウィンドの左上からの座標。

それから、ボタンのクリックはstick命令で検出できます。

左ボタンを押すと●などを置けて、右クリックで置くキャラクタを
変更するというスクリプトにしてみた。

たったこれだけのスクリプトで絵が描けるのは面白いね。

screen 0,640,400
dim paint_char,10,10
paint_char(0)="●"
paint_char(1)="・"
paint_char(2)="★"
paint_char(3)="■"
*top
title ">"+paint_char(n)
x=mousex:y=mousey
stick key,256
if (key & 256):pos x-10,y-10:mes paint_char(n)
if (key & 512):n=(n+1) & 3
await 1
goto *top

[mouse.hsp / hsp3用]

(うすあじ)

投稿者 usuaji : 01:34

2006年07月18日

【講座】HSPよく使うフレーズ 第11回 CSVファイルを読む

夏ですねぇ。
暑中見舞いを出そうかなぁ?どうしようかな?なんていうとき、
住所録からデータを変換する必要とかあったりしますよね?

それから、ゲームのデータをExcelで作って、それを利用したい!
なんていう目的もあるかもしれません。

入力するにはExcelは便利なんだけど、そのままでは使えないので、
CSVファイルで出力することになります。

そのCSVファイルをHSP3で読み込むには、ちょっとだけスクリプトを
書きましょう。

順番としては
(1)noteloadでCSVファイルを読み込み。
(2)csvstrで1行を分割
(3)用意した配列にコピー
という感じです。

サンプルではきちんと処理しているのがわかるように2個目のデータに
色を付けてます。

したの文字の固まりを test.dat という名前で、スクリプトと同じ
フォルダに置きます。
HSPのエディタにコピぺして、保存の時に名前をつけて保存すればOK。

ちょっと長いスクリプトだけど、実験して遊んでみてね。

1,青木,5,6,8,9
0,石田,8,9,4,7
5,植村,8,9,7,9
3,江崎,8,7,9,2
2,小野寺,7,9,6,3

[ test.dat ]

;csvread.hsp
#include "hspda.as"
;読み込み
sdim buf,10000
notesel buf
noteload "test.dat"
sdim a,100,100
repeat notemax
cy=cnt
noteget tmp,cnt
sdim t,100,100
csvstr t,tmp
repeat 6
a(cnt,cy)=t(cnt)
loop
loop
;表示
repeat notemax
cy=cnt
repeat 6
pos cnt*100,cy*20:color 0,0,0
if cnt=1:color 200,0,0
mes a(cnt,cy)
loop
loop
stop

[hsp3:csvread.hsp]

(うすあじ)

投稿者 usuaji : 02:41

2006年07月04日

【講座】HSPよく使うフレーズ 第10回 limit命令は便利

今回はlimit命令は便利な命令だ!というお話。

マウスのx座標をひろって、値を0~100にする場合、
今まではこんな風に書いていました。

x=mousex
if x<0:x=0
if x>100:x=100

ところがlimit命令を使うと簡単にかけます

x=mousex
x=limit(x,0,100)

以上!

うわ、簡単。

調子にのって、ブロック崩しのラケットだけのスクリプトを
書いてみました。
マウスの動きにあわせてラケットが動きます。

色々いじって遊んでみてください。


//limit.hsp
screen 0,640,480
cls 4
wsize=50
*top
title ""+x
x=mousex
x=limit(x,0,640-wsize)
redraw 0
color 0,0,0:boxf
color 0,255,0:boxf x,400,x+wsize,410
redraw 1
wait 1
goto *top

[HSP3用 limit.hsp]

(うすあじ)

投稿者 usuaji : 00:00

2006年06月20日

【講座】HSPよく使うフレーズ 第9回 画像を変形する

”第7回 画像を回転する”の続編としてgsquare命令を使ってみます。

これは、ヘルプの説明では”任意の4点を持つ四角形をコピーまたは
塗りつぶします。”とあります。

画像を台形に変形しながらコピーしたりも出来るので、
なにか面白い効果につかえるかもしれないね。

ちなみに、サンプルでは文字を変形してるけど、
かわりに画像を変形させてもOK。

座標を配列で指定するというのが、ちょっと難しいかな?

いろいろ数値を変えて、実験して覚えてね。

dim x1,10
dim y1,10
dim x2,10
dim y2,10
x1.0=30,170,200,0
y1.0=0,0,200,200
x2.0=0,200,200,0
y2.0=0,0,200,200
screen 2,200,200
color 200,0,0:boxf
color 255,255,255
font "",40,2
mes "納豆は"
mes "ねばねば!"
mes "するぞー!"
gsel 0
gmode 200,200
gsquare 2,x1,y1,x2,y2
stop
[HSP3用 squ.hsp]

(うすあじ)

投稿者 usuaji : 23:13

2006年06月06日

【講座】HSPよく使うフレーズ 第8回 EXEのファイル名を指定

EXEファイルを作るのが面倒だと感じているあなた!
実はHSP3からは、簡単な操作でEXEファイルが作れるようになってるよ。

こんなスクリプトを入力して欲しい。

#packopt name "sample"
#packopt xsize 200
#packopt ysize 100
mes "test"
stop

[HSP3 exetest.hsp]

このようにスクリプトを書くときに、
#packoptでファイル名やウィンドウのサイズを指定しておきます。

EXEファイルを作りたくなったら、「CTRL+F9」を押すだけで
指定したファイル名のEXEファイルが出来ます。

簡単、便利でいいよ。

(うすあじ)

投稿者 usuaji : 13:28

2006年05月24日

【講座】HSPよく使うフレーズ 第7回 画像を回転する

画像を回転させたい!! という思いつきは誰でも一度は思いつく事
じゃないかな?

でも、なんとなく難しい事を覚えないとイケナイのかな? と
よく分からないうちにあきらめちゃうとか、ツールで画像を回転させて
満足とか、そんな人も多いはず。

HSP3では”grotate”という命令が標準で搭載されてるので、
使ってみよう。

grotate命令の4番目のパラメータは角度指定で、単位はラジアン。
ラジアンは2π(パイ)で1回転になるので、ループカウンタの最大値が
なんかうまくいくように設定しています。

実行すると、文字がくるくる回るぞ!
表示される文字をかえたり、スクリプトを改造して、
グラフィックを読み込んで回してみてもいいかもね。

screen 2,200,200
color 200,0,0
boxf
color 255,255,255
font "",50
mes "うすあじ"
mes "ソフト"
gsel 0
pos 200,200
gmode 0,200,200
repeat 629
color 255,255,255:boxf
r=0.01*cnt
grotate 2,0,0,r
redraw 1
await 1
redraw 0
loop
stop

[HSP3用 rote.hsp]

(うすあじ)

投稿者 usuaji : 23:46

2006年04月30日

【講座】HSPよく使うフレーズ 第6回 テキストファイルを読む

【講座】HSPよく使うフレーズ 第6回 テキストファイルを読む

 テキストファイルを読み込むというのは、結構あること。
単純に読むだけならこんな感じで出来る。

notesel buf
noteload "test.txt"
mes buf

まあ、読み込んで表示という単純な方法はこれでOK。

それから、いつも使う変数の名前とかを決めておくと悩まないで
イイです。
私の場合、なにか貯めておく大きな領域はbuf、
1行分だけとか一時的な内容とかはtmpとか。

さて、読み込むだけではあまり意味がないので、
読み込んだテキストを利用する方法を考えましょう。

bufに読み込んだテキストファイルtext.txtを順番に表示して、
左側に行数を出してみます。
行数は0スタートになってます。

結果はこんな感じ

0:サンプル1
1:サンプル2
2:サンプル3
3:サンプル4

スクリプトをみてください。
読み込んだテキストをノートパッド命令で1行ずつ処理します。
各命令はヘルプを見て確かめて見ましょう。
リピートの中のwait命令はおまじないなので、無くても動くけど・・・
おまじないなので、書いておきましょう。

notesel buf
noteload "test.txt"
sdim tmp,1000
repeat notemax
noteget tmp,cnt
mes ""+cnt+":"+tmp
wait 1
loop
stop

[HSP3用 text1.hsp]

サンプル1
サンプル2
サンプル3
サンプル4

[test.txt]

(うすあじ)

投稿者 usuaji : 22:50

2006年04月08日

【講座】HSPよく使うフレーズ 第5回 ゲームっぽいキー入力2

前回の続きで、弾を出してみよう!というワケ。

さて、前回のスクリプトが参考になったかな?
一応、弾をだしたらもっとゲームっぽいカモ、ということで、
やってみたよ。

screen 0,200,400
color 0,0,0:boxf
color 0,255,0
mx=5:my=18
*top
;キー入力
getkey key_left,37 ;<-
getkey key_right,39 ;->
getkey key_space,32 ;space
;座標変化
if key_left:mx-=1
if key_right:mx+=1
;座標チェック
if mx<0:mx=mxx
if mx>11:mx=mxx
mxx=mx:myy=my
;弾移動
if tf {
ty-=1
if ty<0:tf=0
}
;弾
if key_space and tf=0 :gosub *tamamake
;画面再描画
color 0,0,0:boxf
color 0,255,0
pos mx*16,my*16
mes "▲"
if tf:pos tx*16,ty*16:mes "|"
wait 2
goto *top
*tamamake
tf=1:tx=mx:ty=my-1:return

[HSP3用 tama_move.hsp]

ポイントは変数tfというフラグを使っている事。
弾が存在する場合、フラグが1になって弾の移動の処理の時に使うよ。

それから、弾を作る処理は*tamamakeというサブルーチンに分けてみた。

サブルーチンはプログラム上の効率化だけでなく、作っている人の
頭の中を整理する意味でも役にたつよ。
後で修正するときや、別のプログラムに再利用する場合にも便利。

最後に、サブルーチンにはわかりやすい名前を付けよう。

(うすあじ)

投稿者 usuaji : 14:25

2006年03月22日

【講座】HSPよく使うフレーズ 第4回 ゲームっぽいキー入力

 さて、今回は”ゲームでも作るかぁ”と思ったけど、何からやってイイ
か分からないという人の為に、”ゲームっぽいキー入力”を紹介します。

シューティングゲームなどのリアルタイムゲームはだいたいこんな構造に
なっています。

1 [初期設定]
2 [キー入力]
3 [表示]
4 [ちょっと待つ]
5 [2へ戻る]

キー入力して、表示して、ちょっと待って、ループ。
ゲームの基本的な構造はどれでもこんな感じだというのを知った時には
おどろいたけどね。
コンピュータさんはぐるぐるまわってがんばってるんだねぇ。

さて、今回はシューティングゲーム風の画面です。
自機っぽい三角形が、カーソルキーで左右に動くというだけのスクリプト
ですが、ゲームの基本を知りたいという人は実行してみてね。

screen 0,200,400
color 0,0,0:boxf
color 0,255,0
mx=5:my=18
*top
;キー入力
getkey key_left,37 ;<-
getkey key_right,39 ;->
;座標変化
if key_left:mx-=1
if key_right:mx+=1
;座標チェック
if mx<0:mx=mxx
if mx>11:mx=mxx
mxx=mx:myy=my
;画面再描画
color 0,0,0:boxf
color 0,255,0
pos mx*16,my*16
mes "▲"
wait 10
goto *top

[HSP3用 me_move.hsp]

では、ちょっとだけ解説。

「color 0,0,0:boxf」では、描画色を黒にしてboxf命令を実行してます。
この場合、ウィンドウ全域の大きさの四角を画面に描きます。
これで、画面をキレイにするわけです。

「getkey key_left,37 ;<-」ここで左のカーソルキーを入力します。
もし、左のカーソルキーが押されていればkey_leftの値が1になります。

次に「if key_left:mx-=1」でkey_leftが1なら、mxの値を1減らします。
「mx-=1」は「mx=mx-1」と同じ動きになります。

キー入力によって表示する座標が変わって、画面の外に出てしまうと困る
ので、変更後のmxをチェックします。

最後に画面にキャラクターを表示して、ぐるぐるの先頭「*top」に
移動します。

以上、20行ちょっとのスクリプトを書くだけで、プレイヤーの入力を反映
した動きをしてくれるワケで、なんだか不思議な感じだよねぇ。

次回はもうちょっとゲームっぽくなるカモ。

(うすあじ)

投稿者 usuaji : 23:51

2006年03月03日

【講座】HSPよく使うフレーズ 第3回 時刻を表示する

今回は時計を作ります。

HSPで時刻を得るには、”時刻を得る”を英語にした”gettime”を
使います。

a=gettime(n)

とすれば、変数aに指定した値(下記の表)の数値が入ります。

0 : 年(Year)
1 : 月(Month)
2 : 曜日(DayOfWeek)
3 : 日(Day)
4 : 時(Hour)
5 : 分(Minute)
6 : 秒(Second)
7 : ミリ秒(Milliseconds)

さらに、画面がチラつかないように、redraw命令で描画モードを
管理します。描画モード0の時は内部の画面データは書き換えますが、
表示には反映されません。

では、スクリプトです。

*top
redraw 0 ;描画モード0
color 255,255,255:boxf ;全画面を描画
color 0,0,0:pos 0,0 ;カラー設定、座標設定
mes "Time is "+gettime(4)+":"+gettime(5)+":"+gettime(6) ;時刻表示
redraw 1 ;描画モード1
await 50 ;ウェイト
goto *top

[hsp3用]

数行書くだけで時計が出来ました。
画面のチラつきを押さえるredraw命令の使いかたはゲームの基本なので、
いろいろ手を加えて、試してみてください。
(redraw命令を削ってみるとか。)

ちなみにtitle命令を使うとさらに短くなっちゃいます。

*top
title "Time is "+gettime(4)+":"+gettime(5)+":"+gettime(6)
await 50 ;ウェイト
goto *top

[hsp3用]

title命令は画面は画面を邪魔しない便利な命令だから、
デバッグにも大活躍だよ。

(うすあじ)

投稿者 usuaji : 02:03

2006年02月07日

【講座】HSPよく使うフレーズ 第2回 複数の拡張子を指定する

「HSPよく使うフレーズ」はうすあじが担当する、初級よりちょっと先に
行きたい人の為のコーナーです。

さて、今回はdialog命令の使い方の話です。
画像を選択して表示するビューアーのようなモノをつくろう!と思った
ときに、困るのがdialog命令で指定するファイル形式の問題です。

dialog "gif",16,"画像ファイル"

と指定すると、拡張子が"gif"のファイルを選択できるダイアログが出て
きます。しかし、jpegもjpgもgifも読み込みたい!などという場合はどう
しよう?実は複数の拡張子を指定する方法があります。

さて、あまりひねりも無く、答えのスクリプトです。

dialog "jpg;*.jpeg;*.bmp;*.gif",16,"画像ファイル"
if stat=0:stop
picload refstr,0
mes refstr
stop

[hsp3用]

こんな感じで、複数の拡張子を指定することができます。

(うすあじ)

投稿者 usuaji : 21:32

2006年01月17日

【講座】HSPよく使うフレーズ 第1回 乱数を表示する

「HSPよく使うフレーズ」はうすあじが担当する、初級よりちょっと先に
行きた人の為のコーナーです。

1つ1つの命令の意味は分かるけど、それはどんな風に組み合わせれば
いいの?という疑問に答えたり、答えなかったりするよ!

さて、今回はプレゼントの抽選に使うスクリプトです。

今回の”福袋プレゼンの有効応募数はなんと75通もありました。

そこで、抽選スクリプトを組んで実行した結果で当選者を決めました。
こんなのです。

;抽選スクリプト
randomize
wait 100
a=rnd (75)+1
mes a
stop

(HSP3で実行)

75通のメールから1通を選ぶので、1~75のうち、1つの数字を選び出す
スクリプトが必要でした。
では、説明していきます。

2行目のrandomize命令で乱数を初期化します。
これをしないと、乱数が毎回同じになってしまいます。

”wait 100”は押してすぐに結果が出るのも寂しいので、
ちょっとだけ間を持たせる意味で挿入。
なんとなくです。

次のrnd命令で乱数を求めます。
HSP3ではrnd命令の書き方が変更されています。
カッコのなかに75を指定したので、この場合は0~74の答えが出るように
なってます。
そして、その結果に1を足します。
まあ、足しても足さなくていいんだけど、1から始まった方がいい感じが
するので、ここでは1を足しておきます。

これで1~75の数字が表示されます。

プレゼントの結果はこのスクリプトを実行して決めました。

あなたも、プレゼントの抽選結果を決めたいときには、
このスクリプトを・・・あんまり必要ないね。

(うすあじ)

投稿者 usuaji : 23:12