2009.10.31 Saturday | 08:52

  Windows 3.1 の頃 ふるいむかし

タイムスタンプ 1996
資料だ資料。
誰かの役に立つかもしれない(笑)
#include "libread.h"

//////////////////////////////////////////////////////////////////////
//  ファイルバイナリチェック
//////////////////////////////////////////////////////////////////////
int
chkfbin( char *fname )
{
	int i;
	FILE *fptr;
	long fsize;
	char work[512];

	fptr = fopen( fname, "rb" );
	if ( fptr != NULL ) {
		fseek( fptr, 0, SEEK_END );
		fsize = ftell( fptr );
		if ( fsize > 512 ) {
			fsize = 512;
		}
		fseek( fptr, 0, SEEK_SET );
		fread( work, 512, 1, fptr );
		fclose( fptr );
	}
	else {
		return( -2 );
	}

	for ( i = 0; i < (int)fsize; i++ ) {
		switch( work[i] ) {
			case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05:
			case 0x06: case 0x07: case 0x08:							  case 0x0b:
			case 0x0c:				case 0x0e: case 0x0f: case 0x10: case 0x11:
			case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
			case 0x19:				case 0x1b: case 0x1c: case 0x1d: case 0x1e:
			case 0x1f:
				return( -1 );
		}
	}
	return( 0 );
	
}




2009.06.05 Friday | 16:35

  VB.NET による EasyGame ( まずは基本クラスと初期処理のみ ) ふるいむかし

VB.NET も C# もライブラリ的な扱いは同じなので、
ライブラリ配布サイトよりダウンロードして、exe が作成されるディレクトリに入れ、
参照からDxLibDotNet を読み込んで使います

Form はありますが、使わずに ApplicationEvents.vb を使用します


Imports DxLibDLL

Namespace My

	Partial Friend Class MyApplication

		' ********************************************************
		' スタートアップ
		' ********************************************************
		Private Sub MyApplication_Startup(ByVal sender As Object, _
		ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
		Handles Me.Startup

			DX.ChangeWindowMode(DX.TRUE)

			' 異常終了
			If DX.DxLib_Init() = -1 Then
				e.Cancel = True
				Exit Sub
			End If

			Dim gm As Game = New Game(AddressOf ul)

			gm.Start()

			e.Cancel = True

		End Sub

		Private Function ul(ByVal gm As Game) As Boolean

			Return True
		End Function

	End Class

End Namespace




Game クラスはメインループを含む描画の基本的な処理を受け持ちます。
ゲーム作成者は、クラスの内容を意識しなくて良いように、メソッドを作成し、
Game クラスにそのメソッドを呼び出させます。


Imports DxLibDLL

Public Class Game

	Delegate Function UserLoop(ByVal gm As Game) As Boolean

	Public funcUserLoop As UserLoop

	Sub New(ByVal ul As UserLoop)

		funcUserLoop = ul

	End Sub

	Public Sub Start()

		' 描画先画面を裏画面にセット
		DX.SetDrawScreen(DX.DX_SCREEN_BACK)

		Do

			' Windows Message 処理
			If DX.ProcessMessage() <> 0 Then
				Exit Do
			End If

			' ESC で強制終了
			If DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) = 1 Then
				Exit Do
			End If

			' 画面を初期化する
			DX.ClearDrawScreen()

			' 外側の主処理を呼び出す
			If Not Me.funcUserLoop(Me) Then
				Exit Do
			End If

			' 裏画面の内容を表画面に反映させる
			DX.ScreenFlip()

		Loop

		DX.DxLib_End()

	End Sub

End Class




2009.06.05 Friday | 14:02

  2Dゲームサンプルコードの 01 バージョンです ふるいむかし

Easygame001

ブラウザでダウンロード

一番最初に作った、背景無しで左右に動き、プレーヤー画像をそのままショット画像に
使って、スペースキーと A キーで各々画面上に4つまで表示可能です。

スペースキー : まっすぐ
A : 左45度方向
Q : ショット画像表示中に使用すると、プレーヤーが1回転して以降ショットが回転するようになります

ショットの画像の上にテキストを表示しています

Visual Studio 2005 で最終テストしていますが、
元々 VC6 で作成したものをそのまま変更しただけで動いています。
// ********************************************************
// EasyGame Ver 060904 : リリース初回バージョン
// ********************************************************

#include "DxLib.h"
#include "Game.h"

// ゲーム環境クラス
Game env;

// プレイヤークラス
Play me;

// ショットクラス
Shot st[4];

// ループ Callback 関数
int GameLoop( Game & );
// プレイヤー処理 Callback 関数
int PlayCheck( Game &, Play & );
// ショット一つ一つの処理
int ShotLoop( int curIndex, Game &, Play &, Shot & );

// ********************************************************
// 開始処理
// ********************************************************
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	
	// タイトル設定
	env.SetTitle( "ゲームプログラミング" );
	// ウインドウモード設定
	env.WindowMode();

	// DirectX 初期化
	if ( !env.Init( ) ) {
		return -1 ;
	}

	// プレイヤー画像のロード
	me.Image( "play.bmp" );
	// プレイヤー初期位置
	me.Position( 300, 400 );

	// ショット初期化(画面内最大4つ発射)
	st[0].CreateShot( 4, PAD_INPUT_M );		// スペースキー
	st[1].CreateShot( 4, PAD_INPUT_X );		// A キー

	// ショット画像のロード
	st[0].Image( "play.bmp" );
	st[1].Image( "play.bmp" );

	// 処理開始
	int ret;
	ret = env.Start( GameLoop );

	return 0;
}

// ********************************************************
// 【ゲーム用ループ】
// 終わる時は return false;
// ESC で強制終了
// ********************************************************
int GameLoop( Game &g )
{
	// プレイヤーの処理
	me.Check( PlayCheck, g );

	return true;
}

// ********************************************************
// 【プレイヤー処理関数】
// ********************************************************
int PlayCheck( Game &g, Play &p )
{
	// 右へ移動
	if ( p.right ) {
		p.Move( PAD_INPUT_RIGHT, 3 );
	}
	// 左へ移動
	if ( p.left ) {
		p.Move( PAD_INPUT_LEFT, 3 );
	}

	// 自分自身を描画
	p.Draw();

	// ショット処理
	st[0].Action( ShotLoop, g, p );	
	st[1].Action( ShotLoop, g, p );	
	
	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// ********************************************************
int ShotLoop( int i, Game &g, Play &p, Shot &s )
{

	if ( s.ShotKey == PAD_INPUT_M ) {
		// ショットの移動処理(位置を上にずらす)
		s.ShotY[ i ] -= 8 ;
	}
	if ( s.ShotKey == PAD_INPUT_X ) {
		// ショットの移動処理(位置を上にずらす)
		s.ShotY[ i ] -= 4 ;
		s.ShotX[ i ] -= 4 ;
	}

	if ( s.ShotKey == PAD_INPUT_M ) {
		DrawString(
			s.ShotX[ i ],
			s.ShotY[ i ]-32,
			"気合",
			GetColor( 255 , 255 , 255 ) );
		s.Draw( i );
	}
	if ( s.ShotKey == PAD_INPUT_X ) {
		DrawString(
			s.ShotX[ i ],
			s.ShotY[ i ]-32,
			"根性",
			GetColor( 255 , 255 , 255 ) );
		s.Draw( i );
	}

	return true;
}




2009.06.04 Thursday | 12:10

  3年前に作った2Dゲームサンプルコードの再公開 ふるいむかし

Easygame

ブラウザでダウンロード

最新のDXライブラリを同梱して、ライセンス表示を付加して再公開です。

Visual Studio 2005 で最終テストしていますが、
元々 VC6 で作成したものをそのまま変更しただけで動いています。

※ 得点システム等は無く、ゲームとしては弾を撃って敵に当てるだけです

とりあえず以下は、クラス以外のメインのソースコードです
// ********************************************************
// EasyGame Ver 061105
// ********************************************************

#include "DxLib.h"
#include "Game.h"

// ********************************************************
// ゲーム環境クラス
// ********************************************************
Game env;

// ********************************************************
// プレイヤークラス
// ********************************************************
Play me;

// ********************************************************
// ショットクラス
// ********************************************************
Shot shot_s;
Shot shot_a;

// ********************************************************
// アニメーションクラス
// ********************************************************
Animation ani1[4];
Animation ani2[4];

// ********************************************************
// ショットクラス( 敵 )
// ********************************************************
Shot bad;

// ********************************************************
// 背景用の星描画クラス
// ********************************************************
Star ginga1;
Star ginga2;

int back,parts1;
int px = 0;
int py = 0;
int gw,gh;

// ********************************************************
// Callback 関数宣言
// ********************************************************
int GameLoop( Game & );
int PlayCheck( Game &, Play & );
int ShotLoop1( int curIndex, Game &, Play &, Shot & );
int ShotLoop2( int curIndex, Game &, Play &, Shot & );
int BadLoop( int curIndex, Game &, Play &, Shot & );

// ********************************************************
// ユーザー関数宣言
// ********************************************************
void NumberFormat( char *Target );
void ShotedScroll( );

// ********************************************************
// 開始処理
// ********************************************************
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	// ********************************************************
	// タイトル設定
	// ********************************************************
	env.SetTitle( "ゲームプログラミング" );

	// ********************************************************
	// ウインドウモード設定( SHIFT を押してたらフルスクリーン )
	// ( API を利用したキーの処理 )
	// ********************************************************
	WORD nRet;
	nRet = (WORD)::GetKeyState( VK_SHIFT );
	if( nRet & 0x1000 ) {
	}
	else {
		env.WindowMode();
	}
	///////////////////////////////////////////////////////////

	// ********************************************************
	// DirectX 初期化
	// ********************************************************
	if ( !env.Init( ) ) {
		return -1 ;
	}

	// ********************************************************
	// ディスプレイの色を 16 にして下さい
	// ********************************************************
	SetGraphMode( 800 , 600 , 16 ) ;

	// ********************************************************
	// プレイヤー画像のロード
	// ********************************************************
	me.Image( "play" );

	// ********************************************************
	// プレイヤー初期位置
	// ********************************************************
	me.Position( 390, 520 );

	// ********************************************************
	// ショット初期化(画面内最大4つ発射)
	// ********************************************************
	shot_s.CreateShot( 4, PAD_INPUT_M, "saveshot.dat" );	// スペースキー
	shot_a.CreateShot( 4, PAD_INPUT_X );	// A キー
	bad.CreateShot( 4, -1, "badshot.dat" );	// 敵

	// ********************************************************
	// ショット画像のロード
	// ********************************************************
	shot_s.Image( "shot1" );
	shot_a.Image( "shot2" );
	bad.Image( "shot2" );

	// ********************************************************
	// 爆発アニメーションのロード (対応ショットと数を合わせる)
	// ********************************************************
	ani1[0].Image( "ani1", 4 );
	ani1[1] = ani1[0];
	ani1[2] = ani1[0];
	ani1[3] = ani1[0];
	ani2[0].Image( "ani1", 4 );
	ani2[1] = ani2[0];
	ani2[2] = ani2[0];
	ani2[3] = ani2[0];

	// ********************************************************
	// 銀河エフェクト
	// ********************************************************
	env.GetState();
	ginga1.CreateStarMemory( 250 );
	// 3つ目は、3D 効果を出すかどうか
	ginga1.CreateSeeds( 2, env.ScreenX, env.ScreenY, true );
	// 回転させるかどうか
	ginga1.OptionSpin = true;
	ginga1.inc = 0.01;
//  回転の中心
//	ginga1.SpinX = 100;
//	ginga1.SpinY = 200;
//  3D効果中心
//	ginga1.BaseX = 600;
//	ginga1.BaseY = 200;
//  オプションの結果を次の処理に加算する
//	ginga1.NoRestore = true;

	ginga2.CreateStarMemory( 250 );
	ginga2.CreateSeeds( 1, env.ScreenX, env.ScreenY, true );
	ginga2.OptionSpin = true;
	ginga2.inc = 0.01;
	ginga2.rad = ginga2.endRad / 2;
	ginga2.endRad += ginga2.rad;

	back = LoadGraph( "field.bmp" );
	parts1 = LoadGraph( "parts1.bmp" );
	GetGraphSize( back, &gw, &gh );
	py = gh;

	// ********************************************************
	// 処理開始
	// ********************************************************
	int ret;
	ret = env.Start( GameLoop );

	return 0;
}

// ********************************************************
// 【ゲーム用ループ】
// 終わる時は return false;
// ESC で強制終了
// ********************************************************
int GameLoop( Game &g )
{
	// ********************************************************
	// 背景描画 ( 最初に描画 )
	// ********************************************************
	// 左上
	DrawRectGraph( 0, 0, gw-px, py, px, gh-py, back, false, false ) ;
	// 右上
	DrawRectGraph( px, 0, 0, py, gw, gh-py, back, false, false ) ;
	// 左下
	DrawRectGraph( 0, gh-py, gw-px, 0, px, gh, back, false, false ) ;
	// 右下
	DrawRectGraph( px, gh-py, 0, 0, gw, gh, back, false, false ) ;

	// プレイヤーの処理
	me.Check( PlayCheck, g );

	// ********************************************************
	// 銀河エフェクト ( 最後に描画 )
	// ********************************************************
	ginga1.Draw();
	ginga2.Draw();

	return true;
}

// ********************************************************
// 【プレイヤー処理関数】
// ********************************************************
int PlayCheck( Game &g, Play &p )
{

	double toRad;

	// 左上

	if ( px > 800 ) {
		toRad = atan2( (double)(p.y+32 - (gh - py - 200)), (double)(p.x+32 - (px - gw + 40)) );
		toRad -= 3.14/2;
		DrawRotaGraph( px - gw + 40, gh - py - 200,
				1, toRad,
				parts1, true , false ) ;
	}
	else {
		toRad = atan2( (double)(p.y+32 - (gh - py - 200)), (double)(p.x+32 - (px + 40)) );
		toRad -= 3.14/2;
		DrawRotaGraph( px + 40, gh - py - 200,
				1, toRad,
				parts1, true , false ) ;
	}


	py--;
	if ( py < 0 ) {
		py = gh;
	}

	// 右へ移動
	if ( p.right ) {
		p.Move( PAD_INPUT_RIGHT, 3 );
		px -= 3;
		if ( px < 0 ) {
			px = gw;
		}
	}
	// 左へ移動
	if ( p.left ) {
		p.Move( PAD_INPUT_LEFT, 3 );
		px += 3;
		if ( px > gw ) {
			px = 0;
		}
	}

	// 自分自身を描画
	p.Draw();

	// 味方のショット処理
	shot_s.Action( ShotLoop1, g, p );	// ---> Call Back へジャンプ
	shot_a.Action( ShotLoop2, g, p );	// ---> Call Back へジャンプ

	// 敵のショット処理
	bad.Action( BadLoop, g, p );		// ---> Call Back へジャンプ

	// 味方の弾と、敵の弾の当り判定
	shot_s.HitCheck( bad, ani1 );
	shot_a.HitCheck( bad, ani2 );

	int i;

	// 爆発アニメーション
	for( i = 0; i < ani1[0].nArrayCount; i++ ) {
		ani1[i].Do();
	}
	for( i = 0; i < ani2[0].nArrayCount; i++ ) {
		ani2[i].Do();
	}

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 味方の弾( SPACE キー )
// ********************************************************
int ShotLoop1( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータで決定
	s.SaveShot( i );

	s.Draw( i );

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 味方の弾( A キー )
// ********************************************************
int ShotLoop2( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータによらず、手動設定
	s.ShotY[ i ] -= 6 ;
	s.ShotX[ i ] -= 4 ;

	s.Draw( i );

	return true;
}

// ********************************************************
// ショット処理関数(有効インデックスしか Call されない)
// 敵弾の描画
// ********************************************************
int BadLoop( int i, Game &g, Play &p, Shot &s )
{

	// ショットの移動パターンをデータで決定
	s.SaveShot( i );

	s.Draw( i );

	return true;
}




2009.05.14 Thursday | 06:58

  Highslide JS ふるいむかし

相当軽快ですね。どうなってるか一度中を読んでみたいです。

↓小粋空間が詳しそうなので
http://www.koikikukan.com/archives/2007/01/18-005102.php

↓実装とちょい調査結果です
Highslide JS と Google ストリートビューを合体(2)



2009.05.10 Sunday | 18:31

  IIS+SSL(https) ふるいむかし

Windows XP の IIS で https を開発環境として使う

http://support.microsoft.com/kb/324069/ja

http://homepage2.nifty.com/nonnon/Chinamini/20080326.html

http://tooljp.com/qa/0B1D3C1780D205B7492570390050ED74.html

http://www.verisign.co.jp/serveronsite/help/faq/320040/index.html

http://www.bitlink.co.jp/server/win_iisxp.htm



<< 2/24 >>