[綜合]無題 無名 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 無題 無名 ID:nEBk1KQI 2018/07/12(四) 12:37:30.635 No.12040071
無題 無名 ID:jCfdkPXE 2018/07/12(四) 12:38:41.396 No.12040077 說自己只弄一個簡單的遊戲
但又要煩惱物件很多很龐大
依我遊戲業界多年經驗
我看你不是說謊就是智障
無題 無名 ID:uwmCuso. 2018/07/12(四) 12:39:36.010 No.12040083 無題 無名 ID:Bkyr/mE6 2018/07/12(四) 12:42:26.191 No.12040093
無題 無名 ID:Bkyr/mE6 2018/07/12(四) 12:43:53.617 No.12040100 >>12040083是說來綜合問一開始就是個錯誤...
去遊戲設計版問
https://komica.dbfoxtw.me/gameprogramming/
無題 無名 ID:o7ZDb/Pw 2018/07/12(四) 12:43:58.743 No.12040101
無題 無名 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 >>12040077我的意思是 OOP想期望他的靈活性
角色物件參數很多這是絕對的
但如果要一直配合Core去做處理 感覺依賴性太重?
而且現在這只是一個小小的Timer就有傳遞參數的問題
之後Draw還要加上rendererID windowID也要給
這樣我的update(...)裡面參數不就要一直去追加
如果哪天我少了一個參數 我每個物件的update不就要浪費一堆時間狂改?
這是我害怕的問題 雖然小專案不會有這種事情發生
但我想設計一個靈活的系統
無題 無名 ID:jrlS0mrQ 2018/07/12(四) 12:51:48.809 No.12040137 >>12040112建議你去樓上(Bkyr/mE6)說的遊戲設計版問問吧
或是在晚上(深夜)再來問問看,這個時段大多是無聊找樂子的島民而已...
無題 無名 ID:9Wd1x9yE 2018/07/12(四) 12:53:38.505 No.12040149
無題 無名 ID:sGYzniU6 2018/07/12(四) 12:58:26.959 No.12040171 直接用unity作就好啦
無題 無名 ID:uwmCuso. 2018/07/12(四) 13:04:55.130 No.12040219 無題 無名 ID:R1AZ.9oA 2018/07/12(四) 13:06:29.495 No.12040233
無題 無名 ID:tr/8D0/Q 2018/07/12(四) 13:13:15.185 No.12040280 >>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
無題 無名 ID:ooT1mbnY 2018/07/12(四) 13:24:22.889 No.12040346 有要做R18的嗎?
遊戲設計有個discord群歡迎加入討論
...一般向的也可以啦
無題 無名 ID:aqbA/G4w 2018/07/12(四) 13:34:20.942 No.12040418 >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 >>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 我覺得2吧
一堆東西存取一個STATIC變數很容易錯
無題 無名 ID:bbyPk8Kk 2018/07/12(四) 14:43:01.244 No.12040851 在這邊問這個問題是什麼意思?
想讓人家知道你念過書很屌?
幹你媽的滾啦!
林北社會大學看到你們這種文青就想扁!
無題 無名 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 >>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
無題 無名 ID:9vFpXppo 2018/07/12(四) 15:26:43.042 No.12041097
無題 無名 ID:3ybILkfE 2018/07/12(四) 15:29:30.662 No.12041113 無題 無名 ID:dF.8t5Zc 2018/07/12(四) 15:30:00.247 No.12041115 有Unity這麼好用又免費的工具就不用自己重新造輪子了
除非你的興趣是開發遊戲引擎 不然用現成的套件
專注在物件上的互動就好
無題 無名 ID:X2qWkHTg 2018/07/12(四) 15:30:53.362 No.12041117
無題 無名 ID:fzXj7TQ6 2018/07/12(四) 15:31:28.659 No.12041119 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 >>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
無題 無名 ID:uwmCuso. 2018/07/12(四) 15:47:30.152 No.12041214
無題 無名 ID:aqbA/G4w 2018/07/12(四) 15:54:31.038 No.12041253 自己寫是一條長路
比如說碰撞就有得搞了
當然你也可以只用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 >>12041126&(^&(^($%^$##$%#$$%@
講夠了沒?
念過書很屌是不是?
在講我就衝去你家
把你的畢業證書撕掉塞到你的屁眼裡再叫你媽舔!
無題 無名 ID:GJrJkmrk 2018/07/12(四) 15:58:41.126 No.12041269
無題 無名 ID:uwmCuso. 2018/07/12(四) 16:30:32.086 No.12041494