cge學習 總結

castle-engine compile pc編譯
castle-engine package pc打包html

castle-engine package --target=android 手機 android 打包方法android

castle-engine package --os=android --cpu=arm 手機 android 打包方法 推薦windows


-----------------------------------------------
window.open 只是打開 塗抹窗口。
application.run 是整個程序的持久運行。
二者一塊兒 才行。
固然有一個更簡單的方式就是 window.openandrun. 哈哈哈
Application.MainWindow.OpenAndRun;
=======================================================app

-------------------------------打包 apk 的基本配置 少一個都不行
<?xml version="1.0" encoding="utf-8"?>ide

<project name="my_fantastic_game"
standalone_source="my_fantastic_game_standalone.lpr"

game_units="GameInitialize"
qualified_name="io.castleengine.portable.game.skeleton"
>函數

</project>測試

================================打包 apk 的基本配置字體

 

 

--------------- 轉換 手按座標 到3d座標
WorldPosition: TVector3;動畫


SceneManager.PositionToWorldPlane(Event.Position, true, 0, WorldPosition) ui

============轉換 手按座標 到3d座標


------------------ 2d 控制座標的方法。 手動按鈕屏幕
if Event.IsMouseButton(mbLeft) then
begin
if y< Event.Position.y then y:=y+200 else y:=y-200;

if x< Event.Position.X then x:=x+200 else x:=x-200;
end;

===================== 2d 控制座標的方法。 手動按鈕屏幕


--------------------幾種 窗口的區別
Window: TCastleWindowBase;(不包含TCastleSceneManager實例,須要本身建立)
Window := TCastleWindowBase.Create(Application);

Window: TCastleWindow; (包含有內建的TCastleSceneManager實例)
Window := TCastleWindow.Create(Application);


TCastleWindowCustom = TCastleWindowBase deprecated 'use TCastleWindowBase';
這兩個寫法同樣。 TCastleWindowCustom 是歷史遺留問題。最好棄用
======================幾種 窗口的區別


--------------- 控件定位,以及計算動態尺寸 座標 定位
left bottom 若是窗體大小改變,那麼left bottom 也會改變。

可是 CalculatedWidth, CalculatedHeight, CalculatedRect, 的值是最初的那個值,一直不變

座標,定位: 可使用left ,bottom 或者 anchor

使用anchor 的好處是,當父親尺寸改變,兒子的定位依然保持anchor的設計,穩定性好

MyLabel.Anchor(vpBottom, 10 + MyButton.CalculatedHeight + 10);
=============== 控件定位,以及計算動態尺寸 座標 定位


-------------關於2d 控件的單元
單元 CastleUIControls,CastleControls
關於2d 控件的單元

==============關於2d 控件的單元


-----------關於顏色 的單元
CastleColors 單元 能夠這樣設置顏色 HexToColor('5f3939');

CastleColors 單元 能夠這樣設置顏色 red yellow 等;

CastleVectors 單元 能夠這樣設置顏色 Vector4(95/255, 57/255, 57/255, 1.0);
==========關於顏色 的單元

---------------delphi lazarus 區別

賦值 函數的時候前面要加@

==============delphi lazarus 區別

 

----------------TCastleLabel 在黑色背景上看不到, 其後面有其餘ui控件(不須要是父親),才能看到本身.

MyLabel := TCastleLabel.Create(Application);
===============TCastleLabel 在黑色背景上看不到, 其後面有其餘ui控件(不須要是父親),才能看到本身.

----------
控件存在,不存在。

將控件移出Window.Controls 列表。 則控件不存在。
或者設置控件的exists 屬性爲 false. 則控件不存在

===========


----------- 座標 關係
左下角是原點。
往右是x.
往上是y
往屏幕外面是z

============座標 關係


------------兒子 大於 父親 面積
兒子,的尺寸 比父親大的時候,兒子會顯示到父親外面。 可是父親外面的兒子部分,不會接收事件處理,不會接收手動輸入。
最好把,兒子放到父親內部。
==============兒子 大於 父親 面積


--------------圖像 兩種圖像類型 都能完成一樣的事情
Image: TDrawableImage;
Image := TDrawableImage.Create('castle-data:/my_image.png');
Image.Draw(X, Y);


Image2: TCastleImageControl;
Image2 := TCastleImageControl.Create(Application);
Image2.URL := ApplicationData('Female-Zombie-300px.png');
Image2.Anchor(hpMiddle);
Image2.Anchor(vpTop, -10);
InsideRect.InsertFront(Image);
==============圖像 兩種圖像類型 都能完成一樣的事情


--------------TCastleLabel 使用 html
LabelStats := TCastleLabel.Create(Application);
LabelStats.Color := Black;
LabelStats.Html := true;
{ anything, just to show off the HTML :) }
LabelStats.Caption := 'Statistics:' + NL +
'Life: <font color="#ff0000">12%</font>' + NL +
'Stamina: <font color="#ffff00">34%</font>' + NL +
'Mana: <font color="#0000ff">56%</font>';
LabelStats.Anchor(hpMiddle);
LabelStats.Anchor(vpBottom, 100);
InsideRect.InsertFront(LabelStats);


==============TCastleLabel 使用 html


----------------換行符 所在單元
CastleUtils
NL

============換行符 所在單元


------------ 遊戲控件等比例 縮放,適應 窗口的大小
控件會等比例縮放,座標會根據anchor 來定位。 固然也可使用left bottom (可是可能不美觀)

Window.Container.UIReferenceWidth := 1024;
Window.Container.UIReferenceHeight := 768;
Window.Container.UIScaling := usEncloseReferenceSize;
==============遊戲控件等比例 縮放,適應 窗口的大小


---------------------2遊戲控件等比例 縮放,適應 窗口的大小
在data 目錄下,新建一個CastleSettings.xml文件。哪容以下

<?xml version="1.0" encoding="utf-8"?>
<castle_settings>
<ui_scaling
mode="EncloseReferenceSize"
reference_width="1024"
reference_height="768"
/>
</castle_settings>


而後能夠這樣調用,來改變縮放。哈哈哈
Window.Container.LoadSettings('castle-data:/CastleSettings.xml');.


另外,還能夠在這個文件裏 設置 默認字體 等其餘設置

使用這個文件的好處是, 由於castle-editor.exe 會使用這些設置,
而且castle-editor.exe修改了一些參數後,還會自動保存設置到這個文件裏。
方便,好用,美美的
======================2遊戲控件等比例 縮放,適應 窗口的大小

----------加載動畫 序列圖變更畫
Explosion := TGLVideo2D.Create(ApplicationData('explosion_320x240_frameskip2/explosion_1@counter(4).png'), false);
==========加載動畫 序列圖變更畫

------------按鍵 截圖
if Event.IsKey(K_F5) then
Window.SaveScreen(FileNameAutoInc(ApplicationName + '_screen_%d.png'));

============按鍵 截圖

 


----------------------編譯出問題的可能緣由 切記切記切記
1.目錄,文件 中不能有空格,不然出問題。
2.文件名,目錄名,不能太長,目錄嵌套不能太深,不然出問題。
3.文件名,目錄名,不能有中文,不然出問題。


=====================編譯出問題的可能緣由 切記切記切記


---------------- 控件, 圖像,遮蓋問題的解決
1.非控件的圖像的遮蓋問題: 在render 事件中, 先畫的被遮蓋, 後畫的顯示在最前面。

2.ui控件的遮蓋問題: 例如 手柄控制
aa:=TCastleTouchControl.create (Application);
aa.Anchor(hpMiddle,300);
aa.Anchor(vpBottom, 100);
// mybutton.AutoSize:=false ;
aa.Width:=350;
aa.Height:=300 ;
window.Controls.InsertFront(aa) ;

而後在render 事件中,最後一個再塗抹一邊這個控件。aa.render. 完美解決

 

=================控件, 圖像,遮蓋問題的解決


------------給2d遊戲添加控制手柄
單元 castlecontrols

初始化下面的代碼
aa:=TCastleTouchControl.create (Application);
aa.Anchor(hpMiddle,300);
aa.Anchor(vpBottom, 100);
// mybutton.AutoSize:=false ;
aa.Width:=350;
aa.Height:=300 ;
window.Controls.InsertFront(aa) ;

而後在 render 事件中添加 aa.render 否則的話,手柄畫面會被覆蓋

============給2d遊戲添加控制手柄


----------- 消息框,信息框 unit CastleMessages 引擎消息框
MessageOk(Window, 'Crash!');

===========消息框,信息框 unit CastleMessages 引擎消息框

 

-------------------free pascal 消息框。 重要發現 free pascal 能夠應用到android中。 牛逼啊 暫時只能用於電腦 不能用於android
unit LConvEncoding, 暫時只能用於pc 不能用於android 由於卡單元了。是電腦,手機 不匹配的問題。

procedure TForm1.Button1Click(Sender: TObject);
var ad:widechar; s:LPCSTR; s2:string;
begin
s2:='s多少付' ;
// s:= pchar(CP936ToUTF8(s2));
s:=pchar( UTF8ToCP936(s2));
showmessage(s);
MessageBox(0,PChar(UTF8ToAnsi('正常顯示中文')),'1',MB_OK or MB_ICONEXCLAMATION);
MessageBox(0,s,'1',0);

end;

參考下面的文章 成功了
https://blog.csdn.net/poolord/article/details/77488704
在Lazarus中對字符串進行代碼頁轉換

2017年08月22日 22:29:26 池龍 閱讀數 885更多
分類專欄: Delphi / Lazarus
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/poolord/article/details/77488704
因爲Lazarus基於UTF-8,所以當讀寫Windows創建的純文本文件的時候,因爲其中的中文使用GBK(CP936)編碼,可能會出現錯誤。此時可以使用Lazarus自帶的代碼頁轉換單元LConvEncoding對編碼進行轉換。

如UTF8和GBK互轉

function CP936ToUTF8(const s: string): string; // Chinese
function UTF8ToCP936(const s: string; SetTargetCodePage: boolean = false): RawByteString; // Chinese, essentially the same as GB 2312 and a predecessor to GB 18030
1
2
如指定代碼頁之間互轉

function ConvertEncoding(const s, FromEncoding, ToEncoding: string
{$ifdef FPC_HAS_CPSTRING}; SetTargetCodePage: boolean = false{$endif}): string;
1
2
3
注:GB18030因爲包含部分四字節字符,實際其代碼頁CP54936是不能使用的,可是因爲GB18030向下兼容目前中文Windows系統使用的GBK,而GBK又向下兼容GB2312(CP20936),因此實際操做中按CP936處理便可。


===================free pascal 消息框。 重要發現 free pascal 能夠應用到android中。 牛逼啊


----------------
lazarus LcL 的單元 也就是有窗體的應用程序的單元在 C:\fpcupdeluxe\lazarus\lcl

lazarus 控制檯的單元 也就是simple program 的單元在 C:\fpcupdeluxe\fpcsrc C:\fpcupdeluxe\fpcsrc\packages\fv\src


CastleEngineManifest.xml 這個是castle game engine 的編譯選項 能夠添加單元路徑。
可是若是單元牽扯過多的化,可能fpc 使用lazarus的單元 有不適應的地方。

可是簡單的添加一個本身的單元是成功的。

因此能夠說。 castle game engine 可使用其餘第三方資源。 可是要測試看看, 但願這是對的。
這樣這個遊戲引擎就能幹不少的事情。 也多是我想多了

================


-----------------
cge 的時候 別再借用lazarus的單元了, 如今我就是胡搞,把編譯器搞失靈了。
安 省的玩。別玩火。他大爺的 從新安裝很過癮啊

==================

-----------------
fpcupdeluxe 文件夾,能夠總體複製。哈哈哈。 當出現問題的時候。把另外的複製過來就好。


===============

------------給 手柄單元添加了一個屬性。用於記錄偏移位置 .這樣能夠把手柄利用到2d上面
TCastleTouchControl = class(TCastleUserInterface)
strict private
FTouchMode: TCastleTouchCtlMode;
FLeverOffset: TVector2;
FDragging: Integer; //< finger index that started drag, -1 if none
FPosition: TCastleTouchPosition;
FScale: Single;
function TotalScale: Single;
procedure SetPosition(const Value: TCastleTouchPosition);
procedure SetScale(const Value: Single);
function MaxOffsetDist: Integer;
protected
procedure PreferredSize(var PreferredWidth, PreferredHeight: Single); override;
public
constructor Create(AOwner: TComponent); override;
procedure Render; override;
function Press(const Event: TInputPressRelease): boolean; override;
function Release(const Event: TInputPressRelease): boolean; override;
function Motion(const Event: TInputMotion): boolean; override;
procedure SetTouchMode(const Value: TCastleTouchCtlMode);
procedure GetSensorRotation(var X, Y, Z, Angle: Double);
procedure GetSensorTranslation(var X, Y, Z, Length: Double);
property pianyi: TVector2
read FLeverOffset write FLeverOffset ;
published
property TouchMode: TCastleTouchCtlMode
read FTouchMode write SetTouchMode default ctcmWalking;

{ Set position of touch control. Right now this simply sets
the anchor using @link(TCastleUserInterface.Anchor) and friends.
Tip: Use @link(TUIContainer.UIScaling) to have the anchors automatically
scale with screen size.

The size of the control is set to be constant physical size,
so it's not affected by @link(TUIContainer.UIScaling), only by
@link(TUIContainer.Dpi). }
property Position: TCastleTouchPosition
read FPosition write SetPosition default tpManual;

property Scale: Single read FScale write SetScale default 1;
end;

===========給 手柄單元添加了一個屬性。用於記錄偏移位置 .這樣能夠把手柄利用到2d上面

-------------- 縱屏 轉化爲橫屏的座標公式
(width -1 -y , x)
這是一個僞命題。 不須要處理屏幕旋轉。由於手機本身會轉動。

開發者只須要判斷 width height 的比較大小而已, 而後分兩種狀況 佈置控件就好了。
屏幕旋轉是自動的事情。哈哈哈
因此,軟件只須要處理 窄屏 寬屏 就好

============== 縱屏 轉化爲橫屏的座標公式

 

---------------
Event.IsMouseButton(mbLeft) 這個應該是手機上的手按同樣
只測試出了 左鍵=手機點擊 手機其餘按鍵沒有測試出對應的按鍵。暫時這樣吧
===============
-----------遊戲退出
halt 退出速度快。
application.terimate; 速度慢。等待時間長。

===========遊戲退出

-------------- 給lazarus 添加搜索目錄
單元搜索庫這樣添加:
1.project菜單 - project options - other unit files (-fu) 在這個地方添加搜索目錄
注意這個設置,只針對 這個工程。
若是要全部新建的工程都默認這個設置。那麼要勾選最下面的 set compiler options as default 對勾,而後按下ok 按鈕, 就成功了

 

C:\fpcupdeluxe\ccr\castle_game_engine\src\base\android
CastleAndroidNativeAppGlue 這個目錄下的這個單元有點意思
===========給lazarus 添加搜索目錄

 


-------------被360 誤殺了不少次了。 很慘 深入的教訓
注意添加信任目錄,不然360會殺害不少文件,而後掛掉
studio
lazarus
free pascal
castle game engine
還有其餘要用的目錄,都添加信任。
被360搞了不少次了
g:adt
=============被360 誤殺了不少次了。 很慘 深入的教訓


-------------
多點按鍵的解決方式 在press 裏面解決
container.touchescount 在pc裏 點擊鼠標顯示的是1。
此時container.Touches[0]存在。

可是在android裏。 一個指頭按屏幕,顯示的是0。 此時container.Touches[0]不存在,而且會崩潰。


=============

---------------- 兩個指頭點擊屏幕的測試結果 別看前面的,有不少錯誤
container.TouchesCount >=2 表明兩個指頭點擊了屏幕 或者大於兩個指頭

event.FingerIndex=0 指代的是第二個指頭的點擊。 這個很重要。否則容易出現混亂
測試後,搞清了這個問題。


自由的點擊 無干擾的執行,只能是在一個控件上, 按座標位置 來人爲製做操縱桿了。
如此才能夠,成功。暫時是在window上成功了。

明天測試給window蓋一個透明控件,而後在其上搞搞,而後再把座標位置搞準確

----結論2
onclick的句柄中 sender.container.touchescout 的值和 window.container.TouchesCount的值是同樣的。

控件中的點擊 touchescount fingerindex 的數值和 window press 不一樣座標的點擊是同樣的。 惟一的區別就是控件獨佔。 第二個點擊效果出不來。 緣由是sender 不能區分是否是本身的控件被點擊了。
另外,window 被點擊了, 他也不能區分,是不是控件被點擊了。 真坑啊


也就是說,第一個被點擊的控件,具備話語權, 而後在他的onpress句柄裏,從新寫代碼。 這個代碼要包括其餘控件的代碼,而後要用sender 進行區分。
再次測試的結果,sender 不能區分,sender 仍是認爲是一個控件,只能用座標位置區分。

 

這個作法 和用 window.press 的作法差很少。 看看哪一個更好利用用哪一個把。 重點就是處理手柄的移動。哎。 加油
再次測試的結果,sender 不能區分,sender 仍是認爲是一個控件,只能用座標位置區分。


最終結果,就是隻能在window.press 上搞。區分3個手指,就好了。人命了。這個破引擎。

或者覆蓋一個透明控件,在上面用座標區分3個手指,就好了。 放棄移動杆。 使用按鍵的按鈕
也就是說,要本身編碼上下左右方向鍵了。 真是坑爹到家了。
可是也要堅持。已經到這個地方了


====結論2

------------結論3
press 和move update 要區分開, 由於press 沒法區分按住不放的座標

新的思路,記錄touchcout=1
===========
------------------0以前的結論都是混亂的,矛盾的。從新總結新的結論.
1.手動記錄 第一次,第二次點擊的座標。 這個座標纔是準確的。
2.fingerindex=0 永遠是第一次的手指。
fingerindex=1 永遠是第二次的手指。
持續性,換手指的時候,fingerindex 值保持不變。 也就是當第二個手指不鬆開,再次按下第一個手指,那麼第一個手指fingerindex依然是0

3.兩個控件的時候。第一次持續按下的按鈕 他的onpress 事件會起做用。 後面的按鈕不起做用。 即便第二個按鈕持續按住,從新按第一個按鈕,事件依然在第一個按鈕上。
因此解決方法就是,在第一個按鈕的事件裏,寫下其餘按鈕的事件處理(touchescout=1 fingerindex=1 只寫這一個就行,其餘所有自洽的,不用管)

控件: press是按下,motion是移動,update是按下一直按下 要把這三個事件都搞一下

應該使用window.onupdate 事件。 而不該該使用application.onupdate;
由於要處理的是window裏面的事情。
onupdate 事件 和重繪是同樣 的。用於消息,參數等的調整。規劃等等。

window 上的持續按下鼠標,移動鼠標,暫時還不知道該怎麼弄。 或許應該放一個透明控件來稿

move的疊加,只能使用在控件上了,由於window沒有onmotion事件。因此不能給其事件添加其餘控件的move.

window只能疊加 press事件。 因此應該是給操做界面上鋪一層透明控件。而後製做一個本身的操做面板
更正加載透明控件無效。
可是發現window有onmotion 事件。完美解決問題。

window的onupdate 是持續按下按鈕的事件。 它還有另一層含義,就是他和塗抹事件是匹配的。意思就是說。先進行onupdate 而後就會重繪畫面,大概就是這個意思。
因此對遊戲的參數設置,等等 均可以放到這個地方來進行處理


==================0以前的結論都是混亂的,矛盾的。從新總結新的結論.


==================兩個指頭點擊屏幕的測試結果

 

------------
控件的left bottom 屬性默認爲0 表明其初始原本的位置(可能這個位置不爲0.可是left就是0) 這個位置就是這個控件的0座標,哎,Capture the current container (window) contents to an image (or straight to an image file, like png).

Note that only capturing from the double-buffered OpenGL windows (which the default for our TCastleWindow and TCastleControl) is reliable. Internally, these methods may need to redraw the screen to the back buffer, because that's the only guaranteed way to capture OpenGL drawing (you have to capture the back buffer, before swap).真坑爹

============

相關文章
相關標籤/搜索