2009年05月16日

中途採用募集のお知らせ

ラクサスでは中途採用の募集を行っております。

転職サイトgreenにて、企業紹介や求人案内を行っていますので是非ご応募ください。

応募は↓こちら↓から

企業詳細
http://www.green-japan.com/company/1443.html
求人詳細
http://www.green-japan.com/jobs/1443.html



お問い合わせ
----------------------------------
株式会社ラクサス/採用担当 長倉
電話  048-851-5620
E-Mail info@raxus.co.jp
http://www.raxus.co.jp/
----------------------------------
タグ:raxus
posted by ラクサス at 11:25| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2009年05月15日

第0x01回 "Window"sの基本はWindowから

Windowsでは、たくさんのウィンドウを表示し様々な処理を行います。
どのアプリケーションでも例外なく(※1)、ウィンドウを表示します。

そこで、まずはウィンドウを表示するところから、始めていく事にしましょう。

Windowsでは、ウィンドウの表示を行うために、『Win32API』と呼ばれる
ライブラリを用います。

Win32APIとは、プログラムからWindowsに対する要求を一手に担ってくれる
橋渡し的な存在で、これによりプログラマはWindowsの中身を知ることなく
プログラミングを行うことができます。

Win32APIでは、ウィンドウ表示の他に、メニューや画像などの描画、印刷、
マルチスレッドやプロセス生成といったことまで行うことができます。

(※1)
例外はあります。タスクに常駐するアプリケーションや、
そもそもウィンドウを持たないアプリケーションです。
実装にもよりますが、大抵はウィンドウをHide(隠す)ことにより、
ウィンドウがないアプリケーションを実現しています。

では、早速ウィンドウを表示するサンプルプログラムです。

sample001.cpp(ソースコードのみ)
sample001.zip(VS.NET 2008プロジェクト)


重要となる部分を説明していきます。


#include <windows.h>


Windowsのプログラムを作成するにあたり、windows.hは必須となるヘッダファイルです。
このヘッダの中に、Windowsプログラムに必要な定義が行われています。


int WINAPI WinMain( HINSTANCE   hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )


これは、C言語のコンソールプログラムにおけるmain()にあたる、プログラムのエントリーポイントになります。

第1引数でアプリケーションのインスタンスが渡されます。
これはアプリケーションをユニークに指定するために必要で、時折Win32API側でアプリケーションを特定するために必要とされます。

第4引数でウィンドウの表示設定が渡されます。
この表示設定とは、Windowsの実行ファイルのプロパティに設定されている、実行するときに「最大化で起動する」「最小化で起動する」などの設定が渡されます。
この値を用いて、要求どおりにShowWindow()するのが、Windowsでの行儀よいプログラムと言えます。



if( !RegisterClassEx( &wcl ) )
return -1; // 失敗


この部分でウィンドウクラスを登録します。
ウィンドウクラスとは、ウィンドウの概観を決めたテンプレートのようなもので、
後のウィンドウ作成時に、このテンプレートを指定することにより、ウィンドウを作成することができます。
ウィンドウクラスは使いまわしすることができるので、同じ概観のウィンドウを複数表示したい場合、
同じウィンドウクラスを指定することで同様のウィンドウを作成することもできます。



hWnd = CreateWindow(APP_NAME ,
APP_NAME ,
WS_OVERLAPPEDWINDOW ,
0 , 0 ,
200 , 150 ,
NULL ,
NULL ,
hInstance ,
0 );


この関数は、実際にウィンドウの作成を行います。
第3引数のスタイルには次のようなものがあります。

WS_CAPTION  	タイトルバーを持つウィンドウを作成します。
WS_MAXIMIZEBOX 最大化ボタンを持つウィンドウを作成します。
WS_MINIMIZEBOX 最小化ボタンを持つウィンドウを作成します。
WS_SYSMENU タイトルバーの中にコントロールメニューを持つウィンドウを作成します。必ずWS_CAPTIONスタイルを付けて指定します。
WS_HSCROLL 水平スクロールバーを持つウィンドウを作成します。
WS_VSCROLL 垂直スクロールバーを持つウィンドウを作成します。


複数指定するには、 WS_MINIMIZEBOX | WS_SYSMENU などと、or演算子を使ってつなげます。

CreateWindow()の戻り値として、HWNDが返ってきます。
これはウィンドウハンドルで、HWNDの実体は4バイトの整数値です。
Win32APIでは、時折ハンドルを返し、Windows内部をいじることなく操作させることがあります。
ハンドルとは、車などのハンドル、操作するものという意味合いです。
ポインタと似たようなイメージです。


ShowWindow( hWnd , nCmdShow );


ウィンドウは、作成しただけでは表示されません。
実際に表示を行うためには、上記の関数を呼び出し、ウィンドウの表示状態を変更しなければなりません。
ウィンドウを最大化、最小化などの状態にするのも、このShowWindow()を使用します。


この一連の操作を行うことに晴れてウィンドウを表示できるようになりました。
後半のメッセージ処理については、次回に説明したいと思います。

ちなみに、これらのWin32APIの関数仕様については、マイクロソフト社の公開しているMSDNで確認することができます。
細かい仕様などについて、調べたい場合に利用することをお勧めします。

MSDNホーム
http://msdn.microsoft.com/ja-jp/default.aspx
タグ:ふわ猫

第0x00回 ゲームプログラミングへの誘い

プログラムに興味があり、少しゲームに興味がある方なら
一度はゲームプログラミングに興味を持ったことがあると思います。
テトリスやオセロなどや、テレビで遊ぶようなアクションやシューティングなど、
ゲームには、様々なジャンルがあり、そのどれもが魅力的です。

今回は、そのゲームを身近な環境であるWindowsを使って作成し、
解説していこうと思います。
ゲームプログラミングは、見た目では想像できないくらい
様々なロジックを使って実装されています。

Windowsに関する内部的なことを知りたくて、
その取っ掛かりとしてゲームプログラミングから入ってみたい、
そんな方に読んで頂ければ幸いです。


さて、ゲームをプログラミングする上で必要な要素がいくつかあります。
色々ありますが、一般的には次のようなものがあります。

・画像を表示する
・サウンドを再生する
・キー入力を判定する
・ネットワークで通信を行う

ネットワークに関しては必要のないゲームもありますが、
大抵のゲームはこれらの処理を行い、それを作り上げていきます。

ここでは、オセロを題材として作成しながら、
これらの要素について説明していきたいと思います。


まず、プログラムを作成する前準備として、
プログラムを記述するための統合環境が必要になります。

マイクロソフト社で、学習用の統合環境がフリーで
ダウンロードできるようになっていますので、
Windows向けC++の統合環境がない場合には、
以下のものを準備してください。

Visual Studio Express Editions
http://www.microsoft.com/japan/msdn/vstudio/Express/

準備ができましたら、さっそくプログラミングを始めていきましょう。
タグ:ふわ猫

2009年02月16日

ExcelでFTPクライアントを作ってみよう!

【ExcelでFTPクライアントを作ってみよう!】第一回

単にFTPクライアントを作るのでは面白くないので、パソコン内の各種情報を取得して、
その情報をサーバーへアップロードするような仕組みを作ってみたい思います。

一般的にVB(VBA)は入門編的な感じがしますが、Windows APIを駆使すれば
結構いろんなことができます。


今回第一回目は、まず自分のパソコンの情報をWindowsAPIを使って画面に
表示してみようと思います。

使うのは、ExcelでOKです。ExcelからもWindowsAPIは使えますし、ExcelVBAで結構な規模のシステムを
構築している会社だってあります。


それでは早速、パソコン内の情報を取得し画面に表示してみましょう。

1.自分の使っているパソコン名
2.ログオンしているユーザー名

1.パソコン名を表示
 使用するAPIは、GetComputerNameです。

 @以下の関数を宣言します。

  Public Declare Function GetComputerName Lib "kernel32" Alias
 "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

 AボタンをExcelに貼り付けてそのボタンに以下の処理を追記します。
 
    Dim Name As String
    Dim Leng As Long
    Dim ret As Long

    'バッファを確保
    Name = String(250, Chr(0))  ←文字列のバッファを確保します。API関数の処理結果が、このNameに返されます。
    Leng = Len(Name)       ←文字列の長さ

    ret = GetComputerName(Name, Leng) ←正常に終了した場合は、1が返ります。
 
    MsgBox "コンピュータ名は:" & Name & " です。"
   
それほど難しいことはありませんね。

それでは次に

2.ログオンしているユーザー名
 使用するAPIは、GetUserNameです。1.と同じような関数ですね。

 @以下の関数を宣言します。

 Public Declare Function GetUserName Lib "advapi32.dll" Alias
 "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


 AボタンをExcelに貼り付けてそのボタンに以下の処理と追記します。
 
    Dim Name As String
    Dim Leng As Long
    Dim ret As Long

    'バッファを確保
    Name = String(250, Chr(0))  ←文字列のバッファを確保します。API関数の処理結果が、このNameに返されます。
    Leng = Len(Name)       ←文字列の長さ

    ret = GetUserName(Name, Leng) ←正常に終了した場合は、1が返ります。
 
    MsgBox "コンピュータ名は:" & Name & " です。"
   
   
次回第二回目は、使用しているWindowsのOSのバージョン情報についてのAPIをご紹介します。

posted by ラクサス at 18:02| Comment(0) | TrackBack(0) | 【プログラミング】Excel編 | このブログの読者になる | 更新情報をチェックする

2009年02月10日

Oracle8i for Sun SPARC Solaris

ちょっと古いけど、Solaris上でのOracle8i データベース構築の備忘録です。
昔の構築、設定など必要な人にお役に立てれば....

==============================================
              Oracle8i for Sun SPARC Solaris リリース8.1.6 インストール
==============================================
●Oracle8i  for Sun SPARC Solaris リリース8.1.6
[インストール前の作業]
1.root ユーザーでの作業
 1-1.Oracle8i用のUNIXカーネル構成
  Oracle8i の共有グローバル領域(SGA )構造に割り当てるUNIX カーネル・プロセス間通信(IPC )パラメータを構成する。SGA に割り当てるだけの十分な共有メモリーがシステムにない場合は、データベースを起動できない。

  (1)以下のコマンドで、システムの現行の共有メモリー、セマフォ・セグメントお
   よびそれらの識別番号と所有者を調べる。

   以下のコマンドを実行する
   %ipcs

   または、
   /etc/systemファイルを参照

  (2)次に示すカーネル・パラメータに相当する値を設定する。
    共有メモリー・セグメントの最大サイズ(SHMMAX)
    共有メモリー・セグメントの最小サイズ(SHMMIN)
    システムの共有メモリー識別子の最大数(SHMMNI)
    ユーザー・プロセスが接続できる共有メモリー・セグメントの最大数(SHMSEG)
    システムのセマフォ識別子の最大数(SEMMNI)
    セットのセマフォの最大数(SEMMSL)
    システムのセマフォの最大数(SEMMNS)
    semop コールあたりの操作の最大数(SEMOPM)
    セマフォの最大値(SEMVMX)

    使用可能な共有メモリーの合計値は、次の計算式で決まる。
    SHMMAX ×SHMSEG

    (例)
     ORACLE_SID=A, PROCESSES=100
     ORACLE_SID=B, PROCESSES=100
     ORACLE_SID=C, PROCESSES=200

     SEMMNS の値は、次のように計算される。
     SEMMNS=((A=100)+(B=100))+((C=200)×2)+((インスタンス数=3)×10)=630
     ((C=200)×2):PROCESSES の最大値の2 倍

     [説明]
     Oracle データベースのPROCESSES パラメータを合計して、その値に
     PROCESSES の最大値の2 倍を加え、さらにデータベースごとに10 を加えた値
     を設定する。例えば、initsid.ora ファイルで、3 つのOracle インスタ
     ンスに対してPROCESSES パラメータを指定するシステムの場合、上記のように
     設定する。

      (参考値)最小の推奨値 ←これだとデータベース作成がGUIでできない。
     set shmsys:shminfo_shmmax=4294967295
     set shmsys:shminfo_shmmin=1
     set shmsys:shminfo_shmmni=100
     set shmsys:shminfo_shmseg=10
     set semsys:seminfo_semmni=100
     set semsys:seminfo_semmsl=100
     set semsys:seminfo_semmns=200
     set semsys:seminfo_semopm=100
     set semsys:seminfo_semvmx=32767

     (例:Sun Ultra 60 PDA/PCI--UltraSPARC-U450MHz--)
     set shmsys:shminfo_shmmax=4294967295
     set shmsys:shminfo_shmmin=1
     set shmsys:shminfo_shmmni=100
     set shmsys:shminfo_shmseg=10
     set semsys:seminfo_semmni=100
     set semsys:seminfo_semmsl=160
     set semsys:seminfo_semmns=320
     set semsys:seminfo_semopm=100
     set semsys:seminfo_semvmx=32767


 1-2.マウント・ポイントを作成する
   /export/home/oracle/u01
   /export/home/oracle/u02
   /export/home/oracle/u03
   /export/home/oracle/u04

   通常はパーティションを分けて、
    /u01
    /u02
    /u03
    /u04
   のようにする。
   Oracle8i には、2 つ以上のマウント・ポイントが必要で、1 つはソフトウェ
   ア用、1 つ以上はデータベース・ファイル用

   [例1]
   /export/home/oracle/u01/app/oracle (=ORACLE_BASE)
   /export/home/oracle/u02
   /export/home/oracle/u03
   /export/home/oracle/u04
   [例2]
   /ora8/app/oracle (=ORACLE_BASE)
   [例3]
   /oracle/u01/app/oracle (=ORACLE_BASE)
   [例4]
   /home/$USER (=ORACLE_BASE)
   [例5]
   /opt/app/oracle


 1-3.データベース管理者用のUNIX グループの作成
   インストール中に2 つのOracle ロール(SYSDBA およびSYSOPER)が作成される。
   データベース管理者は、対応するUNIX グループのメンバーになると、これらのロー
   ルが与えられる。

 1-4.Oracle Universal Installer Inventory 用のUNIX グループの作成
   admintool またはgroupadd ユーティリティを使用して、oinstall グループを作成
   します。oinstall グループは、Oracle Universal Installer のoraInventory ディ
   レクトリを所有する。インストールを行うOracle ユーザー・アカウントは、oin
   stall グループを主グループとする必要がある。

   --groupadd ユーティリティの使用例--
   # groupadd oinstall
   # groupadd dba
   # useradd oracle -g oinstall -G dba
   # passwd oracle


 1-5.Oracle ソフトウェア所有者のUNIX アカウントを作成する
   --------------------------------------------------------------------------
   ログイン名    任意です。このマニュアルではOracle アカウントとします。
   --------------------------------------------------------------------------
   プライマリGID     oinstall グループ
   セカンダリGID     dba    グループ ←admintoolから見ると文字列で表示
   ホーム・ディレクトリ 他のユーザーのホーム・ディレクトリとの間で一貫性のあ
              るホーム・ディレクトリを選択する。Oracle アカウント
              のホーム・ディレクトリは、ORACLE_HOME ディレクトリと
              同一である必要ない。
   ログイン・シェル   デフォルトは/usr/bin/sh 、/usr/bin/csh、/usr/bin/ksh
              のいずれか
   --------------------------------------------------------------------------

2.Oracle ユーザーで行う設定タスク

 1-1.ファイル作成の権限を設定する
  インストールされたファイルに対して、Oracle アカウント用に、umask で022 を設
  定することによって、group およびother には読込み権限および実行権限のみを与え、
  書込み権限を与えないようにする。

  umask コマンドが22 を返さない場合は、Oracle アカウントの.profile または
  .login ファイルにumask を設定して、次のコマンドを実行する。

  $ umask 022

 1-2.環境変数の設定
  表2-4 概要環境変数の概要
  環境変数    説明および設定例          必須か?
  DISPLAY     Oracle Universal Installerを    はい
          表示するシステムの名前、サー
          バー番号およびスクリーン番号
  PATH       シェルが実行ファイルを検索する   はい
          パス
  ORACLE_BASE   Oracle ソフトウェアおよび管     いいえ
          理ファイル構造の最上位にある
          ディレクトリ
  ORACLE_HOME   特定リリースのOracle ソフト     いいえ
          ウェアをインストールする
          ディレクトリ
  NLS_LANG     インストール時に使用する      いいえ
          キャラクタ・セット
  ORA_NLS33    各国語サポートのキャラクタ     いいえ
          ・セット・データの位置
  ORACLE_SID    インストール中に使用するOracle   いいえ
          サーバー・インスタンス識別子
  ORACLE_DOC   ドキュメントがインストールされ   いいえ
          ているディレクトリ

  [例--.cshrc---]
   # @(#)cshrc 1.11 89/11/29 SMI
   umask 022
   set path=(/bin /usr/bin /usr/ucb /etc .)
   if ( $?prompt ) then
    set history=32
   endif
   #########################################
   #             ORACLE8iR8.1.6 Enviroment             #
   #                 by M.D                  #
   #########################################

   #
   # 環境変数
   #
   setenv DISPLAY hogehost:0.0
   setenv ORACLE_BASE /export/home/oracle/u01/app/oracle
   setenv ORACLE_HOME $ORACLE_BASE/product/8.1.6
   setenv NLS_LANG Japanese_Japan.JA16EUC
   setenv ORA_NLS33 $ORACLE_HOME/ocommon/nls/admin/data
   setenv ORACLE_SID hoge
   setenv LD_LIBRARY_PATH $ORACLE_HOME/lib
   setenv TMPDIR /export/home/oracle/tmp

   #
   # シェル変数
   #
   set path=($ORACLE_HOME/bin /usr/ccs/bin /usr/openwin/bin $path)
   #set prompt = ""$SESSION_SVR":%"$cwd"%"
   set filec
   set history = 1024
   set histdup
   set histfile = ~/.history
   set savehist = 1024
   set autolist
   set nobeep

   stty stop undef
   stty start undef

   source ~/.aliases


 1-3.カレント・セッションの環境を更新する
  [Bourne またはKorn シェルの場合]
   $ . ./.profile
  [C シェルの場合]
   % source .login

[インストール]
  1.インストール前の作業後に、Solarisの再起動を行う。
  2.インストールするべきディレクトリなどを作成する必要なし
  3.インストール途中で、orainRoot.shをroot権限で実行する必要がある。
  4.「Directory for Database Files 」フィールドに、データベース・ファイル
   のマウント・ポイントのパスを入力する。例:/export/home/oracle/u01
  5.root.shをroot権限で実行する必要がある。
   /usr/local/bin/を指定。(因みに/var/opt/oracle/oratab 作成される。)
  6.あとはウィザードの沿ってインストール。


参考資料 OTN Web公開 Oracle 8i インストールマニュアル

タグ:明鏡止水
posted by ラクサス at 15:54| Comment(0) | TrackBack(0) | DB | このブログの読者になる | 更新情報をチェックする

2009年02月02日

ゲーム数学4

ゲームの基本は当たり判定なので
今回も当たり判定の話をしたいと思います。

球と球(バウンディングスフィア(以下BS))の当たり判定を使うと処理は軽くなりますが
判定する範囲が大雑把になるという弱点もあります。
そこでBSで当たり判定する方法のひとつを紹介します。

説明しやすいので人間の例で説明します。

まず間違った例です。
体の回りに大量の小さな球を配置し、すべての球と当たり判定を行う。
これは非常に処理が重くなるし、BSを使う最大の理由「処理が軽い」に反した行為です。
これでは意味がありません。


右手を限定して話を進めます。

1.まず手をまっすぐ上に挙げた手の先から地面までをすっぽり包む球と当たり判定を行います。

2.当たっているとすると右肘から右手先まで包む球と当たり判定を行います。

3.当たっているとすると右手を包む球と当たり判定を行います。



こうすることで当たっている可能性が高い物にだけ細かい当たり判定をする仕組みにします。
例の場合は極端に3回順を追って当たり判定しましたが、
普通のゲームの場合2回。場合によっては3回ほど順を追えばかなり正確に当たり判定できます。
これにより無駄の処理を省き軽く、しかも正確に当たり判定することが可能です。
タグ:六本木店長
posted by ラクサス at 11:55| Comment(0) | TrackBack(0) | 技術情報 | このブログの読者になる | 更新情報をチェックする

2009年01月30日

リポマップアプリの製品を発表しました

リポマップアプリとは、携帯アプリから写真、位置情報、コメントを簡単に投稿できる携帯アプリです。

従来の写真投稿では、位置情報の付加やメールに写真を添付するなど手間がかかりましたが、リポマップアプリを使うことで簡単に投稿できます。

image18811.jpg


製品の詳しい内容はこちら→http://www.raxus.co.jp/product_repomap.html


タグ:raxus
posted by ラクサス at 19:40| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2009年01月29日

VMware ESXiで仮想化しても、ハードディスクのリソースは減らない

仮想化でリソースを有効活用し、サーバー台数を削減することが出来ます。
しかし、仮想化も万能ではなく、リソースの有効活用が出来ない弱点もあります。

VMware ESXiは、サーバー用途に特化した仮想OSですが、一般のユーザーが使用するVMware Serverよりパフォーマンスを高めるため、ハードディスクは最初に確保した容量分の物理量を消費します。

VMware Serverは、たとえ100GBの容量を最初に確保しても、実際に使った容量しか物理量を消費しませんが、VMware ESXiは使っていない容量も消費するため、ストレージと組み合わせて使用することが必須条件になります。

ローカルディスクでは、数百GBしか確保できないため2〜3個程度しかOSを同時に稼動できませんが、ストレージであれば数TBの容量があるので、ディスク容量の制限にかかわらずOSを複数稼動できます。

ここで注意しなければならないのは、ディスク容量の見積もりを誤ると、たとえ豊富にあるストレージもすぐに容量を消費してしまう点です。

ディスクに不要な空き容量があるOSが多く存在すると、結局ストレージを大量に消費するのでサーバーが減っても、ストレージが増えることになります。
タグ:どなん
posted by ラクサス at 13:20| Comment(0) | TrackBack(0) | ブレードサーバー | このブログの読者になる | 更新情報をチェックする

2009年01月19日

PHPの文法〜その3〜

■(1)論理型 (boolean)
・論理型(boolean)とは真偽の値を表す型で、値はTRUE(真)かFALSE(偽)のどちらか。
・大文字・小文字を区別なし
・論理型への変換
 PHP内部では下記の場合、次の値がFALSEとして扱われる。
 それ以外はすべてTRUEとして扱われる。
 1.論理型のFALSE
 2.整数型の0
 3.浮動小数点型の0.0
 4.文字列型の""(空文字)
 5.文字列型の"0"(文字列としての0 ASCIIの48)
 6.空の要素を持つ配列
 7.空の要素を持つオブジェクト
 8.NULL
 9.値が代入されていない変数

■(2)整数型 (integer)
・-2,147,483,645 〜 2,147,483,645の範囲で、小数点や指標を含まない。
・整数は、10進数、16進数、8進数表記で指定可能。
・8進数表記を使用する場合、数の前に 0 を付ける
・16進数表記を使用するには、数の前に 0x を付ける

例:
<?php
$a = 3333; // 10進整数
$a = -333; // 負の数
$a = 0333; // 8進数
$a = 0x3A; // 16進数
?>

■(3)浮動小数点型 (float)
・10進数で14桁の精度の範囲で、小数点以下の数値を持った型。

例:
<?php
$a = 3.333;
$a = 1.3e3;
$a = 3E-13;
?>

■(4)文字列 (string)
・引用符をリテラルとして指定するには、バックスラッシュ (\) でエスケープする。
・文字列リテラルの指定方法
 1.シングルクォーテーション('文字列')
  ※括った文字列内に変数があっても、変数名自体を文字列として反映する。変数が認識されない
 2.ダブルクォーテーション("文字列")
  ※括った文字列内に変数があると、変数の内容を反映する。変数が認識される
 3.ヒアドキュメント構文
  ヒアドキュメントがダブルクォートで囲んだ文字列として扱われる。
 <?php
  $name = 'hoge hoge';
  $str = <<<EOD
  hello $name //変数が認識される。「hello hoge hoge」と表示される。
  EOD;
  print $str;
 ?>

 4.nowdoc 構文 (PHP 5.3.0 以降)
  Nowdoc はシングルクォートで囲んだ文字列として扱われる。
 <?php
  $name = 'fuga fuga';
  $str = <<<'EOD'
  hello $name //変数が認識されない。「hello $name」と表示される。
  EOD;
  print $str;
 ?>

※参考文献・URL一覧
PHP マニュアル<http://php.benscom.com/manual/ja/>
タグ:明鏡止水
posted by ラクサス at 17:36| Comment(0) | TrackBack(0) | 【プログラミング】PHP編 | このブログの読者になる | 更新情報をチェックする

2009年01月16日

ゲーム数学3

前回は静止時の球と球との当たり判定を記述しましたが
これではゲームに適応することはできません。

ゲームの球というのは常に動き回っているので
動く球と球との当たり判定が必要になってきます。


半径RAの球Aが(XA,YA,ZA)にあり1フレームごとに(xa,ya,za)動くとします。
半径RBの球Bが(XB,YB,ZB)にあり1フレームごとに(xb,yb,zb)動くとします。
この2つの球の当たり判定を行います。



まず考えなくてはならないのは前フレームに球A,Bはどこにあったかということです。
球Aが(XA-xa,YA-ya,ZA-za)に球Bが(XB-xb,YB-yb,ZB-zb)にあったことがわかります。
つまりこの2点でしか当たり判定していないので、
球Bが画面真ん中にあり、球Aが画面端から端まで1フレームで移動してしまった場合当たり判定されず
球Aが球Bをすり抜けてしまうバグが発生します。
ここで0<t<1 媒介変数tを使い、この間に存在したはずの当たり判定を行います。
小数点は使いたくないので10倍して行います。


for (int t = 0; t < 10; t++) {
  int XX = ((XA*10)-xa*t) - ((XB*10)-xb*t);
  int YY = ((YA*10)-ya*t) - ((YB*10)-yb*t);
  int ZZ = ((ZA*10)-za*t) - ((ZB*10)-zb*t);
  if (XX*XX + YY*YY + ZZ*ZZ <= (RA+RB)*(RA+RB)*100) {
    // 当たってるよ
  }
}



媒介変数tを回す回数は球の大きさや移動距離と判定する精度、処理の重さなどによって調整が必要です。
今回は整数型で行いましたが、浮動小数点型でも行うことは可能です。
タグ:六本木店長
posted by ラクサス at 16:14| Comment(0) | TrackBack(0) | 技術情報 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。