2012年02月10日

HSP3.3 を始めてみます1

 今日から、HSP3.3を始めて見たいと思います。

<HSPスクリプトエディターの起動>
 とにかく、ここから出発点です。スタートメニュー>すべてのプログラム>Hot Soup processor 3.3 の中の「HSPスクリプトエディター」をクリックすると起動できます。

<「HSP入門」を立ち上げる>

1helpgamen.jpg

2Nyuumongamen.jpg

<Step1 作業フォルダの確認>
 Start!はあいさつとメニューですので、次のStep1。デフォルトだと作業フォルダが「マイドキュメント」になっていて、そこに画像をコピーしないといけないと書いてあります。とりあえずコピーしてやってみたのですが、マイドキュメントにはいっぱい他のデータがあり、せっかく整理してあるのにこのまま使うとあとあとごちゃごちゃになってしまいそうです。
 そこで、作業フォルダの位置を変更しました。

マイドキュメント>MyHSP>HSP.練習

というようなフォルダを作っておけばいいのかな、と思います。
 そして、それをHSPスクリプトエディターに登録しました。↓

3kidouforudasitei.jpg

 次に、講座で指定の、hsp3ttl.jpg というファイルは、

 HSP3.3をインストールしたフォルダ>doclib

の中にあります。それを上の作業フォルダにコピー。
 これで準備完了。さぁ、はじまり、はじまり〜
--------------
 <お願い>私自身、プログラミングの超初心者なので、まちがいがあるかも知れません。その時はご容赦をお願いします。
 
ラベル:HSP3.3
posted by Shindo Izo at 15:00| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月11日

HSP3.3 を始めてみます2

 Start!、Step1と来て、Step2は用語の説明などですので飛ばして、Step3から本番。ただチュートリアルを忠実にやっていてもつまらないので、適当に横道に逸れたり遊んでみたりしたいと思います。

== Step3 ==
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<画像ファイルのロード>
picload "ファイル名",0 …ウィンドウを初期化して画像ロードする
picload "ファイル名",1 …現在の画面上に画像ロードする
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 エディターの下にでも、「キーワード検索」ウィンドウを表示しながらやると便利です。
 Step3のプログラムを書き、実行してみたところ↓

1saishonopg.jpg

 HSPによるプログラミングの歴史的(?)第一歩を踏み出しました。気分のいいところで次に行きます。

== Step4 ==
 上の方は、注意書きのようなことなので飛ばして、2つめのプログラム行きます。↓

2hutatumepg.jpg

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<画面のクリア>
cls 0 …白で画面をクリアー
cls 1 …明るい灰色で画面をクリアー
cls 2 …灰色で画面をクリアー
cls 3 …暗い灰色で画面をクリアー
cls 4 …黒で画面をクリアー
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  ↑Small Basicなら↓

GraphicWindow.Clear

ってやつですね。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<メッセージの表示>
mes "文字列"
注:変数もOK
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 ↑Small Basicでは↓ 

GraphicWindow.DrawText(x,y,"文字列")
か、
TextWindow.Write("文字列")

って書きますよね。簡潔でいいですねぴかぴか(新しい)
 何はともあれ、Step4終了しました。
-------------
ラベル:Small Basic
posted by Shindo Izo at 15:43| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月12日

HSP3.3 を始めてみます3

 まだ使い始めたばかりですが、HSPとっても使いやすい感じです。
 「HSP入門」続けてみます。

== Step5 ==

step5.jpg

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<ボタンの表示>
button  goto "文字列",*ラベル名 …ボタンが押されたら、*ラベル名に飛ぶ
button  "文字列",*ラベル名 …上と同じ(上の省略形)
button gosub "文字列",*ラベル名 …ボタンが押されたら、サブルーチン「*ラベル名」に飛ぶ
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<プログラムの中断>
stop …プログラム一時中断。ボタンをクリックされるまで待つ時などに使用
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<プログラムの終了>
end …プログラムを終了して、ウィンドウを閉じる
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

 今日はプログラムらしくなりました。ボタンの命令には感心しました。
--------------
ラベル:HSP3.3
posted by Shindo Izo at 17:35| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月13日

HSPを始めてみます4

 HSP入門4回目、Step6に進みます。ランチャーを作るようなので、楽しみです。

== Step6 ==

 前半は、カレントポジションと色の指定方法。Small Basicをやったので、おなじみですね。↓

1Iro.Posi.jpg

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<カレントポジションの指定>
pos X,Y …ウィンドウ座標(X,Y)に移動する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 注意:カレントポジションは次に指定するまで、維持しながらY座標だけ下がっていきます(改行していく)

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<色の指定>
color Red,Green,Blue …Red,Green,Blueは0〜255の値を取る
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 あまりにもおなじみですね。メッセージ、描画の両方とも同じ命令のようです。
  参考:紫…255,0,255 水色…0,255,255 黄色…255,255,0

 次はいよいよ、ミニランチャーの登場です。

2step6.jpg

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<Windowsのファイルを実行する>
exec "ファイル名" …外部のファイルを実行する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 リファレンスには、

 exec "filename",p1,"command"

とありますが、難しいので省略します。よく分かりません。
 あと、

 exec "mplayer SAMP.MID"

も、色々試してみた(もちろんハードディスク内のファイルを指定しました。パスも書いてみました。wmplayerも試しました)のですがうまく行きませんでした。エラーが出てしまいます。
 あまり深入りするのはやめておきます。今後の課題です。

 何はともあれ、ミニランチャーができましたわーい(嬉しい顔)ぴかぴか(新しい)
---------------
posted by Shindo Izo at 20:43| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月14日

HSPを始めてみます5

 HSP入門5回目、Step7に進みます。コメント(注釈)の入れ方と変数の説明です。
 コメントは、Small Basicなら「’」を入れますよね。HSPでは「;」に変わるだけです。変数は誰もが中学校で習ったので簡単ですね。

(問)x=1、y=2の時、zの値を求めよ。

 Z=x+2y
    =1+2×2
    =5            答え:5  100点ぴかぴか(新しい)

ってなやつをさんざんやらされました。それと同じようなものなので、全く問題ないでしょう、楽勝、楽勝ムード晴れ

== Step7 ==

1Hensuu.jpg

 Small Basicで大分やったので、簡単ですねわーい(嬉しい顔)。さて、次はどんなのかな?
-----------

posted by Shindo Izo at 20:50| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月15日

HSPを始めてみます6

 HSP入門6回目、Step8に進みます。マルチステートメント(1行に複数命令を出す)と条件分岐(if文)の説明です。
 マルチステートメントは便利。助かります。何故かというと、1行に1この命令だけだと、縦にどんどんながーくなってしまい見にくいのです。ラッキーぴかぴか(新しい)
 条件分岐はSmall Basicでもおなじみですね。これができないとプログラムにならないのでしっかり憶えておかなくては…。
 Small Basicだと、 If 〜 Then と EndIf というのがセットでしたが、HSPでは、ThenとEndIfがないんですね。へぇ〜がく〜(落胆した顔)

== Step8 ==

プログラムと実行結果↓
1step8.jpg

 上のプログラムをSmall Basicで書くと、うーん、むずかしいですね。ボタン作り、左クリックの判定ルーチンがいりますね。HSPはずいぶん簡単に書けますね。ラッキー。

 ここで、「HSP入門」講座は終わっています。必然的に、「HSPを始めてみます」も終わりです。初級編があればいいんですが…ふらふら
-----------

ラベル:HSP3.3
posted by Shindo Izo at 17:57| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月18日

HSPを使い始めてみて

 6回に渡ってやってみました「HSP入門」も終わってしまいました。
 まだ何も分かっていない状態ですが、少し感想を書いてみたいと思います。

 まず思うのは、付属のエディターが使いやすいということです。付録についているという感じではなくしっかり作り込まれていて、かゆいところに手が届く感じです。エディターからすぐに呼び出せるヘルプ(ドキュメントライブラリー)もしっかりしています。
 まだほとんど使っていませんが、HSPアシスタントもサンプルなどがすぐに呼び出して使えたりするのはありがたいですね。
 次に、記述する言語ですが、Small Basicなどをやっていれば違和感なく移行できると思いました。むしろ、HSBの方がシンプルで分かりやすいような気がします。
 もしまったくプログラミング初めてだとしても、Small BasicよりHSBの方が入りやすいような気がします。HSBはネット上にたくさんのサイト(超初心者から上級者向けまで)がありますので勉強もやりやすいのではないでしょうか。オススメです。
 もっと高次元のプログラミングをされている方の意見はまた違うのかも知れませんが、私は非常に気に入っています。

 というわけで、続けてHSB3.3をやっていきたいと思っています。
 で、次に何をしようかと色々迷いました。そこで、

HSPTVトップページ>HSPで楽しむ>ユーザーコミュニティ>おすすめリンク

に行ってみて探しました。

 うすあじさんの運営されている HSPCenter の中の

 HSP教室

というのが分かりやすそうなので、これをやってみようと思っております。
-----------
ラベル:HSP3.3
posted by Shindo Izo at 17:32| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月20日

HSP3.3のお勉強1

 HSPの門の入り口にとりあえず来ました。もう少し中に入って行きたいと思います。玄関に続く道、って感じですかねぇ。

 うすあじさんの運営されているHSPCenterの中の

 HSP教室 入門編

というのをやって行きたいと思います。

 今日は第1回目。ダウンロードしたフォルダの中の、index.htmlをダブルクリック。HSP教室[入門編]をクリックすると、目次ページになります。
 その1〜その4はすでに「HSP入門」で勉強してマスターしてますので省きます。が、「?」と思ったところがありました。

 year+=1 と year-=1

というところ。これは、

 year=year+1 と year=year-1

の省略形みたいなものではないかと思います。上の方が楽そうです。
 もう一つは、

 print

という命令。マニュアルを見ると、

 mes

と同じ意味で、HSPではmes命令推奨とのこと。憶える必要はなさそうです。

 さて本番です。その5から始めてみます。さっそくゲームです。コンピューターが出した数字を当てるというゲーム。ほんの少しだけ変えてあります。


;乱数で出した数字を当てるゲーム
kaisuu=0 ;数字を当てる回数
randomize ;乱数を同じ数にならないようにする
a=rnd(30)+1 ;1から30までの間の乱数
*top
cls;画面消去
mes "<数当てゲーム>"
mes "数字は1〜30だよ!"
mes "試した回数:"+kaisuu+"回"
button "+",*up_num ;+ボタンが押されたら*up_numへ
button "−",*down_num ;-ボタンが押されたら*down_numへ
button "OK!",*ok_num ;OK!ボタンが押されたら*ok_numへ
mes num
stop
*up_num
num+=1:goto *top
*down_num
num-=1:goto *top
*ok_num
kaisuu+=1
if num=a:goto *atari ;もし数字がaと同じなら*atariへ
if num>a:goto *ookii ;もし大きかったら*ookiiへ
mes "それじゃ小さいね!"
wait 50
goto *top
*ookii
mes "ワォ、大き過ぎ!"
wait 50
goto *top
*atari
mes "やったね、大当たり!"
mes "君は"+kaisuu+"回めに当てたね。"
stop


実行結果↓
1kazuate.jpg

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<乱数値を発生させる>
rnd(最大値) …0〜最大値-1までの数を発生させる
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 注意点:最大値は含まれません。最大値ー1までです。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<乱数が同じ値を取らないようにする>
randomize …時間によって色々な乱数を発生するようになる
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 rnd命令だと、毎回同じ数字を出してくるので、ちょっと欲張って、randomize命令を入れてみました。憶えておいて損はないと思います。
-----------

ラベル:HSP3.3
posted by Shindo Izo at 18:42| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月22日

HSP3.3のお勉強2

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その6 グラフィックを表示しよう

を勉強してみたいと思います。
 まず、

1TrumpCardBack.bmp

のような画像を用意します。(お絵かきソフトで適当に描き、作業フォルダに保存)
 以下打ち込んだプログラムです。例によって少し変更を加えてます。↓


;その6 グラフィックの表示(5枚のカードを描く)
screen 0,600,400 ;ID0のウィンドウを600× 400のサイズで初期化
cls 4 ;バックの色が黒でクリアー
buffer 1,100,100 ;ID1の仮想ウィンドウを100× 100のサイズで初期化
;↑仮想ウィンドウであって実際には表示されない
picload "TrumpCardBack.bmp"
cx=70:cy=100 ;画像の幅と高さ
gsel 0 ;ID1のウィンドウに変更
pos 50,120
gcopy 1,0,0,cx,cy ;ID1のウィンドウの画像をコピペ
pos 150,120
gcopy 1,0,0,cx,cy
pos 250,120
gcopy 1,0,0,cx,cy
pos 350,120
gcopy 1,0,0,cx,cy
pos 450,120
gcopy 1,0,0,cx,cy
stop



実行結果↓
2TrumpJikkou.jpg

 いっぱい初お目見えの命令が出てきました。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<ウィンドウの初期化>
screen ウィンドウID番号,初期化する画面幅,画面高さ
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 まだパラメーターがつく命令がありますが、複雑になるので省きます。以下も同じ。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<仮想画面の初期化>
buffer ウィンドウID番号,初期化する画面幅,画面高
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<描画先の指定>
gsel ウィンドウID番号
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<画面のコピペ>
gcopy ウィンドウID番号,コピー元左上X座標,同Y座標,コピペする幅,高さ
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 マニュアルでは「画面のコピー」となってましたが、コピペをしているような感じがしたので、私の個人的判断で「画面のコピペ」にしてみました。

 一気に複雑になってきました。第1関門かな?。
 でも、ゲームを作るときなんかに役立ちそうな命令ばかりですね。何とか乗り越えなきゃ…わーい(嬉しい顔)たらーっ(汗)
-----------

ラベル:HSP3.3
posted by Shindo Izo at 14:12| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月25日

HSP3.3のお勉強3

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その7 スクリーンセーバーの作り方(1)

を勉強してみたいと思います。
 前回も少し難しいなぁ、と思っていたのですが、今日のは一気に難しいです。沢山の未知の命令が出てきました(汗)。
 しかし、このプログラムではスクリーンセーバーの役目(焼き付き防止)を果たしていませんのでインストールしない方がいいようです。
 実行方法、その他はプログラムの先頭に書いた通りです。エディタ上で、3つの起動オプションを確かめるだけでいいかと思います。
 以下は打ち込んだプログラムです。多少いじってます。↓



;その7 スクリーンセーバー
;起動方法:メニュー>HSP>起動オプションで、/pか/sか/cを入れてから実行する
;終了方法:フルスクリーンの場合、Alt + F4
;実際の使用法:プログラム完成後、Ctrl + F9 でカレントディレクトリーに〜.scr というファイルができるので、それを選択し右クリックでインストール。あとはWindowsのスクリーンセーバーの設定をすれば実際に使えます。
;
#packopt type 2 ;自動作成スクリーンセーバー
#packopt name "sc" ;自動作成、実行ファイル名がsc
s=dir_cmdline : a=strmid(s,1,1)
if (a="P") or (a="p") : goto *sspre ;プレビュールーチンへ
if (a="S") or (a="s") : goto *ssproc ;フルスクリーンルーチンへ
if (a="C") or (a="c") : goto *sscfg ;コンフィグルーチンへ
mes "Unknown switch ["+dir_cmdline+"]" ;エラー表示
stop
*sscfg ;コンフィグ(設定画面)
tt="ここはスクリーンセーバー設定画面なんですが、" ;タイトル名
title tt : width 320,200 ;タイトルバーに文字列表示:ウィンドウの大きさ
mes tt
mes "ですが、空っぽです(^_^;)"
pos 230,140 : button "OK",*ssend ;OKボタンが押されたら終了
stop
*ssend
end
*sspre ;プレビュー画面
cls : mes "プレビュー画面" : mes : mes "ですが、ここも空っぽです" : stop
*ssproc ;スクリーンセーバープログラム本体
ax=ginfo_dispx : ay=ginfo_dispy ;デスクトップ全体のx,yサイズ
bgscr 2,ax,ay,,0,0,ax,ay ;ID2のウィンドウを作成、初期化
*textput ;無限ループ
font "MS ゴシック",72,1
rr=rnd(255) : gg=rnd(255) : bb=rnd(255) ;乱数値(色)
xx=rnd(ginfo_winx) ;乱数値(最大でウィンドウ描画エリアの横幅サイズ)
yy=rnd(ginfo_winy) ;乱数値(最大でウィンドウ描画エリアの縦幅サイズ)
pos xx,yy
color rr,gg,bb
mes "Type [Ctrl]+[F4]"
wait 30 ;プログラム中断を受け入れる時間(無限ループから抜ける)
;無限ループから抜けるには、Alt+F9
goto *textput



実行結果↓
1scrnsaverdayo.jpg

  命令の説明↓

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<自動作成オプション指定>
#packopt type 2 …スクリーンセーバー作成
#packopt name "ファイル名" …作成するファイルの名前指定
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 何のことやらよく分かりませんが(汗)、スクリーンセーバーを作る手順なのでしょう。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<コマンドライン文字列の取得>
s=dir_cmdline …コマンドライン文字列をsに代入
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 これは(上のプログラムでは)起動オプションに何が指定されているか知るための準備と思われます。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<文字列の一部を取り出す>
a=stmid(s,取り出しはじめの数,取り出す文字数)

文字列の始めから何番目の文字から何文字取り出取り出すかを指定してaに代入
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
↑起動オプションをゲットしました。(今日のプログラムでは)

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<ウィンドウタイトルバー表示設定>
title "文字列" …タイトルバーに文字列を表記する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<ウィンドウサイズの指定>
width X,Y …ウィンドウの幅と高さを指定する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<デスクトップ全体のサイズを得る>
ginfo_dispx …幅
ginfo_dispy …高さ
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
↑ウィンドウではなく、モニターのサイズです

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<枠のないウィンドウを初期化する>
bgscr ID,X,Y,GM,X0,Y0,XX,YY

ID …ウィンドウID番号
X …初期化する画面サイズの幅
Y …初期化する画面サイズの高さ
GM …画面モード(指定しないとフルカラー)
X0 …ウィンドウの配置X0
Y0 …ウィンドウの配置Y0
XX …ウィンドウのサイズXX
YY …ウィンドウのサイズYY
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<フォントの指定>
font "フォント名",フォントサイズ,フォントスタイル
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
 フォントサイズはポイント数。フォントスタイルは、1…太文字、2…イタリック体など。面白いのは、足した数を指定すると両方指定したことになります。(例:3なら太文字とイタリックの両方を指定したことになる) 上のプログラムでは、スタイルは省いています。

 長くなってしまいました、疲れましたふらふらバッド(下向き矢印)。私のような超入門者には難しいです。上記の説明は私なりの理解なので間違っているかも知れません。
-----------
ラベル:HSP3.3
posted by Shindo Izo at 17:17| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月27日

HSP3.3のお勉強4

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その8 スクリーンセーバーの作り方(2)

を勉強してみたいと思います。
 
 以下は打ち込んだプログラムです。多少いじってます。↓


;その8 スクリーンセーバー2 本体のみ
*ssproc
ax=ginfo_dispx:ay=ginfo_dispy ;デスクトップのサイズを得る
bgscr 2,ax,ay,,0,0,ax,ay
;ウィンドウID番号2、サイズX、サイズY、フルカラー、サイズX、サイズYで初期化
*mainloop
gosub *brown
goto *mainloop
*brown
cls 4 ;画面を黒でクリアー
font "MS ゴシック",80
ct=0 ;∞の表示回数初期値
xx=ax-250 ;←どうしても意味が分かりません
if ax<10 : ax=100 ;←どうしても意味が分かりません
rx=rnd(xx) ;←どうしても意味が分かりません
rs=rnd(4) ;表示位置をずらすための値
*g2
ct+=1 ;表示回数を数える
if ct>400 : return ;400回を越えたら*brownへリターン
rr=rnd(255) : gg=rnd(255) : bb=rnd(255) ;表示色決定
color rr,gg,bb ;表示色
ry=rnd(ay/80);画面縦の80分の1間隔
ry=ry*80;画面縦の80分の1間隔
rx=rnd(ax/80);画面横の80分の1間隔
rx=rx*80;画面横の80分の1間隔
pos rx+rs,ry+rs ;表示位置
mes "∞"
wait 1;待ち時間 100分の1秒
goto *g2


・上記、*brown の中の
xx=ax-250
if ax<10 : ax=100
rx=rnd(xx)
の3行の意味がどうしても分かりませんでした。何か意味があるのかも知れませんが私には分かりませんでした。

実行結果↓

1scrnsaver2.jpg

 今日は新しい命令はありませんでした。
-----------

ラベル:HSP3.3
posted by Shindo Izo at 14:44| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年02月29日

HSP3.3のお勉強5

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その9 ブロック崩し(1)

を勉強してみたいと思います。
 やっとゲームらしいのをやれそうです。今日はラケットを表示するだけです。
 
 以下は打ち込んだプログラムです。多少いじってます。赤い文字は新しい命令、システム変数↓


;その9 ブロック崩し1(ラケット表示&移動)
screen 0,600,480 ;ウィンドウID0を640*480で初期化
cls 4 ;黒でクリアー
yy=350 ;ラケットのY座標
*mainlp ;メインルーチン
gosub *memove ;ラケットの移動処理ルーチンへ
wait 1 ;100分の1秒待ち時間
goto *mainlp ;無限ループ
;
*memove ;ラケットの移動処理ルーチン
xx=mousex ;マウスのX座標を得る
if xx<10 : xx=10 ;ラケットの左限界
if xx>490 : xx=490 ;ラケットの右限界
if xxx!xx : color 0,0,0 : boxf xxx,yy,xxx+100,yy+5
;マウスが動いていたら、ラケットを消去
color 130,130,100 : boxf xx,yy,xx+100,yy+5 ;新しいラケットを描く
xxx=xx ;ラケットの現在X座標を新しく設置
return


実行結果↓
1rakettoda.jpg

新しい命令、システム変数の説明:
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<マウスの現在X座標を得る>
mousex
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・当然、Y座標は mousey ですね。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<矩形を塗りつぶす>
boxf X0,Y0,X1,Y1
 左上の座標(X0,Y0)〜右下の座標(X1,Y1)の矩形を現在描画色で塗りつぶす
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・省略すると、以下の結果になります
  (X0,Y0)を省略すると、(0,0)から塗りつぶす
(X1,Y1)を省略すると、ウィンドウの右端まで塗りつぶす
  全部省略すると、ウィンドウを全部塗りつぶす
-----------

ラベル:HSP3.3
posted by Shindo Izo at 17:23| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月02日

HSP3.3のお勉強6


 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その10 ブロック崩し(2)

を勉強してみたいと思います。
 今日はボールだけです。
 
 以下は打ち込んだプログラムです。多少いじってます(ボールの四角形を円にしました)。↓

;その10 ブロック崩し2(ボール表示&移動)
screen 0,600,480 ;ウィンドウID0を640*480で初期化
cls 4 ;黒でクリアー
bsixe=20 ;ボールの大きさ
gamex=ginfo_winx-20 ;ウィンドウの横幅-20(ゲーム範囲)
gamey=ginfo_winy-30 ;ウィンドウの縦幅-30(ゲーム範囲)
*mainlp ;メインルーチン
gosub *newball ;ボール生成
gosub *ballmove ;ボールを動かす
gosub *ballput ;ボールを設置
wait 1
goto *mainlp ;無限ループ
*newball ;ボール生成
if bf!0 :return ;ボールが存在するならリターン
randomize ;乱数攪拌
rr=rnd(400) ;0〜399までの乱数
bx=50+rr ;ボールの初期位置X座標
by=1 ;ボールの初期位置Y座標
dx=2 : dy=2 ;ボールの移動スピード
bf=1 ;ボールフラグ:1…存在する(0…非存在)
return
*ballmove ;ボールを動かす
if bf=0 : return ;ボールが存在しないならリターン
by=by+dy : bx=bx+dx ;ボールの新しい位置取得
if by<0 : by=0 : dy=0-dy ;ボールが天井まで来たら反対向ける
if bx<0 : bx=0 : dx=0-dx ;ボールが左壁に来たら反対向ける
if bx>gamex : bx=gamex : dx=0-dx ;ボールが右壁に来たら反対向ける
if by>gamey : by=gamey : dy=0-dy ;ボールが底まで来たら反対向ける
return
*ballput ;ボールを設置
if bf=0 : return ;ボールが存在しないならリターン
color 0,0,0 : boxf bxx,byy,bxx+bsixe,byy+bsixe ;前のボールを消す
color 255,255,255 : circle bx,by,bx+bsixe,by+bsixe ;新しい位置にボールを設置
bxx=bx : byy=by ;新しいボール位置を古いボール位置にする
return

実行結果(ボールの大きさを大きくしてます)↓
booru.jpg

新しい命令の説明:
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<円を塗りつぶす>
circle X0,Y0,X1,Y1,0 …塗りつぶさない
      circle X0,Y0,X1,Y1,1 …塗りつぶす
 左上の座標(X0,Y0)〜右下の座標(X1,Y1)の矩形に内接する円を現在描画色で塗りつぶす
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

-----------

ラベル:HSP3.3
posted by Shindo Izo at 14:50| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月04日

HSP3.3のお勉強7

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その11 ブロック崩し(3)

を勉強してみたいと思います。
 今日はラケットでボールを打ち返すようになります。
 
 以下は打ち込んだプログラムです。多少いじってます。↓


;その11 ブロック崩し3 ラケット+ボール
screen 0,600,480 ;ID0のスクリーンを初期化
cls 4 ;黒で画面クリアー
yy=350 ;ラケットのY座標
bsixe=10 ;ボールの大きさ
gamex=ginfo_winx-20 ;ゲーム域、横幅
gamey=ginfo_winy-30 ;ゲーム域、縦幅
bx=100:by=20 ;ボールの初期座標
dx=5:dy=10 ;ボールの移動距離
bf=1 ;ボールの存在フラグ

*mainlp ;メインルーチン
gosub *ballmove ;ボールを動かすルーチンへ
gosub *ballput ;ボールを設置するルーチンへ
gosub *memove ;ラケットを動かすルーチンへ
gosub *newball ;ボールを生成するルーチンへ
await 20 ;待ち時間
goto *mainlp ;無限ループ

*newball ;ボール生成ルーチン
if bf!0 : return ;ボールが存在しないならリターン
randomize ;乱数攪拌
rr=rnd(400) ;0〜399までの乱数
bx=50+rr ;ボールの発生位置x座標
rr=rnd(20)-10 ;-10〜9までの乱数(毎回違う角度スピードにするため)
if rr>-2 & rr<2:rr=5 ;rrが-1,0,1の時rr=5にする(角度調整)
by=1 ;ボールの発生位置y座標
dx=rr : dy=5 ;ボールの移動距離
bf=1 ;ボール存在するフラグ上げ

*ballmove ;ボールを動かすルーチン
if bf=0 : return ;ボールが存在しないならリターン
bx=bx+dx ;ボールをx座標だけ動かす
;左右の壁判定↓
if bx<0:bx=0:dx=0-dx ;左壁を超すなら反対向ける
if bx>gamex:bx=gamex:dx=0-dx ;右壁を超すなら反対向ける
byy=by ;古いY座標をbyyに代入
by=by+dy ;ボールをy座標だけ動かす
if by<0:by=0:dy=0-dy ;天井を超すなら反対向ける
if (byy<350)&(by>=350):goto *rcheck
 ;↑古いY座標が350未満、かつ新座標が350以上なら*rcheckへ
if by>480:bf=0:color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe
 ;↑Y座標が画面の底を超えたらボールを消去
return
*rcheck ;ラケット当たり判定
if bx<xx:return ;ラケットの左側ならリターン
if bx>(xx+100):return ;ラケットの右側ならリターン
;ラケットに当たったので、
by=350:dy=0-dy:return ;ボールを反対向け、リターン
*overcheck ;ゲーム領域内かどうかチェックする
if by<450:return ;ゲーム領域内ならリターン
bf=0 ;ボール非存在(フラグ下げ)
color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe ;ゲーム領域外なのでボール消去
return

*ballput ;ボールを設置するルーチン
if bf=0 : return ;ボールが存在しないならリターン
color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe ;古いボール消去
color 255,255,255:circle bx,by,bx+bsixe,by+bsixe,1 ;新しいボール設置
bxx=bx : byy=by ;ボール現在位置を古い位置に設定
return

*memove ;ラケットを動かすルーチン
xx=mousex ;マウスの現在位置(X座標)を得る
if xx<0 : xx=0 ;マウス位置の左壁限界
if xx>490 : xx=490 ;マウス位置の右壁限界
if xxx!xx:color 0,0,0:boxf xxx,yy,xxx+100,yy+10
 ;↑ラケットの旧位置と現在位置が違うなら(ラケットが動いたら)ラケットを消去
color 130,130,100:boxf xx,yy,xx+100,yy+10 ;新ラケット表示
xxx=xx ;現在位置を旧位置に設定
return

実行結果↓
ballraketto.jpg

命令の説明↓
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<waitとawaitの違い>
wait…百分の1秒単位。CPU負担軽。一般的。
await…千分の1秒単位。CPU負担重い。ゲーム向き。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・何度も出てきましたが、ゲームにはawaitの方がいいそうです。

-----------

ラベル:HSP3.3
posted by Shindo Izo at 20:39| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月06日

HSP3.3のお勉強8

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その12 ブロック崩し(4)

のブロック表示部分だけ打ち込んでみました。
 
 以下は打ち込んだプログラムです。多少いじってます。↓


;その12 ブロック崩し4 ブロック表示部分
screen 0,600,480 ;ID0のスクリーンを初期化
cls 4 ;黒で画面クリアー
sdim map,50 ;変数mapに50文字分のメモリを確保
map="1111111"+"1010101"+"1101011"+"1111111" ;
nowmap="" ;現在のマップは空
nowmap=map ;現在のマップの初期定義
gosub *allbl ;全てのブロック表示ルーチンへ
stop
*allbl ;全てのブロック表示ルーチン
i=0:cc=0
repeat 4 ;ループ1、以下を4回繰り返す
 cty=cnt ;ループ回数をctyに代入
 repeat 7 ;ループ2、以下を7回繰り返す
  code=peek(nowmap,i) ;nowmapからi番目の値をcodeに代入
  i++ ;iを1増やす
  if code='0':color 0,0,0 ;codeが0なら黒(何もなし)
  if code='1':color 208,219,119:cc++
   ;↑codeが1なら色をつけて(ブロックあり)ccを1増やす
  boxf cnt*80+20,cty*20+40,cnt*80+20+75,cty*20+40+15
   ;↑座標(ループ2のループカウント× 80+20,ループ1のループカウント× 20+40)から75× 15の大きさのブロックを描く
 loop ;ループ2
loop ;ループ1
if cc=0:nowmap=map:goto*allbl ;ブロック数が0なら初期化し最初からブロックを描きなおす
return

実行結果↓
blockhyouji.jpg

命令の説明↓
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<文字列型の配列変数作成>
sdim 変数名,デフォルト文字数
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<ループ>
repeat 回数,cntのスタート値  …  loop
repeatとloopの間を回数分繰り返す
cntはシステム変数で、何回目のループかを表す
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・cntはシステム変数(ユーザー定義ではなく)です。同じ名前で、それぞれのループの回数を数えていますので、要注意です。
・i++ cc++ とか出てきました。とまどいましたが、i+1 c+1 の意味のようです。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<バッファから1byte分読み出す>
任意の変数名=peek(元の変数名,バッファのインデックス)
何番目かの(インデックス)元の変数に格納された文字(1byte)を取り出す
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・1番目のインデックスは0なので要注意です。

-----------

ラベル:HSP3.3
posted by Shindo Izo at 15:17| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月07日

HSP3.3のお勉強9


 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その12 ブロック崩し(4)

の完全版です。
 
 以下は打ち込んだプログラムです。多少いじってます。↓


;その11 ブロック崩し3 ラケット+ボール
screen 0,600,480 ;ID0のスクリーンを初期化
cls 4 ;黒で画面クリアー
yy=350 ;ラケットのY座標
bsixe=10 ;ボールの大きさ
gamex=ginfo_winx-20 ;ゲーム域、横幅
gamey=ginfo_winy-30 ;ゲーム域、縦幅
gosub *newball ;ボールを生成するルーチンへ
sdim map,50 ;変数mapに50文字分のメモリを確保
map="1111111"+"1010101"+"1101011"+"1111111" ;
nowmap=""
nowmap=map
gosub *allbl ;全ブロック表示サブルーチンへ

*mainlp ;メインルーチン
gosub *ballmove ;ボールを動かすルーチンへ
gosub *ballput ;ボールを設置するルーチンへ
gosub *memove ;ラケットを動かすルーチンへ
gosub *newball ;ボールを生成するルーチンへ
await 20 ;待ち時間
goto *mainlp ;無限ループ

*newball ;ボール生成ルーチン
if bf!0 : return ;ボールが存在しないならリターン
randomize ;乱数攪拌
rr=rnd(400) ;0〜399までの乱数
bx=50+rr ;ボールの発生位置x座標
rr=rnd(20)-10 ;-10〜9までの乱数(毎回違う角度スピードにするため)
if rr>-2 & rr<2:rr=5 ;rrが-1,0,1の時rr=5にする(角度調整)
by=1 ;ボールの発生位置y座標
dx=rr : dy=5 ;ボールの移動距離
bf=1 ;ボール存在するフラグ上げ

*ballmove ;ボールを動かすルーチン
if bf=0 : return ;ボールが存在しないならリターン
bx=bx+dx ;ボールをx座標だけ動かす
;左右の壁判定↓
if bx<0:bx=0:dx=0-dx ;左壁を超すなら反対向ける
if bx>gamex:bx=gamex:dx=0-dx ;右壁を超すなら反対向ける
gosub *blckx ;ブロックにボールが当たったか判定(X座標)
byy=by ;古いY座標をbyyに代入
by=by+dy ;ボールをy座標だけ動かす
if by<0:by=0:dy=0-dy ;天井を超すなら反対向ける
if (byy<350)&(by>=350):goto *rcheck
 ;↑古いY座標が350未満、かつ新座標が350以上なら*rcheckへ
gosub *blcky ;ブロックにボールが当たったか判定(Y座標)
if by>480:bf=0:color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe
 ;↑Y座標が画面の底を超えたらボールを消去
return
*rcheck ;ラケット当たり判定
if bx<xx:return ;ラケットの左側ならリターン
if bx>(xx+100):return ;ラケットの右側ならリターン
;ラケットに当たったので、
by=350:dy=0-dy:return ;ボールを反対向け、リターン
*overcheck ;ゲーム領域内かどうかチェックする
if by<450:return ;ゲーム領域内ならリターン
bf=0 ;ボール非存在(フラグ下げ)
color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe ;ゲーム領域外なのでボール消去
return

*ballput ;ボールを設置するルーチン
if bf=0 : return ;ボールが存在しないならリターン
color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe ;古いボール消去
color 255,255,255:circle bx,by,bx+bsixe,by+bsixe,1 ;新しいボール設置
bxx=bx : byy=by ;ボール現在位置を古い位置に設定
return

*memove ;ラケットを動かすルーチン
xx=mousex ;マウスの現在位置(X座標)を得る
if xx<0 : xx=0 ;マウス位置の左壁限界
if xx>490 : xx=490 ;マウス位置の右壁限界
if xxx!xx:color 0,0,0:boxf xxx,yy,xxx+100,yy+10
 ;↑ラケットの旧位置と現在位置が違うなら(ラケットが動いたら)ラケットを消去
color 130,130,100:boxf xx,yy,xx+100,yy+10 ;新ラケット表示
xxx=xx ;現在位置を旧位置に設定
return
*blckx ;ブロックにボールが当たったか判定(X座標)
if (bx<19)|(bx>579) :return ;ブロックのない左右はリターン
if (by<39)|(by>119) :return ;ブロックのない上下はリターン
xof=(bx-20)/80 ;左から何番目のブロックか
yof=(by-40)/20 ;上から何番目のブロックか
i=yof*7+xof ;左上からi番目のブロック
code=peek(nowmap,i) ;i番目の配列を読む
if code='0':return ;0(ブロックが非存在)
dx=0-dx ;ブロックに当たったのでボールを反対向ける
zz='0' ;ブロックが破壊された
poke nowmap,i,zz ;配列のi番目にzzを書き込む
gosub *allbl ;全ブロック表示サブルーチンへ
return
*blcky ;ブロックにボールが当たったか判定(Y座標)
if (bx<19)|(bx>579) :return ;ブロックのない左右はリターン
if (by<39)|(by>119) :return ;ブロックのない上下はリターン
xof=(bx-20)/80 ;左から何番目のブロックか
yof=(by-40)/20 ;上から何番目のブロックか
i=yof*7+xof ;左上からi番目のブロック
code=peek(nowmap,i) ;i番目の配列を読む
if code='0':return ;0(ブロックが非存在)
dy=0-dy ;ブロックに当たったのでボールを反対向ける
zz='0' ;ブロックが破壊された
poke nowmap,i,zz ;配列のi番目にzzを書き込む
gosub *allbl ;全ブロック表示サブルーチンへ
return
*allbl ;全ブロック表示サブルーチン
i=0:cc=0
repeat 4 ;ループ1、以下を4回繰り返す
 cty=cnt ;ループ回数をctyに代入
 repeat 7 ;ループ2、以下を7回繰り返す
  code=peek(nowmap,i) ;nowmapからi番目の値をcodeに代入
  i++ ;iを1増やす
  if code='0':color 0,0,0 ;codeが0なら黒(何もなし)
  if code='1':color 208,219,119:cc++
   ;↑codeが1なら色をつけて(ブロックあり)ccを1増やす
  boxf cnt*80+20,cty*20+40,cnt*80+20+75,cty*20+40+15
   ;↑座標(ループ2のループ数× 80+20,ループ1のループ数× 20+40)から75× 15の大きさのブロックを描く
 loop ;ループ2
loop ;ループ1
if cc=0:nowmap=map:goto*allbl ;ブロック数が0なら初期化し最初からブロックを描きなおす
return

実行結果↓
blockkuzusikanzen.jpg

新しい命令の説明↓

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<バッファから1byte分書き込む>
poke(バッファの変数名,バッファのインデックス,バッファに書き込む値)
バッファの何番目か(インデックス数)を新しく書き換える
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・配列の中身は、'で囲まないといけないようです。'3'というように…。
の分析
xof=(bx-20)/80 ;左から何番目のブロックか
yof=(by-40)/20 ;上から何番目のブロックか
i=yof*7+xof ;左上からi番目のブロック
において、

 xof…ボールが左から何列目の所にいるかというのを知る
 yof…ボールが何行目のラインにいるかを知る

ということだと思います。
 1行に7こブロックがあるので、ブロックのインデックスは、

 インデックス=7列×yof + xof

になります。(だと思います多分)
-----------
posted by Shindo Izo at 18:56| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月11日

HSP3.3のお勉強10

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その13 マップ表示(1)


です。マップを東京湾みたいにしてみました。

 まず、ペイントソフトで、

 1NoharaMap.bmp  2UmiMap.bmp

のようなファイルを作り、カレントディレクトリーに保存しておきます。
 
 以下は打ち込んだプログラムです。多少いじってます。↓


;その13 マップ表示1(東京湾)
 dim map,200 ;変数mapに200こ要素枠を割り当てる
 map="00000000"
 map=map+"00110000"
 map=map+"01110001"
 map=map+"01111001"
 map=map+"01110000"
 map=map+"00100001"
 map=map+"00110001"
 map=map+"01100011"
 ;
 buffer 1,100,100 ;ウィンドウID1に100× 100の仮想画面を初期化
 picload "Noharamap.bmp" ;画像読み込み
 buffer 2,100,100 ;ウィンドウID2に100× 100の仮想画面を初期化
 picload "UmiMap.bmp" ;画像読み込み
 ;
 gsel 0 ;ウィンドウID0に変更
 screen 0,600,480 ;ウィンドウID0に600× 480の画面を初期化
 cls 4 ;黒で画面クリアー
 gosub *allmap ;全てのマップ表示ルーチンへ
 stop
*allmap ;全てのマップ表示ルーチン
 repeat 8
   cty=cnt ;マップ上のY座標(0〜7)
   repeat 8
     code=peek(map,i) ;mapからi番目の文字を取得
     i++ ;i=i+1
     if code='0' : pb=1 ;codeが0ならウィンドID1
     if code='1' : pb=2 ;codeが1ならウィンドID2
     pos cnt*32,cty*32 ;カレントポジションをウィンドウ上の座標(X,Y)に設定
     gcopy pb,0,0,32,32 ;ウィンドウIDpbの(0,0)から32ドット四角形分コピー
   loop
 loop
 await 1
 return 
実行結果↓
3tokyowan.jpg

 特に新しい命令はないと思います。
-----------
ラベル:HSP3.3
posted by Shindo Izo at 17:18| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月16日

HSP3.3のお勉強11

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その14 マップ表示(2)

です。マップを関東一円にしてみました。
 平野と海だけでは寂しいので、

1YamaMap.bmp

のような山を作りました。
 問題はマップで、16×16マスのマップだと適当に書くとうまく行きませんでした。そこで、ペイントソフトで、

2.16.16.Kanto.Map.jpg

のような絵を描き、さらに

3mapsuuji.jpg

のように一旦、メモ帳でマップの値を書いて、プログラムにコピペしました。

 以下は打ち込んだプログラムです。多少いじってます。↓


;その14 マップ表示2(関東4周)
sdim map,2000 ;2000文字分のメモリを確保

buffer 1,100,100 ;ウィンドウID1に100*100の仮想画面初期化
picload "NoharaMap.bmp" ;マップ読み込み
buffer 2,100,100 ;ウィンドウID2に100*100の仮想画面初期化
picload "UmiMap.bmp" ;マップ読み込み
buffer 3,100,100 ;ウィンドウID2に100*100の仮想画面初期化
picload "YamaMap.bmp" ;マップ読み込み

gsel 0 ;ウィンドウID0を指定
screen 0,600,480 ;ウィンドウID0を600*480サイズで初期化
cls 4 ;黒で画面クリアー
wide=16 ;マップの幅(16マス)

map=       "2222222222000111"
map=map+"2222222220000111"
map=map+"2222222200000111"
map=map+"2222222200000011"
map=map+"2222222000000011"
map=map+"2222220000220001"
map=map+"2220000000200001"
map=map+"2220001102201111"
map=map+"2222001102001111"
map=map+"2220111022011111"
map=map+"0000110222011111"
map=map+"1110010222011111"
map=map+"1110110200011111"
map=map+"1111110001111111"
map=map+"1111100011111111"
map=map+"1111110111111111"
;
  repeat 4 ;4周する
repeat 8 ;表示が下に下がっていく
 mox=0:moy=cnt ;8マスマップの描き始め位置指定
 gosub *allmap ;8マス表示ルーチンへ
loop
repeat 8 ;表示が右に移動する
 mox=cnt:moy=8 ;8マスマップの描き始め位置指定
 gosub *allmap ;8マス表示ルーチンへ
loop
repeat 8 ;表示が上に上がっていく
 mox=8:moy=8-cnt ;8マスマップの描き始め位置指定
 gosub *allmap ;8マス表示ルーチンへ
loop
repeat 8 ;表示が左に移動する
 mox=8-cnt:moy=0 ;8マスマップの描き始め位置指定
 gosub *allmap ;8マス表示ルーチンへ
loop
  loop
stop
*allmap ;8マスマップを表示するルーチン
redraw 2 ;表示せず再描画
i=0
repeat 8
 cty=cnt ;cty行目
 i=(moy+cnt)*wide+mox
 ;↑(描き始めの位置+行数)× マップ幅+描き始めのマップ位置
 repeat 8 ;cty行目の左からcnt目を描く↓
   code=peek(map,i) ;mapのi番目の文字を読む
   i++ ;i=i+*
   if code='0' : pb=1 ;code=0ならウィンドウID1
   if code='1' : pb=2 ;code=1ならウィンドウID2
   if code='2' : pb=3 ;code=1ならウィンドウID3
   pos cnt*32,cty*32 ;カレントポジション指定(描く位置)
   gcopy pb,0,0,32,32 ;ウィンドウID=pbに32*32ドット分コピーする
 loop
loop
redraw 1 ;マップを表示する
await 200 ;待ち時間
return

実行結果↓(画面が動いているところ)
4jikkokanto.jpg

 新しい命令の説明↓

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<再描画設定>
redraw 0(もしくは2) …仮想画面に描く(実際には表示しない)
redraw 1 …実際の画面に反映する
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・うすあじさんの説明によりますと、redraw 0 よりも redraw 2の方がよいとのことです。理由はいまひとつ分かりません。速くなるのかな??
-----------

ラベル:HSP3.3
posted by Shindo Izo at 14:54| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月17日

HSP3.3のお勉強12

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その15 文字列の検索(1)

です。

 以下は打ち込んだプログラムです。多少いじってます。↓


;その15 文字列の検索1
sdim tr,200 ;trに200文字分のメモリーを確保する
sdim cpw,200 ;cpwに200文字分のメモリーを確保する
hct=0
tr="HSP is interesting,isn't it?" ;検索される文字列
cpw="is" ;検索する文字
hct=instr(tr,0,cpw) ;文字列trの最初から文字列cprを検索する
;↑見つかったら何番目(インデックス)、見つからなかったら-1を返す
mes "0123456789012345678901234567890123456789" ;文字の位置(定規)
mes tr ;trを表示
if hct=-1 : mes "Not found!" :stop
;↑もし文字列が見つからなかったら"Not found!"を表示する
mes "Found ["+cpw+"],Index No."+hct
;↑見つかったこととインデックスナンバーを表示する
stop


実行結果↓
Kensaku1.jpg

 新しい命令の説明↓

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<文字列の検索>
任意の変数=instr(検索される文字列型変数,検索を始めるインデックス,検索する文字列)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・見つかった場合は、そのインデックスナンバーを、見つからなかったら、-1を返してきます。
-----------

ラベル:HSP3.3
posted by Shindo Izo at 18:30| Comment(0) | HSP3.3入門 | 更新情報をチェックする

2012年03月18日

HSP3.3のお勉強13

 HSP教室 入門編(うすあじさんの運営されているHSPCenter内)、今日は、

 その15 文字列の検索(2)

です。複数の文字列が存在する場合を想定されてます。

 以下は打ち込んだプログラムです。多少いじってます。↓


;その15 文字列の検索2(複数個検索文字が存在する場合)
tr="my father has my pen and my mother has my pen,too" ;検索される文字列
trl=strlen(tr) ;文字列の長さを取得
cpw="my" ;検索する文字列
hbuf=str(hbuf) ;文字列に変換する
i=0
*searchlp ;検索ループルーチン
hct=instr(tr,i,cpw) ;trのi番目からcpwを検索して、そのインデックスを返す
if hct=-1 : goto *searchend ;もしなかったら終了ルーチンへ
ii=i+hct ;始めからのインデックス
hbuf=hbuf+ii+"、" ;最後の表示用に使う文字列
i=i+hct+1 ;次検索し始める時のインデックス値
if i>=trl : goto *searchend ;すべて検索したら終了ルーチンへ
goto *searchlp ;ループ
*searchend ;終了、結果表示ルーチン
mes "0     10        20        30        40" ;←↓定規
mes "01234567890123456789012345678901234567890123456789"
mes tr : mes ;検索される文字列表示
mes "検索文字列[ "+cpw+" ]は:"
mes "Index No."+hbuf+"にありました。" ;インデックスナンバー表示
stop


実行結果↓
Kensaku2.jpg

 新しい命令の説明↓

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<文字列の長さを調べる>
任意の変数=strlen(検索される文字列型変数)
文字列の長さを返してきます
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
・日本語の場合は2文字分に計算されるそうです。

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆<文字列に変換する>
任意の変数=str()
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

-----------

ラベル:HSP3.3
posted by Shindo Izo at 17:58| Comment(0) | HSP3.3入門 | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。