カレンダー

08 | 2009/09 | 10
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -

カテゴリー

プロフィール

drednote(Mr.Ty)

Author:drednote(Mr.Ty)
既にいい年しているにも関わらずエロゲをプレイしているヤバイおっさんです。きっと還暦になってもプレイしてそうな気がする。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

主にエロゲのプレイ日記。他レビューっぽい事とか色々
エロゲプレイ記
  当サイト内記事にはゲームのネタバレが含まれる場合があります。
  ネタバレをみたくない方は、当サイトの閲覧をご遠慮願いますようお願い致します。
  また、当サイトの記事自体は全年齢対象ですが、
  扱っている評価物は基本的に18歳未満プレイ禁止の物が殆どですのでご注意願います。
[------]
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--------(--) --:-- スポンサー広告 | 編集 |
[20090930]
一ヶ月位前になるが、上司から2DCGの回転描画ルーチンを作成するよう言われた。
無論私は色々とぐぐってみたのだが、どうも具体的な方法を書いているサイトが見あたらなかったのでこれから2回位にわけて私が実装した方法を書いてみたいと思う。
その前に、2DCGの回転描画の必要性についてなんだけど、実のところ私の場合では実際には要らないんじゃないか?と今でも思わずにはいられない。
というのも、単に矩形をディスプレイ上に回転表示するだけという事なのでPlgBltで事足りるのだ。
実際回転描画ルーチンを実装するまではPlgBltで描画していたのだし、PlgBltが上手く機能しないカードを今のところ見ていないので結構多くの場合にPlgBltで十分なんじゃなかろうか?と思っているのだがどうなんだろう?
まぁともあれ、社内用ツールではなく納品する為の物なのでどんな環境でも動く事が保証されてるわけじゃないPlgBltを嫌ったようで、2DCG回転ルーチンを書かされる羽目になったわけだ。
で、回転なんだけど、どうやって実装すれば良いかをまず考えてみて欲しい。
もし元画像の各ピクセルに単純に回転計算を施して描画すれば済むじゃん、と思った人はきっと実際に回転描画ルーチンを実装した事の無い人だろう。
じつのところ、それでは上手く行かないのだ。
回転計算すると当然座標に小数部が出てくるわけなんだけど、実際の画面には小数点のついたピクセル座標なんてものは存在しない。
従って、単純にピクセルに座標回転計算を施しただけでは微妙な計算誤差によりほぼ必ず微妙に穴が空いた画像になる。
ではどうすれば良いのか?
それをこれから書いていく。

さて、ピクセルに回転計算を施しただけでは上手く行かない事はわかったと思うが、では回転計算は要らないのか?
無論そんな事はない。
最初にやらなければいけないのはやっぱり回転計算なのだ。
回転する画像データの4頂点に対して移動/拡大/回転/フリップなどの計算をまず施しておく。
わかっていると思うが、これらの計算は順序に注意しなければならない。
座標移動を施してから回転させると、移動座標ごと回転する。
それが目的なら構わないが、回転と移動とは別々に管理したい場合は拡大縮小、回転を計算した後で移動を行わなければならない。
ちなみに拡大縮小と回転は同時に行う事が出来る。
単純に回転計算でsin/cosを行う際に拡大/縮小率をかけてやればよい。
void rotate(double degree) {
//	標準のsinとかはradianベースなのでradianに変換しなければならない
	double rad ;
	rad = degree * 0.017453292519943295769236907684886 ;
	para[0][0] = cos(rad) ;
	para[1][0] = sin(rad) ;
	para[0][1] = sin(rad) * - 1 ;
	para[1][1] = cos(rad) ;
}

//	XY夫々の拡大率を指定してマトリクスを初期化(2x2)
void scale(double xScale, double yScale) {
	para[0][0] = xScale ;
	para[0][1] = 0 ;
	para[1][0] = 0 ;
	para[1][1] = yScale ;
}

//	現在の回転マトリクスに拡縮要素をかけあわせる
void addScaleAttribute(double xScale, double yScale) {
	para[0][0] *= xScale ;
	para[0][1] *= yScale ;
	para[1][0] *= xScale ;
	para[1][1] *= yScale ;
}
こんな感じのmatrix計算ルーチンを作ってやれば簡単だろう。
多分ここまでは誰でも出来ると思うので、この辺りはサクサク行こう。
頂点を回転させた後は、その頂点が描く描画範囲を割り出す作業に入る事になる。
つまり頂点座標をラスタライズ処理するわけだ。
という辺りで次回にまわしたいと思うwww
スポンサーサイト
[20090928]
最近私が経験した失敗談を書いてみる。

InvalidateRectをして、画面が更新されないなぁと思って調べてみたらメッセージが沢山溜まっていてWM_PAINTがきてなかった、という事があった。
これの対処の為にUpdateWindowを差し入れてみたんだが、これが失敗の元だった。
UpdateWindowは、それを実行した段階でWM_PAINTを強制的に実行するわけなんだが、ちょっと待って欲しい。
元々WM_PAINTがきてないのはメッセージが沢山溜まっていた為なんだから、実際にはそっちをなんとかしないといけなかったんだけど、対処療法的にUpdateWindowを入れてしまったもんだから表面上は上手い事動いているように見えても裏はすごい事になってしまっていた。
もうひっきりなしにメッセージが発行されまくり、しかも(比較的重い処理である)WM_PAINTが頻繁に実行されてしまうもんだから実行速度は格段に落ちていき、しかもどこかでメッセージ処理が滞ってしまうと途端に処理されないメッセージの山が溜まっていく事になる。
実際、ちょっと重い処理を実行させてしまうとメッセージ処理のせいでしばらく止まってしまう状態になってしまった。
結局のところ、無駄なメッセージ発行をある程度減らし、その上でUpdateWindowを全部取っ払ってやると嘘のようにスムーズに動くようになった。
つまるところ、その場を対処する為にUpdateWindowをしたのがそもそもの失敗であり、何かに対して対処する場合はその場しのぎではなく根本の原因を取り除かないと結局上手く行かない、という話でした。
[20090901]
さて、久々にエロゲの感想でも書いてみよう。
前作、Honey Comingの感想を書いた関係上、これも書いとくべきかな~と思ったのがHoney Comingのファンディスク「@Honey Coming Royal Sweet」
まぁ苺ちゃんのシナリオがあるって事で購入に踏み切ったわけですが、正直微妙だった。
というのも、シナリオという物が無く、イベントが沢山並んでるだけで時系列的にどの順番で進めれば良いのか全く不明な為純粋に楽しむのが中々難しいというのが原因。
今作では日常イベント、恋愛授業イベント、Hイベントとそれぞれのカテゴリーで日常1、2とか恋愛授業1,2みたいな感じで並んでいるのだが、日常イベントの中では一応前から順番に並んでいるっぽいものの日常イベントと恋愛授業イベントの時系列での関係が不明となっている。
実際苺シナリオではどう考えても日常1と日常2の間に恋愛授業1が挟まると思うんだが、だからといってじゃあ日常2と3の間に恋愛授業2があるのかといえば(まぁそもそも苺には恋愛授業2は無いんだが)どうやらそういうわけでもなさそうっぽい。
そういった関係上、時系列で順番に日常イベントや恋愛授業イベントを楽しんでいくというのが難しく、その為前後ばらばらになったイベントを頭の中で再構成する羽目になりシナリオを純粋に楽しむのが難しくなっている。
実際問題として、1つのイベントの長さはセーブが特に不要な程度の長さになっており、またどのイベントでもいつでも好きに楽しめるというのは一々イベントの前でセーブを入れたりする必要が無いので良い事ではあるのだが、しかし時系列順で楽しむのが難しいというのはやはり頂けない。
こういった、イベントの頭出し機能をやりたいのであれば素直にセレンやサーカスのような、超高機能回想機能として実装すべきであって最初から回想モード状態でやらせるというのはやはり違うと思うのだ。
ちなみに肝心のシナリオそのものは悪くない。
まだ苺シナリオと朝陽シナリオしか完遂していないが、全体的にファンディスクとして必要十分と言える程度のシナリオは入っていると思う。
ただそれだけに、純粋に楽しむのに障害となる要因があるのがやはり惜しい。
HOME
copyright © 2005 drednote(Mr.Ty) all rights reserved.

Template By innerlife02

RSS1.0 ,
RSSフィード

応援バナー

検索フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。