I/O 2006年 4月号

サポート情報

最終更新2006年03月17日


■P129 Vista世代の3Dプログラミング入門(2006年03月17日)

 Direct3Dの初期化Form1.cs ソース・コードは以下の通りです。

 ※表示用ソースのため正しいソースは、下記よりダウンロードしてください。

 ■Direct3Dの初期化Form1.cs ソース・コード1
  
namespace Quiz  
{  
  public partial class Form1 : Form 
  { 
   /// <summary>
  /// 子フォーム
   /// </summary>
  private Canvas canvas;
  public Form1()
   {
   InitializeComponent();
   }
   private void Form1_Load(objectsender, EventArgs e)
  {
   canvas = new Canvas();
    canvas.MdiParent = this;
    canvas.Show();
    }
   }
  } 
}  
  

 ■Direct3Dの初期化Form1.cs ソース・コード2
  
namespace Quiz  
{  
  public partial class Form1 : Form 
  { 
   private Device device = null;  
   private PresentParameters presentParameters = null;  
    
   public Canvas()  
   {  
    InitializeComponent(); 
    // 常に再描画するためのおまじない 
    this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true); 
   }  
    
   // グラフィックス関連のリソースを初期化  
   public void InitializeGraphics(bool bWindowed)  
   {  
    presentParameters = new PresentParameters(); 
    // ... 途中省略(presentParametersに最適な値をセット) 
    
    CreateFlags flags = CreateFlags.SoftwareVertexProcessing; 
    // ... 途中省略(flagsに最適な値をセット) 
    
    // Direct3D デバイスの生成 
    this.device = new Device(0, DeviceType.Hardware, 
     this.Handle,
     flags, presentParameters);
   }  
    
   // グラフィックス関連リソースを解放  
   public void TerminateGraphics()  
   {  
    // Direct3D デバイスのリソース解放 
    if (this.device != null) 
    { 
     this.device.Dispose();
     this.device = null;
    } 
   }  
    
   protected override void OnPaint(PaintEventArgs e)  
   {  
    // 描画内容を白でクリアし、Zバッファもクリア。 
    this.device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 
     Color.White, 1.0f, 0);
    
    // 「BeginScene」と「EndScene」の間に描画内容を記述する 
    this.device.BeginScene(); 
    
    this.device.EndScene(); 
    
    // シーンの更新 
    try 
    { 
     this.device.Present();
    } 
    // デバイス消失のチェックとリセット 
    catch (DeviceLostException) 
    { 
     int result;
     // リセット可能かどうかをチェック
     if (!this.device.CheckCooperativeLevel(out result))
     {
      // リセット可能ならリセット
      if (result == (int)ResultCode.DeviceNotReset)
       this.device.Reset(presentParameters);
      // まだリセットできなければ、しばらくスリープ
      else if (result == (int)ResultCode.DeviceLost)
       System.Threading.Thread.Sleep(20);
      } 
     } 
   }   
     
  }    
}     
     

■P140 簡単!ゲーム・プログラミング練習帳(2006年03月17日)

 その1サンプル・スクリプトは以下の通りです。

 ※表示用スクリプトのため正しいスクリプトは、下記よりダウンロードしてください。

 ■15ゲームを作る その1 サンプル・スクリプト
      
<html>      
<body OnLoad="init()">      
      
<script language="JavaScript">      
      
  // マス状態保持配列     
  aCell = new Array(17);     
      
  function init() {     
      
   // 1,2,3…15となるよう配列に値を設定    
   for (i = 1;i <= 16;i++) {    
    aCell[i] = i;   
   }    
      
   // 盤面を表示    
   drawCell();    
      
  }     
      
  function cellClick(cell) {     
      
   // クリックされた枡の移動処理    
   move(cell);    
      
   // 盤面を再度表示    
   drawCell();    
      
  }     
      
  function drawCell() {     
      
   // 各升目の状態を表示    
   for (i = 1;i <= 16;i++) {    
    if (aCell[i] == 16) {   
     document.getElementById("cell" + String(i)).innerText = "";  
    } else {   
     document.getElementById("cell" + String(i)).innerText = String(aCell[i]);  
    }   
   }    
      
  }     
      
  function move(cell) {     
      
   // 上方向に移動    
   if (cell > 4 && aCell[cell - 4] == 16) {    
      
    aCell[cell - 4] = aCell[cell];   
    aCell[cell] = 16;   
      
   }    
      
   // 下方向に移動    
   if (cell < 13 && aCell[cell + 4] == 16) {    
      
    aCell[cell + 4] = aCell[cell];   
    aCell[cell] = 16;   
      
   }    
      
   // 左方向に移動    
   if (cell % 4 != 1 && aCell[cell - 1] == 16) {    
      
    aCell[cell - 1] = aCell[cell];   
    aCell[cell] = 16;   
      
   }    
      
   // 右方向に移動    
   if (cell % 4 != 4 && aCell[cell + 1] == 16) {    
      
    aCell[cell + 1] = aCell[cell];   
    aCell[cell] = 16;   
      
   }    
      
  }     
      
</script>      
      
<table border="1">      
  <tr>     
   <td id="cell1" onClick="cellClick(1)">1</td>    
   <td id="cell2" onClick="cellClick(2)">2</td>    
   <td id="cell3" onClick="cellClick(3)">3</td>    
   <td id="cell4" onClick="cellClick(4)">4</td>    
  </tr>     
  <tr>     
   <td id="cell5" onClick="cellClick(5)">5</td>    
   <td id="cell6" onClick="cellClick(6)">6</td>    
   <td id="cell7" onClick="cellClick(7)">7</td>    
   <td id="cell8" onClick="cellClick(8)">8</td>    
  </tr>     
  <tr>     
   <td id="cell9" onClick="cellClick(9)">9</td>    
   <td id="cell10" onClick="cellClick(10)">10</td>    
   <td id="cell11" onClick="cellClick(11)">11</td>    
   <td id="cell12" onClick="cellClick(12)">12</td>    
  </tr>     
  <tr>     
   <td id="cell13" onClick="cellClick(13)">13</td>    
   <td id="cell14" onClick="cellClick(14)">14</td>    
   <td id="cell15" onClick="cellClick(15)">15</td>    
   <td id="cell16" onClick="cellClick(16)"></td>    
  </tr>     
</table>      
      
</body>      
</html>      
      

 ダウンロードは、以下からご利用ください。

  io0604s.lzh


 ※ファイルは、「lzh形式」の圧縮ファイルになっています。ファイルをダウンロード後、解凍ソフトを使って解凍してからご使用ください。

 ※ファイル内容は、本文を参照してください。


(株)工学社 I/O編集部

[注意]

 ★ソース・コード、サンプル・スクリプトなどの運用については、運用者本人の判断で行なってください。プログラム上のいかなるバグ、操作上のいかなるミス、あるいはプログラムそのものによる金銭的損失についても免責とさせていただきます。


 なお、本書の内容に関するご質問/お問い合わせは、次の方法でI/O編集部宛にお願いします。

  1. 返信用の切手を同封した手紙
  2. 往復はがき
  3. FAX 03-5269-6031
  4. E-mail 問い合わせフォーム

※ご質問/お問い合わせの際、お客様の使用・動作環境などに添えて、具体的な症状をできるだけ詳しくお知らせください。
※FAXでのご質問/お問い合わせの場合は、必ずお客様のFAX番号を明記してください。