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;
}




1/1