增加網址:
文章備註、標題(會記錄下來,但是暫時不會顯示):
[綜合]無題 無名 ID:uwmCuso. 2018/07/12(四) 12:33:32.851 No.12040044
評分:0, 年:0, 月:0, 週:0, 日:0, [+1 / -1] 最後更新:2018-07-15 21:31:19
附圖
想要弄一個簡單的橫向卷軸動作遊戲雛形
但是在物件常常卡住不知道該放怎麼設計

其中一個問題是人物跟地圖都需要time tick參數
去更新自身的資料(靠tick去算sprite sheet之類的事情)
自己想到三種 當然也有可能我自己的物件功能就設計錯了
島島有什麼意見麻煩都告訴我

1.timer放在core 要更新人物或地圖再把參數傳遞過去
如update(timer)去做傳遞這種感覺
但物件一多 每個都在那邊傳來傳去感覺超慢的?
如果還有其他可能要傳的參數 物件感覺會變得很龐大

2.每個物件放一個timer在裡面,想想也是超浪費資源的沒意義

3.把timer設定成 static class讓大家去call

前兩個方法覺得好像是很蠢的作法
第三個直接弄成全域變數不知道符不符合OOP 覺得怪怪的
無題 無名 ID:smQ83Ong 2018/07/12(四) 12:35:13.692 No.12040058
>>12040044
這年頭遊戲還在搞2D的
這代表你這輩子註定沒有出息了
無題 無名 ID:nEBk1KQI 2018/07/12(四) 12:37:30.635 No.12040071
>>12040058
這年頭還在不懂裝懂
這代表你這輩子註定是個智障
無題 無名 ID:jCfdkPXE 2018/07/12(四) 12:38:41.396 No.12040077
回覆: >>12040112
說自己只弄一個簡單的遊戲

但又要煩惱物件很多很龐大

依我遊戲業界多年經驗

我看你不是說謊就是智障
無題 無名 ID:uwmCuso. 2018/07/12(四) 12:39:36.010 No.12040083
回覆: >>12040100
>>12040058
做興趣的 不要酸我拉
真的想開發遊戲不會想不開自己造引擎
無題 無名 ID:Bkyr/mE6 2018/07/12(四) 12:42:26.191 No.12040093
>>12040058
用2D還3D分優劣? 直接暴露你根本就沒在玩遊戲還是只會玩糞手遊?
無題 無名 ID:Bkyr/mE6 2018/07/12(四) 12:43:53.617 No.12040100
回覆: >>12040219
>>12040083
是說來綜合問一開始就是個錯誤...
去遊戲設計版問
https://komica.dbfoxtw.me/gameprogramming/
無題 無名 ID:o7ZDb/Pw 2018/07/12(四) 12:43:58.743 No.12040101
>>12040058
現在的3D遊戲八成都是看電影而已
2D遊戲才有在玩遊戲的感覺
無題 無名 ID:Uxni86kg 2018/07/12(四) 12:44:36.176 No.12040104
3吧
不過我聽不太懂你說3違背oop的原因?
這跟global有甚麼關係
無題 無名 ID:uwmCuso. 2018/07/12(四) 12:46:19.663 No.12040112
回覆: >>12040137
>>12040077
我的意思是 OOP想期望他的靈活性
角色物件參數很多這是絕對的
但如果要一直配合Core去做處理 感覺依賴性太重?
而且現在這只是一個小小的Timer就有傳遞參數的問題
之後Draw還要加上rendererID windowID也要給

這樣我的update(...)裡面參數不就要一直去追加
如果哪天我少了一個參數 我每個物件的update不就要浪費一堆時間狂改?
這是我害怕的問題 雖然小專案不會有這種事情發生
但我想設計一個靈活的系統
無題 無名 ID:jrlS0mrQ 2018/07/12(四) 12:51:48.809 No.12040137
回覆: >>12040219
>>12040112
建議你去樓上(Bkyr/mE6)說的遊戲設計版問問吧
或是在晚上(深夜)再來問問看,這個時段大多是無聊找樂子的島民而已...
無題 無名 ID:9Wd1x9yE 2018/07/12(四) 12:53:38.505 No.12040149
>>12040058
紙片人動來動去還不是大賣
無題 無名 ID:sGYzniU6 2018/07/12(四) 12:58:26.959 No.12040171
直接用unity作就好啦
無題 無名 ID:uwmCuso. 2018/07/12(四) 13:04:55.130 No.12040219
回覆: >>12040280
>>12040100
>>12040137
好喔
畢竟綜合人多 想先問一次

>>12040104
想說盡量不要用到全域變數
這方面我觀念也不是很清楚就是

>>12040171
興趣使然 所以才想研究一下
無題 無名 ID:R1AZ.9oA 2018/07/12(四) 13:06:29.495 No.12040233
>>12040171
用unity做+1
無題 無名 ID:tr/8D0/Q 2018/07/12(四) 13:13:15.185 No.12040280
回覆: >>12040433
>>12040219
寫個兩三次就行了
不用囉嗦太多
透個過程你才會知道怎麼改良
久了你就會知道更簡單的寫法
無題 無名 ID:u34xMVIY 2018/07/12(四) 13:14:42.747 No.12040293
先說我沒有寫過這種遊戲,我也是外行。
我只是憑直覺提一下我覺得可能有問題的地方...

>去更新自身的資料(靠tick去算sprite sheet之類的事情)
1.為什麼不是用一個main loop去更新所有的東西?
看起來每一樣東西都需要更新,不是嗎?

2.你的OO設計上看不出來為什麼要區分成Player跟Npc?
看起來他們都一樣,那似乎目前沒有建立這個繼承體系的必要?
反之,既然你現在把它分成兩個class,
那你現在就應該要決定他們有什麼地方不同。

3.你應該先去搜尋範例來參考,
類似的問題一定有很多人想過怎麼解決,
應該會比你自己土法煉鋼的方法來得好。

更何況是這種非常典型的遊戲。
無題 無名 ID:tr/8D0/Q 2018/07/12(四) 13:16:56.018 No.12040304
第三個
但要注意多線程
無題 無名 ID:6./Dafhg 2018/07/12(四) 13:19:11.610 No.12040317
哼哼
你的OO 還未夠班阿...
無題 無名 ID:tr/8D0/Q 2018/07/12(四) 13:21:09.524 No.12040327
>>12040293
小的無所謂
大的有效率問題
很多場合是有顯示在畫面上才更新
無題 無名 ID:ooT1mbnY 2018/07/12(四) 13:24:22.889 No.12040346
回覆: >>12040433
有要做R18的嗎?
遊戲設計有個discord群歡迎加入討論
...一般向的也可以啦
無題 無名 ID:aqbA/G4w 2018/07/12(四) 13:34:20.942 No.12040418
回覆: >>12040485
>No.12040104
我想他是要說耦合性的問題

1或3

1不一定是傳timer 而是一個時間參數
Character的update不會像你所說那樣 要傳太多參數
只需時間(可以是時間差 可以是可參考的統一時間)
我自己的經驗時間是必要的
但render id、windowID則不是

3就已經和core脫勾了 和Character物件有關係的是timer
而不是core
timer 只要有一個 可以用static
而你的core也要參考同一個timer物件

你的每個Character物件要有自己的前次更新時間
每次update 的時候 更新那個時間

>No.12040293
是main loop(core)去更新(update)沒錯吧?
main loop 更新會呼叫每個物件的update
無題 無名 ID:uwmCuso. 2018/07/12(四) 13:37:04.962 No.12040433
回覆: >>12040931
>>12040280
你說的很對 先寫出來再說

>>12040293
因為想讓每個class的耦合度降低
自己覺得core不該管物件如何更新(只需要call 物件的update()就好)
而是讓物件自己決定如何處理
這方面也是物件導向難以理解的地方
還在找各種資料找最佳解
有什麼值得看的架構或網站也請島民多推薦

Player是還會有個control物件加進去
主要是因為想聚焦在tick問題上面
這部分不想讓島民混淆重點
所以才沒有特別說很詳細

也有查過一些外國人做的
教學影片通常也都沒有太嚴謹的設計
找了一個範例code 不過看一個要花滿多時間的
看完才發現他也很多都用static class去處理

>>12040346
謝大哥 有機會會去逛逛
無題 無名 ID:uwmCuso. 2018/07/12(四) 13:43:44.904 No.12040485
>>12040418
我目前的render跟window部分都決定要用static了
主要比較糾結timer要不要用static
說實在幾乎每個物件都需要timer
core也需要timer算幀數去更新畫面

我自己的想法跟你3補充的差不多 總之可能就先這樣寫
到時候發現到更好的寫法再說
無題 無名 ID:2VPXxJUc 2018/07/12(四) 13:54:05.364 No.12040571
回覆: >>12041082
我覺得2吧
一堆東西存取一個STATIC變數很容易錯
無題 無名 ID:bbyPk8Kk 2018/07/12(四) 14:43:01.244 No.12040851
回覆: >>12040871
在這邊問這個問題是什麼意思?
想讓人家知道你念過書很屌?
幹你媽的滾啦!
林北社會大學看到你們這種文青就想扁!
無題 無名 ID:w4NHm0ec 2018/07/12(四) 14:46:37.100 No.12040871
>>12040851
>>文青
嗯...這位(偽)8+9先生,您對「文青」的定義似乎怪怪der...(原來會做遊戲也算文青?!)
無題 無名 ID:u34xMVIY 2018/07/12(四) 14:56:53.284 No.12040931
回覆: >>12041082
>>12040433
>因為想讓每個class的耦合度降低
我覺得你的作法反而是增加耦合度ww

我直覺對這個問題的看法:
你的timer應該自己算時間,
只要時間一到,就觸發Main Loop叫大家更新,
或是觸發更新頻率比較特殊的物件獨立更新。
總之,其他物件不需要知道時間,只需要等著被呼叫update()。

可是你的作法,看起來比較像是:
不斷的傳遞tick給每一個物件,
等於是不停的通知所有的物件,目前的時間,
再讓每個物件根據時間,來決定現在要做什麼事。


要嘛,你參數的傳遞鍊,會很長。
同一個參數,一個物件遞給另一個物件,一直傳遞下去...
要嘛,就是參數放在Global,但這也不好。

再來就是,全部的物件,全都知道tick這個參數,
這就叫做程式的「耦合度很高」,而且超級高!
這對OO程式來說,也是非常非常不好的事情。
無題 無名 ID:uwmCuso. 2018/07/12(四) 15:24:09.696 No.12041082
>>12040571
自己後來覺得設定一堆計時器很憨
這樣如果遊戲要暫停我不就要回圈把全部都關掉


>>12040931
哀幹 所以我也盡量不想用全域變數
這就是我覺得3也有問題的地方


我是預計draw()不會去用到timer
使用core的timer算好時間去call
就是你講的那樣

但update()希望處理越快越多次越好
這處理好像也有分兩種
一種是用tick去算資料(人物.x += 1*tick)
一種是用固定幀數去跑(人物.x += 1(1幀))
我這邊是希望用tick去算
這樣就算程式lag也不會影響整個運算
我是這樣想拉

我猜早期遊戲都用frame去算
模擬器跑下去如過沒控制幀數
幀數太高造成遊戲整個加速在跑


好希望有一本超強的書把我的問題一口氣回答完@_@
畢竟想寫的東西應該也是被大家研究到爛的東西
無題 無名 ID:CBBXmaQE 2018/07/12(四) 15:25:11.516 No.12041094
>>12040871
他不是因為看不懂英文才崩潰的嗎
無題 無名 ID:9vFpXppo 2018/07/12(四) 15:26:43.042 No.12041097
>>12040044
OOP就是要濫用static啊
不然要幹嘛
無題 無名 ID:3ybILkfE 2018/07/12(四) 15:29:30.662 No.12041113
回覆: >>12041214
>>12040044
你用什麼語言寫啊?IDE是用什麼?
無題 無名 ID:dF.8t5Zc 2018/07/12(四) 15:30:00.247 No.12041115
有Unity這麼好用又免費的工具就不用自己重新造輪子了
除非你的興趣是開發遊戲引擎 不然用現成的套件
專注在物件上的互動就好
無題 無名 ID:X2qWkHTg 2018/07/12(四) 15:30:53.362 No.12041117
>>12040871
外來種滾回尸丁丁拉= =
無題 無名 ID:fzXj7TQ6 2018/07/12(四) 15:31:28.659 No.12041119
回覆: >>12041214
mainloop我都抄https://gafferongames.com/post/fix_your_timestep/
還有你不想用unity,也應該去看看它的流程是怎樣設計的
第三點感覺超慢浪費資源什麼的其實現在可以不用想
無題 無名 ID:aqbA/G4w 2018/07/12(四) 15:32:46.309 No.12041126
比如說有一個buffer 18秒結束
怎麼知道這個buffer 已建立了18秒?
每個buffer建立的時間是不同的
勢必要一個參數記錄每個buffer各自的時間

物件的update也是
每個character要記錄前次更新時間 才有依據
像每秒生命回復、每秒魔力回復
本次移動多少距離 也要看時間來決定位移量(每個character的速度也不相同)
也可以統一回血 但即時遊戲多半還是要各自計算的

如果你的Sprite格式不是使用每frame故定時間
而是像gif的delay time(比如這個frame要停多少秒)
也是需要時間 才能知道本次是否要換個frame
[aa]
所以要嘛你有一個static date物件
update()
{
// static date 物件GameSysDate
float dt = updatetime - GameSysDate.getMs();
dosomething(dt); //依據dt 動作(決定位移量...等)
updatetime = GameSysDate.getMs();
}

要嘛你傳參數
update(dt)
{
//依據dt 動作
dosomething(dt);
}
[/aa]
無題 無名 ID:3ybILkfE 2018/07/12(四) 15:33:44.910 No.12041134
回覆: >>12041214
>>12041115
我也覺得,現在寫遊戲,最好直接挑好用的就好,別再
死腦筋去用一些中低階的語言。

unity的功能強大到直接拿來做3D電影:
https://www.youtube.com/watch?v=BjLpL4iYPSc

把unity練熟一點,要自己做成品或上班,應該都不成問題。
無題 無名 ID:pdYHi3n2 2018/07/12(四) 15:40:09.659 No.12041167
while(buffer建立時間<18){
攻擊++
}
無題 無名 ID:C1E9Hn4M 2018/07/12(四) 15:41:53.670 No.12041183
>>12041115
Godot也適合做2D,開放原始碼還不收費用
無題 無名 ID:uwmCuso. 2018/07/12(四) 15:47:30.152 No.12041214
>>12041113
在windows寫當然用宇宙最強的VS
程式使用 C++搭配SDL2.0

>>12041115
>>12041134
算是我個人興趣 我知道用好用的軟體開發很快

>>12041119
謝大哥給資料讓我參考

>>12041126
感謝意見 基本上就是我方案1&3挑一個使用的概念
無題 無名 ID:aqbA/G4w 2018/07/12(四) 15:54:31.038 No.12041253
回覆: >>12041494
自己寫是一條長路
比如說碰撞就有得搞了
當然你也可以只用AABB(方塊碰撞)

所有物件loop 也行
但用四元樹效能還是比較好的

碰撞的話 有找到一個還可以的
有興趣也可以看一下
https://aotu.io/notes/2017/02/16/2d-collision-detection/index.html

另外AI也是一個大坑
無題 無名 ID:bbyPk8Kk 2018/07/12(四) 15:55:04.779 No.12041256
回覆: >>12041269
>>12041126
&(^&(^($%^$##$%#$$%@
講夠了沒?
念過書很屌是不是?
在講我就衝去你家
把你的畢業證書撕掉塞到你的屁眼裡再叫你媽舔!
無題 無名 ID:GJrJkmrk 2018/07/12(四) 15:58:41.126 No.12041269
>>12041256
喔~幹,大哥您還在啊www
插不上話、釣得到只有我這條魚,讓你7Pupu了嗎?!
無題 無名 ID:uwmCuso. 2018/07/12(四) 16:30:32.086 No.12041494
>>12041253
預先知道我下一個會面對的問題
高手高手 謝大哥