[Demo Game]Hiệu ứng slow time (like the matrix)

Thảo luận trong 'Demo - Project' bắt đầu bởi >VoDich<, 30/6/06.

  1. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@:
    Slow time effect

    Demo: http://vngmc.byethost31.com/demo/slow_time_effect.zip

    - Mấy game hành động hay có chiêu này, kiểu chỉ môi trường xung quanh và đối thủ chậm lại còn ta vẫn nhanh như thường, hoặc tất cả cùng chậm, hoặc ta chậm rì còn môi trường xung quanh vẫn nhanh như gió ...
    - Chậm nhưng khung hình vẫn mượt chứ không phải như 1 số bạn chỉ đơn giản là giảm room_speed, lúc đó game cà giựt
    - Hiệu ứng này cũng sẽ làm game bạn mượt hơn dù fps có giảm 30->40% so với room_speed mặc định

    ok let's go ->

    ta tạo 1 object chính sẽ điều khiển tốc độ chung-> obj_time
    trong create event:

    Mã:
    global.frame_rate[0]=60 //frame rate này sẽ dành cho nhân vật ta điều khiển
    global.frame_rate[1]=60 //frame rate này dành cho môi trường xung quanh
    global.fp[0] = global.frame_rate[0]
    global.fp[1] = global.frame_rate[1]
    
    trong step event:

    Mã:
    for(i=0;i<2;i+=1){
     if fps=0 then global.fp[i]=global.frame_rate[i]
     else global.fp[i]=fps
    }
    
    ta liên tục gán cho global.fp (0 và 1) giá trị fps hiện tại, khi fps = 0 thì ta đổi gán cho global.fp giá trị frame_rate
    tại sao làm điều này, vì lát nữa ta cần dùng global.fp trong phép chia mà fps đôi khi cà giựt xuống còn óc vịt nên sẽ gặp lỗi phép chia cho 0

    - Xong roài, phần điều khiển chính chỉ đơn giản dzậy thoai, tiếp theo bạn tạo 2 script mới dùng cho speed và alarm. Nhân vật chính với môi trường cần 2 script riêng vì vậy là 4 script

    tạo 4 script mới đặt tên fpk_speed1, fpk_speed2, fpk_alarm1, fpk_alarm2 (tên gì tùy bạn)

    dành cho nhân vật ta control
    fpk_speed1
    Mã:
    return (argument0*global.frame_rate[0])/global.fp[0]
    
    fpk_alarm1
    Mã:
    return (argument0/global.frame_rate[0])*global.fp[0]
    

    dành cho môi trường xung quanh
    fpk_speed2
    Mã:
    return (argument0*global.frame_rate[1])/global.fp[1]
    
    fpk_alarm2
    Mã:
    return (argument0/global.frame_rate[1])*global.fp[1]
    
    ok và bây giờ là cách sử dụng. thí dụ nhân vật chính của các bạn có gravity là 0.4, khi bấm nút left thì đi sang trái với speed=5, ta liên tục gán cho 2 giá trị đó như sau (trong event step)

    Mã:
    gravity = fpk_speed1(0.4)
    if(keyboard_check(vk_left)){
     speed = fpk_speed1(5);
    }
    
    rất đơn giản phải không, bạn làm tương tự với các giá trị khác, chú ý chỉ riêng khi sử dụng alarm thì dùng script alarm

    Mã:
    alarm[0] = fpk_alarm(2)
    
    đó là trên nhân vật bạn điều khiển, còn với những đối tượng khác trong game bạn cũng làm y vậy nhưng dùng fpk_speed2 và fpk_alarm2

    bây giờ ok roài, bạn thử vào game giảm fps, game vẫn mượt -> tuyệt quá.
    sau khi giảm bạn chờ khoảng 1 -> 2 giây để game ổn định roài mới thấy hiệu quả, nếu mặc định room_speed 60 mà ko dùng cách này khi game quá nặng fps giảm còn 45 thì sẽ giật kinh, nhưng với cách này game bạn sẽ mượt hơn rất nhiều
    tuy nhiên cũng có chừng mực của nó thoai, giảm quá thì sẽ gây ra các "phản ứng phụ".

    - Tiếp theo tạo các hiệu ứng chậm thời gian: rất đơn giản
    + nếu mún nhân vật hành động chậm lại giảm global.frame_rate[0], mún nhanh thì tăng lên
    + nếu mún môi trường, đối thủ chậm lại giảm global.frame_rate[1], mún nhanh thì tăng lên

    vậy là xong, áp dụng làm game hành động bắn súng thì tuyệt đó.

    Y!M: zeroonea
    :@}
    -----------
    đã thêm {@: :@} ^^, post vội nên quên ^^
     
  2. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Cho bon chen tí:
    1)Nếu như mình chỉ đơn giản là làm chậm speed+gravity+friction của toàn bộ các object trong game thì có gì khác ko?

    2)Cái {@ @} biến đi đâu rồi?
     
  3. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@:
    câu 1: làm chậm là sao, giảm xuống à vậy thì tốc độ sẽ giảm nữa. xem demo vọc tí thì hiểu là cái này giúp ích được gì.
    ---sửa
    sau khi post xong mới hiểu bạn hỏi gì:
    nếu chỉ đơn giản làm chậm xuống mà ko dùng cách trên thì không nói làm gì, như vậy quá mắc công, với lại ko có cái chung, ví dụ speed 5 với friction 0.2 sẽ khác với speed 5+5 friction 0.2+0.2, rốt cuộc tốc độ game bạn sẽ lộn xộn
    với lại cái chính của tutorial trên là làm mượt game cho dù fps có giảm. thử đi roài thấy, game bình thường mặc định 30, nếu fps còn 50% (12-15) thì liệu có chơi được ko -> ko vì quá giật, trong demo fps max là 60 giảm còn 20 vẫn smooth ^^

    câu 2: đã sửa ^^!
    :@}
     
  4. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Uhm hiểu rồi,cách này hay đấy,nhưng phương trâm của mình là ko chấp những cái máy kém-> cứ lấy cái máy trung bình của mình ra mà làm mốc.
     
  5. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: máy tớ còm còm nên ko biết mức nào mà làm mốc, sau khi thi xong tớ sẽ làm 1 game bắn súng hô hô, được nữa đường chắc lại die T_T :@}
     
  6. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    mấy cái này ít xài quá vodich ơi
    nhiều cái cân thiết cho make game mà ông ko nghiên cứu . thí du : tạo game có khả năng lưu tên các người đã đăng kí trong game , khi thoát ra thì vào lại vẫn có tên người đó trong 1 bảng ( giống popcap ấy )
    - mà cho tui hoi? argument là cái quái gì thế , xài như thế nào có tác dụng gì .
    tui chẳng hiểu cái này là gì , rùi leng nữa ?????
     
  7. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Cái này làm smooth game hay thế còn gì.Cái lưu tên của bác dễ ko à:dùng file text,dùng file ini,dùng registry thích cách nào cũng đc.

    Argument là hơ...là tham số cho script thôi mà.
    vd:script double:
    return argument0*2;
    khi ta dùng a=double(2) thì a sẽ có kết quả là 4.

    leng???em search cả trang này chỉ có mình bác gõ chữ leng thôi :)).
     
  8. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: argument là đối số thêm dzo đó ví dụ hàm draw_sprite() có các đối số đưa vào là sprite id, frame number, x,y

    @konan: nếu bạn cần gì cứ hỏi mình sẽ cố giúp, bạn không hỏi nên mình cũng chẳng biết bạn thiếu những cái gì
    --// còn đây là hướng dẫn cơ bản về lưu tên người chơi của konan

    ta dùng registry

    đầu tiên GM đã set root mặc định là HKEY_CURRENT_USER nhưng bạn cũng nên set nó lần nữa.
    Mã:
    registry_set_root(0)//set root is HKEY_CURRENT_USER
    
    sau đó ghi thông tin người chơi, thường tất cả chương trình đều sẽ ghi thông tin của mình trong registry tại key software, mình cũng nên làm tương tự

    Mã:
    registry_write_string_ext('key name','ten value','value')
    key name sẽ là 1 chuỗi 'Software\ tên hãng \ tên game'
    cấu trúc là vậy, bạn mún đổi thì cứ đổi
    tên value thí dụ như là 'player name'
    
    ví dụ mình sẽ ghi 1 thông số tên người chơi vào key software với key NHT Games là tên hãng, city là tên game,
    Mã:
    registry_write_string_ext('Software\NHT Games\city','player','Nguyen Hung Tin')
    
    mún đọc, lấy tên người chơi ra thì dùng
    Mã:
    registry_read_string_ext('Software\NHT Games\city','player')
    
    -> ok
    :@}
     
  9. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    cho example đi vodich ơi , giống như popcap lưu tên ấy , lưu cả game nữa .
    dọc cái này khó hiểu quá .
    argument tui chưa bao giờ xài , ko biết nó có quan trọng ko nhỉ .
     
  10. Nguyen_Kain

    Nguyen_Kain Quậy hết mình Moderator

    Tham gia ngày:
    28/5/04
    Bài viết:
    1,299
    agurment là phép gán cho các thông số mặc định , rồi về sau khi gọi script ra thì chỉ cần khai các thông số theo cách tắt , không cần phải khai báo lại từ đầu .

    Nhân tiện tất cả chào mừng Nguyenkain trở lại đi , đi nghỉ mát 11 ngày chán quá !
     
  11. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: đây là sample về registry cho bạn konan
    lúc vào game, nó sẽ kiểm tra coi người chơi có đặt tên chưa bằng cách kiểm tra sự tồn tại của 1 value trong registry, nếu chưa có sẽ hiện bảng bảo người chơi gõ tên vào, nếu có rồi thì hiện bảng thông báo chào:

    downhere: (right click and save as..)

    http://vngmc.byethost31.com/demo/registry.zip

    :@}
     
  12. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    thank bác vodich nhiều lém'
    thế này mà còn chê ít ???
     
  13. shadow_judge

    shadow_judge The Warrior of Light Lão Làng GVN

    Tham gia ngày:
    1/5/06
    Bài viết:
    2,081
    Hahaha, tôi làm bullet time trong game Ánh hào quang đó thui, làm đơn giản cực chứ ko phức tạp thế này đâu. Nhưng nó đòi hỏi phải liên kết với nhiều thứ một tí, nhg ko phức tạp như thế này đâu!
     
  14. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    gớm ánh hào quang dở hơn top down của vodich nhiều . cái ánh hào quang lập trình cực dễ với 1 vài scipt đơn giản .
    top down của vodich mới tuyệt : điều khiển hoàn toàn bằng chuột , bắn 3 kiểu súng , rung giật rất đạt .
    ngay đến cả cái cây thay đổi bóng rất 3D giả cầy .
    thực bái phục vodich
    cái game ánh hào quang bị lỗi khi vào xe đỏ .với lại cách bắn quá dễ thấy rất nhiều trong các example , AI của máy hơi tệ , tui có cái example AI giống game ông mà nó chuyên nghiệp hơn , khi mất dấu của ông thì nó vẫn tiếp tục đi vòng vòng để kiếm ông tiếp chứ ko đứng yên . khi bắn nó ko đứng sát mà lùi lùi lại rất chuyên nghiệp .
    @ vodich :
    khi draw_sprite thì độ depth càng nhỏ thì sẽ nằm trên sprite draw từ object có depth cao hơn .
    vậy tui muốn draw 1 object 2 sprite có độ depth khác nhau hoặc draw 2 sprite 1 cái nằm trên , 1 cái nằm dưới ,sprite draw object khác thì make sao .
    cho example đi .
    - à vào xem cái RADA của tui make trong mini dự án : phi thuyền ko gian . hỏi ko kể công : ko biết bác vodich có biết làm RADA ko nhỉ , RADA giống update 6/6 mới up đóa
     
  15. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Trong draw event của object đó,cái nào xuống dưới thì draw trước,cái nào lên trên thì draw sau là xong.

    sprite draw object khác ???Cái này ko hiểu bạn hỏi gì.
     
  16. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: rada à, cũng ko có gì khó ^^
    konan có thể cho tôi biết phần giải thuật của rada trong game ko :@}
     
  17. Nguyen_Kain

    Nguyen_Kain Quậy hết mình Moderator

    Tham gia ngày:
    28/5/04
    Bài viết:
    1,299
    rada như thế nào , chứ còn bản đồ thì trong game HTQT có đó thôi :D

    nhưng nếu mà các bác muốn đề ý kiến làm ra đa thì đáng quan tâm đó , tui sẽ xem cách làm ra sao !
     
  18. >VoDich<

    >VoDich< Legend of Zelda

    Tham gia ngày:
    26/1/05
    Bài viết:
    919
    Nơi ở:
    Can Tho
    {@: cách làm dễ òm à, mún sample thì lên GMC search rada ra liền :@}
     
  19. XxKonanxX

    XxKonanxX Mario & Luigi

    Tham gia ngày:
    27/12/05
    Bài viết:
    883
    Nơi ở:
    _Rune Midgart_
    tức là từ 1 object tui muốn draw 2 sprite , 1 sprite nằm trên và 1 sprite nằm dưới 1 sprite khác ( tức là 2 sprite có depth khác nhau )
    hay nói trắng ra là có cách nào draw_set_depth ( GM ko có lệnh này nhưng mún làm tương tự .)
    ý vodich nói tui ăn cắp ấy hả . no no 100% by me .
    tui lên đó kiếm thấy mini map thui .
    mini map khác rada nhiều .
    sơ sơ thui nhá .
    - giải thuật : ta so sánh giữa 2 khoảng cách giữa 2 cặp điểm .
    cặp 1 : phi thuyền chủ . vs phi thuyền địch
    cặp 2 : tâm rada vs điểm chỉ báo phi thuyền địch .
    2 cặp này ko bằng nhau những sẽ có tỉ lệ , dựa vào cặp 1 tìm cặp 2 ( y như giải toán vậy ) cách làm thì đến đây mọi người có thể hỉu
    - ý tưởng này tui ngồi ngẫm nghĩ 1 hồi rùi make ra luôn .
    song còn 1 bug nhỏ là ko biết cách draw 2 sprite 2 depth nên phi thuyền địch bay lên cả rada .vi` tui draw điểm báo phi thuyền địch bằng object phi thuyền địch lun .
    please help me !!!
     
  20. bullno1

    bullno1 Mr & Ms Pac-Man

    Tham gia ngày:
    22/4/06
    Bài viết:
    221
    Thì đó,trong draw event,sprite nào bên dưới cho draw trước,sprite nào bên trên cho draw sau.Vậy thôi.
     

Chia sẻ trang này