【HSP3】DXライブラリをHSPで使ってみるサンプル(6.サウンドノベル風文字列描画基本)

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N6 のHSP版です。DxLib.as は http://tkooler.moe.hm/hsp/img/DxLib.as から入手可能。

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N6 のHSP版です。DxLib.as は http://tkooler.moe.hm/hsp/img/DxLib.as から入手可能。

#runtime "hsp3cl"
#include "DxLib.as"

// 文字のサイズ
#define MOJI_SIZE 24

	DrawPointX = 0 : DrawPointY = 0	// 文字列描画の位置
	SP = 0 : CP = 0	// 参照する文字列番号と文字列中の文字の位置(ポインタ不使用)

	sdim String, 256, 11
	
	String(0) = " ゲームプログラムとは、いやプログラムとは" 
	String(1) = "ある事柄を実現するプログラムの方法を説明されても理解できないことがある。B" 
	String(2) = "@ なぜならそのプログラム技法も何かの基本的な技法の組み合わせで出来ているからだ。B"
	String(3) = "@ これはその他の学問も基本がわからないと応用が利かないということと同じ現象で、"
	String(4) = "別に特に珍しいことでもない。B" 
	String(5) = "C しかしゲームプログラムとなると覚えなくてはならない基礎が沢山あり、" 
	String(6) = "さらにある程度クオリティの高いソフトを作ろうとすると色々なプログラム技法を"
	String(7) = "習得しなくてはならない。B" 
	String(8) = "@ しかもある程度レベルが高くなると自分で技法を編み出すか、技術レベルの高い"
	String(9) = "プログラマーに聞くなどするしか方法がなく大変厄介である。B"
	String(10) = "というかそのせいでゲームプログラムの敷居は高くなっているといえる。BE"
	
*main
	
	EndFlag = 0			// 終了フラグ
	sdim OneMojiBuf, 64	// 1文字分一時記憶
	
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}

	// 描画位置の初期位置セット
	DrawPointX = 0
	DrawPointY = 0
	
	// 参照文字位置をセット
	SP = 0	// 1行目の
	CP = 0	// 0文字
	
	// フォントのサイズセット
	SetFontSize MOJI_SIZE

	// 終了フラグを倒す
	EndFlag = 0
	
	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break
	
		Moji = peek(String(SP), CP)
	
		switch Moji
			case '@'	// 改行文字
				// 改行処理および参照文字位置を一つ進める
				gosub *Kaigyou
				CP++
			swbreak
			case 'B'	// ボタン押し待ち文字
				// ボタン押し待ちおよび参照文字位置を一つ進める
				WaitKey
				CP++
			swbreak
			case 'E'	// 終了文字
				// 終了フラグを立てるおよび参照文字位置を一つ進める
				EndFlag = 1
				CP++
			swbreak
			case 'C'	// クリア文字
				// 画面を初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
				ClearDrawScreen 0
				DrawPointY = 0
				DrawPointX = 0
				CP++
			swbreak
			default		// その他の文字
				// 1文字分抜き出す(2byteずつ)
				wpoke OneMojiBuf, 0, wpeek(String(SP), CP)
	
				// 1文字描画
				GetColor 255, 255, 255
				DrawString DrawPointX * MOJI_SIZE, DrawPointY * MOJI_SIZE, OneMojiBuf, stat
	
				// 参照文字位置を2バイト勧める
				CP+=2
	
				// カーソルを一文字文進める
				DrawPointX++
	
				// 少し待つ
				WaitTimer 10
	
				// 画面からはみ出たら改行する
				if( DrawPointX * MOJI_SIZE + MOJI_SIZE > 640 ) : gosub *Kaigyou

			swbreak
		swend
		// 終了フラグが1だったら終了する
		if( EndFlag == 1 ) : break
	
		// 参照文字列の終端まで行っていたら参照文字列を進める
		if ( Moji == 0 ){
			SP++
			CP = 0
		}
		
	loop
	
	DxLib_End					// DXライブラリ使用の終了処理
end

stop
// 改行
*Kaigyou
	TempGraph = 0
	
	// 描画行位置を一つ下げる
	DrawPointY++
	
	// 描画列を最初に戻す
	DrawPointX = 0
	
	// もし画面からはみ出るなら画面をスクロールさせる
	if( DrawPointY * MOJI_SIZE + MOJI_SIZE > 480 ){
		// テンポラリグラフィックの作成
		MakeGraph 640, 480
		TempGraph = stat

		// 画面の内容を丸々コピーする
		GetDrawScreenGraph 0, 0, 640, 480, TempGraph

		// 一行分上に貼り付ける
		DrawGraph 0, -MOJI_SIZE, TempGraph, FALSE
		
		// 一番下の行の部分を黒で埋める
		DrawBox 0, 480 - MOJI_SIZE, 640, 480, 0, TRUE

		// 描画行位置を一つあげる
		DrawPointY--

		// グラフィックを削除する
		DeleteGraph TempGraph
	}
return