Closed pinterior closed 2 years ago
便乗で申し訳ないのですが、CUIとGUIでウィンドウサイズが違うという問題を思い出しました。 意図的であればかまわないのですが。
F-BASIC386でテスト。 赤ラインが最外周、緑ラインが1ドット内側です。 OSはWindows 10です。
おおなるほど。まったく気づきませんでした。OpenGLのglDrawPixelsはRaster Positionが1ピクセルでも画面外だと絵をまったく表示しないので、左下座標を(0,479)にしていたのが多分問題ですね。ステータスバーが無かったころはぎりぎり(0,480)にしてしまうと中で浮動小数点で持ってるはずなので画面外判定される心配があったのですが、今はステータスバーを出しているので、(0,480)にしても絶対画面内と判定されるので、この際ステータスバーが1ピクセルぐらい食われてもあまり気にならないので、そのようにして解決しようかな。
OpenGLはさっぱりわかっていないのですが、このようにglRasterPos2i
で画面外(?)を指さないようにすればよい感じでしょうか?
diff --git a/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp b/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
index 081e02f..2289aeb 100644
--- a/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
+++ b/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
@@ -1354,11 +1354,13 @@ void FsSimpleWindowConnection::RenderBeforeSwapBuffers(const TownsRender::Image
glOrtho(0.0f,float(winWid),float(winHei),0.0f,-1,1);
glPixelZoom((float)scaling/100.0f,(float)scaling/100.0f);
- glRasterPos2i(this->dx,(img.hei*scaling/100)+dy-1);
+ glRasterPos2i(0, 0);
+ glBitmap(0, 0, 0, 0, this->dx, -(int)(renderHei + dy), NULL);
glDrawPixels(img.wid,img.hei,GL_RGBA,GL_UNSIGNED_BYTE,img.rgba);
- glRasterPos2i(0,winHei-1);
+ glRasterPos2i(0, 0);
glPixelZoom(1,1);
+ glBitmap(0, 0, 0, 0, 0, -winHei, NULL);
glDrawPixels(STATUS_WID,STATUS_HEI,GL_RGBA,GL_UNSIGNED_BYTE,statusBitmap);
switch(lowerRightIcon)
いや、多分単純に glRasterPos2i(this->dx,(img.heiscaling/100)+dy-1); を glRasterPos2i(this->dx,(img.heiscaling/100)+dy); にするだけで直りそうな気がするので、そのように修正したソースをPUSHしたので試してみてください。多分ステータスバーと重なるのでTownsのスクリーンイメージはステータスバーの上に描くように順も入れ替えました。
現masterで直っていると思います。 上のパッチは、何かの拍子――例えばウィンドウを小さくしたとき――に画面外判定されることを懸念しての -1 であったのなら、-1 しない座標が画面外であってもレンダリングされるようにすればよいのではないかという意図でした。(現物あわせで書いていて、なぜyが逆方向なのかもよくわかっていないのですが)
なぜか掲示板の方に書けなくなってしまったんで、こっちに便乗すると、spriteを調べたところ、Galaxy ForceはSpriteがbusyになるタイミングでまだスプライトの移動などが終了していないようです。そのため、スプライトのレンダリングをbusyになるタイミングにすると早すぎて、まだスプライトの位置が設定し終わっていないため、いくつかのスプライトが表示されていなかったようです。これを、readyになるタイミングでレンダリングするように切り替えてやるとすべてのスプライトが表示されるようになりました。FREQを上げてやると、それだけ早くスプライトの更新が進むのでbusyに間に合っていたというもののようです。
しかし、busyになったタイミングで一気にレンダリングしてしまえばいいのか、と、思った理由があった気がしたような。。。。あ、Shadow of the Beastが途中でSPEN切ってしまうからreadyになるタイミングが(スケジュール上は)発生しない問題だったか。やっぱりSPEN切ったときにspriteがbusyだった場合もレンダリングするように修正するのがいいかな? この方法だと新しいフラグとかいらないんで良いかな。あるいは、レンダリングを開始した(ことにする)フラグを追加して、スケジュールタスクの方で、SPENまたはisRenderingのどっちかがtrueの場合はレンダリングするという書き換えでもいいかな。isRenderingはステートファイルに保存しなくても1フレームロスするだけだから多分問題無さそう。
この点はShadow of the Beasts対策があるので、こっちで直そうと思います。今日の晩はボウリングの試合があるので、明日中にはなんとかできると思います。
スプライトに関しては #38 でお願いします
with Tsugaru_CUI's default window size, top line is not visible. bottom line looks fine, but there is 1px gap under the status line.
default size
increased height a little
gap under status line