თუ როგორ უნდა გააკეთოთ ბულეტები, ზიანს აყენებს ერთობას


პასუხი 1:

მე უბრალოდ დაინტერესებული ვარ აქ, რომ მოვიყვანო რამდენიმე მაგალითი სხვადასხვა ტიპის თამაშებისთვის. მეორემ უკვე აღნიშნა, რამდენად საინტერესოა ამ ტიპის პრობლემა.

"Bullet Hell" ჟანრისთვის, ვერტიკალური / ჰორიზონტალური მსროლელები, როგორიცაა გეომეტრია ომები ან Touhou თამაშები. თავად თამაში შეიქმნა იმისთვის, რომ ძალიან ბევრი ტყვია ეკრანზე ყოფილიყო და თამაში თვითონ გადის რეალურ დროში და ცდილობს შეინარჩუნოს 60 FPS. ამ ტიპის თამაშისთვის არ არის სასიამოვნო, რომ თითოეულ ტყვიას ჰქონდეს შეჯახების ლოგიკა. იმის გამო, რომ იქ ერთდროულად ასობით ტყვია იქნება და თუ თითოეული ტყვია თავად ამოწმებს, საკმარისი დრო არ არის რომ თავად CPU შეამოწმოს ყველა ტყვია. ამ საქმისთვის უკეთესია, რომ მოთავსდეს შეჯახების აღმოჩენის ლოგიკა თითოეულ მნიშვნელოვან ობიექტზე, რომელზეც გავლენას მოახდენს აღნიშნული შეჯახება, მაგალითად მოთამაშეს (ან მტერს). თუ მხოლოდ მოთამაშეს გადავამოწმებთ, მნიშვნელოვნად შევამცირებთ შეჯახების შემოწმების რაოდენობას. რომელი მეთოდიც აქ გამოვიყენეთ, კარგია, თუ დროის სირთულეს შევამცირებთ.

არსებობს სხვა თამაშები, რომლებსაც სჭირდება დახვეწილი შეჯახების შემოწმება. მაგალითად, Angry Birds. ეკრანის ყველა ობიექტს შეუძლია ურთიერთქმედება ერთმანეთთან. ჩიტებს შეუძლიათ მოხვდნენ ყუთში, ყუთი შეიძლება მოხვდნენ სხვა ყუთში, ან ბოძებში, ან აფეთქდნენ და ა.შ. ამ მაგალითში, თამაში არის ფიზიკის სიმულაციის ქვეჟანრი. იმიტომ, რომ ყველა ობიექტი უნდა გადავამოწმოთ და სხვა გზა არაა. შემდეგ ჩვენ უნდა მოვიფიქროთ შემოწმების არქიტექტურა ან მოდელები, რათა ყველა ობიექტი ეფექტურად დამუშავდეს. კონკრეტული ეფექტური ალგორითმი ცნობილი იყო AABB (Axis Aligned Bounding Box) სახელით. იმის გამო, რომ ეს სტანდარტული ალგორითმია (როგორიცაა FPS– ში რეიკასტირება), ამისათვის, ჩვეულებრივ, არსებობს ბიბლიოთეკები, რომ თავიდან იქნას აცილებული საჭე. მაგალითად Box2D ასეთი ბიბლიოთეკაა. ასევე არის შემთხვევები, როდესაც ალგორითმისთვის მოგიწია მონაცემთა კონკრეტული სტრუქტურების გამოყენება. Quadtree ობიექტი 2D სივრცითი მონაცემების სტრუქტურის ასეთი მაგალითია. ეს საშუალებას იძლევა ობიექტების უფრო სწრაფად ძებნა და ინდექსაცია შეჯახების შემოწმების დროს.

შემდეგ, დამატებით, ყველა თამაშს არ სჭირდებოდა რთული ლოგიკა. ფრჩხილის დასაყენებლად არ გვჭირდება ბაზუკას გამოყენება. მაგალითად, მაგალითად, ზოგიერთ საბრძოლო თამაშში იქნება ეს 2D ან 3D, პერსონაჟს შეუძლია ტყვიების სროლა. წარმოიდგინეთ, რიუ აკეთებს Hadouken- ს, იმ დროს მხოლოდ 3 ობიექტი არსებობს. მარტივი გადაფარვის შესაფუთი ყუთის შემოწმება საკმარისია ამგვარი სიტუაციისთვის.

ასევე არსებობს თამაშები, რომლებიც არ იყენებენ ფიზიკურ ჭურვებს, მაგრამ მაინც სჭირდებათ შეჯახების აღმომჩენი ძრავა. მაგალითად, Dota 2-ში ძალიან რთული იყო სრული ფიზიკური მოდელების შექმნა, სადაც ყველა ობიექტს შეეძლება ურთიერთქმედება რეალურ დროში მულტიპლეერის გარემოში. ამ შემთხვევაში ხშირად ჭურვებს არ სჭირდებათ რეალისტური და ფიზიკური კანონების დაცვა. სტანდარტული ისრები Dota 2-ში არ მიჰყვებიან სწორ ხაზს, მაგრამ მიჰყვებიან მიზანს. ეს გაანგარიშებებს ოდნავ "უფრო ადვილად" ამუშავებს, რადგან თავიდანვე გარანტირებული იყო მისი შეჯახება, რადგან ის მიჰყვება მიზანს. ასევე არსებობს მრავალი ”ჩამონგრეული” შემთხვევა, რათა ის ნაკლებად რეალისტური გახდეს, ისევე როგორც სტანდარტული ჭურვები არ ეჯახება, მრავალი Effect Effect სტეკი, რადგან ის მხოლოდ ამოწმებს საზღვრებს. ასე რომ, თუ რთული ლოგიკის გაკეთება შეუძლებელია, შეგიძლიათ შეცვალოთ თქვენი გეიმპლეი. სანამ მიზეზი და ქცევა თანმიმდევრულია, მოთამაშე კარგად გრძნობს მას. ეს შეიძლება თვისებადაც კი ჩაითვალოს.

დაბოლოს, რადგან ეს თამაშია, ჩვენ შეგვიძლია საკუთარი წესი შევადგინოთ. უფრო ხშირად გადამოწმებული ტყვიების გადამოწმება არ არის საჭირო ყველა პიქსელის, ნაწილაკის ან ტექსტურის მიხედვით. მაგალითისთვის მიიღეთ კლასიკური Mario Bros. როდესაც გადაამოწმეთ, რომ მარიო ეჯახება ობიექტებს, ისინი არ ამოწმებენ პიქსელების სრულყოფილებებს. ისინი უბრალოდ იყენებენ მარტივ მართკუთხედის საზღვრებს, მაგრამ ის ეკრანზე არ ჩანს. იგივე ითქმის FPS– ზე. რეალურ დროში ტყვიების ნამდვილი მოგზაურობა არ არის. აქ მხოლოდ სპეციალური ეფექტები და ანიმაციებია, მაგრამ ფაქტობრივი შეჯახების შემოწმება მოხდა raycast– ის გამოყენებით, რომელიც არ არის ფიზიკური ტყვიები. ავიღოთ ავტომატის სროლის მსგავსად, ჩვენ ერთდროულად არ გავუშვით ასობით ტყვია, მაგრამ ამის ნაცვლად გავაკეთეთ ერთი რეიკასტი, შემდეგ ეფექტს ვიყენებთ, თითქოს ეს ასობით ტყვიიდან იყოს. ეს ასევე ამცირებს შეჯახების შემოწმების რაოდენობას. ბომბიც იგივე მუშაობს, ის არ აშორებს რეალურ ფრაგმენტებს.

ძირითადად, ჩვენ ვამარტივებთ ყველაფერს, როდესაც შეგვიძლია და ვამცირებთ სირთულეს.


პასუხი 2:

მოკლე პასუხია: თამაშის კოდში, ვინ ამოწმებს დარტყმას, მნიშვნელობა არ აქვს, მაგრამ თუ სად ხდება ამ კოდის შემოწმება მთავარია.

გრძელი პასუხი:

ეს დამოკიდებულია იმაზე, თუ როგორ გადაწყვეტს თამაში ვინ აკეთებს შემოწმებას. მაგალითად, ზოგიერთ თამაშს აქვს სერვერს ეს შემოწმება, რასაც ჰქვია "დარტყმის აღმოჩენა", რასაც სხვები უკვე განიხილავენ ამ პასუხის თემაში (მაგ. სემ ლაზარუსის სხივური დისკუსია).

კლიენტის მხრიდან შესრულებული HD ნიშნავს "უსწრაფესი კავშირის მოგებას". დავუშვათ, რომ A და B მოთამაშეებმა ერთმანეთს დაარტყეს X დროში. პაკეტი, რომელიც აგზავნის ინფორმაციას "მე სხვა მოთამაშე მოვკალი", სერვერს სხვადასხვა სიჩქარით მიაღწევს. შემდეგ თამაშმა უნდა გადაწყვიტოს, თუ არა

  1. პირველ რიგში, ისინი საშუალებას მისცემენ ყველაზე სწრაფად პაკეტს.
  2. ისინი საშუალებას მისცემენ პერიოდს, რომლისთვისაც "არ აქვს მნიშვნელობა ვინ მიაღწევს პირველად".

ამრიგად, ორიდან ერთი შედეგი: ან ერთი მოთამაშე დაეცემა, ან ორივე მოთამაშე დაეცემა.

თუ ეს გაკეთდა სერვერის მხრიდან, ყველა მოთამაშე აგზავნის, სავარაუდოდ, ინფორმაციას "მე ამ მიმართულებით გავისროლე მიმართულებით". შემდეგ სერვერი იღებს ინფორმაციას და აკეთებს აგრეგატს "ყველაფერში, რაც ამ დროს მოხდა" და წყვეტს, შემდეგ კი უგზავნის მოთამაშეს დიდ ინფორმაციას "ახლა რა ვითარებაა". წარმოიდგინეთ, ეს შეიძლება წამში 10 ან 30 ან 60-ჯერ მოხდეს.

შედეგი აქ დამოკიდებულია თამაშზე, თქვენს სერვერთან კავშირის სიჩქარეზე და აპარატურაზე, რომელზეც მუშაობს თამაშის სერვერი, ამიტომ არ არსებობს გასაგები და მარტივი პასუხი. თუ თამაში საკმარისად არის ოპტიმიზირებული, მაშინ შესაძლებელია ნახოთ ორმაგი KO, თუ თამაში ამის საშუალებას მოგცემთ, მაგრამ ეს დამოკიდებულია თამაშზე.

უმოკლეს პასუხისკენ მივყავართ: ეს დამოკიდებულია იმაზე, თუ როგორ ხედავს თამაში ჰიტების აღმოჩენას.


პასუხი 3:

ეს დამოკიდებულია თამაშზე. ეს მოიხსენიება როგორც "დარტყმის აღმოჩენა" და მისი შესრულების ხერხმა შეიძლება დიდი გავლენა მოახდინოს თამაშზე.

ჰიტის აღმოჩენის ორი ტიპი არსებობს; კლიენტის მხარე და სერვერის მხარე. ამასთან დაკავშირებით, კლიენტის მხრიდან დარტყმის აღმოჩენა შეიძლება იყოს მსროლელის ან სამიზნის მიერ, თუმცა ვერ ვფიქრობ რაიმე მაგალითზე, როდესაც სამიზნე მხარის დარტყმის აღმოჩენა იქნება გამოყენებული (სავარაუდოდ იმიტომ, რომ ეს შეიძლება ბოროტად გამოიყენონ ჰაკერებმა და ასევე შექმნან შეყოვნების პრობლემები).

კლიენტის მხრიდან ჰიტის აღმოჩენა ყველაზე პოპულარულია თამაშებში. ამ სიტუაციაში, როდესაც იარაღს ისვრი, კომპიუტერი ითვლის ტყვიის ტრაექტორიას და განსაზღვრავს, მოხვდა თუ არა იგი მტერს. თუ ეს მოხდა, თქვენი თამაში აგზავნის ამ ინფორმაციას სერვერთან და ამბობს: ”მე ამ მტერს მივაყენე ზარალის დიდი ოდენობით”.

კლიენტის მხრიდან ჰიტების გამოვლენის უპირატესობა ის არის, რომ იგი ნაკლებ დატვირთვას უქმნის სერვერს. თუ სერვერზე 10 მოთამაშე გყავთ, ეს არის წამში ათასობით ტყვია. ამ გამოთვლების კლიენტის გვერდზე განთავსება ხელს უშლის სერვერის გადატვირთვას და ჩამორჩენას.

მინუსი ის არის, რომ სერვერსა და კლიენტს შორის არის შეყოვნება. შეიძლება თქვენს ბოლოს მტერი დაინახოთ და დახვრიტოთ, მაგრამ ლატენტურობის გამო ეს მტერი იქ ნამდვილად არ იყო. მტრის ბოლოს ისინი გადაღებულნი იქნებიან გადასაფარებლის მიღმა. ამის მოგვარების ორი გზა არსებობს; შუალედური კომპენსაცია თამაშის კოდში, ან სერვერის მხრიდან ჰიტის აღმოჩენა.

სერვერის მხრიდან ჰიტის გამოვლენა შეიძლება პრობლემატური იყოს მაღალი დაგვიანებით სიტუაციებში, რადგან შეიძლება ვინმეს ხედავდეთ და ისროლოთ, მაგრამ თქვენი ჰიტები არ დარეგისტრირდება, რადგან სერვერის იდეა იმის შესახებ, თუ სად არის მტერი, არ შედის თქვენს თამაშში შეყოვნების გამო. ეს შეიძლება ნიშნავს, რომ თქვენ ნამდვილად უნდა უხელმძღვანელოთ თქვენს კადრებს, რომ კომპენსაცია გაუწიოთ სერვერს.

თამაშების უმეტესობას აქვს ძალიან რთული ქსელური კოდი, ამ პრობლემების თავიდან ასაცილებლად. ზოგიერთი თამაში, როგორიცაა Battlefield 1, გადადის თუნდაც სხვადასხვა ტიპის ჰიტის ამოცნობაში, რაც დამოკიდებულია მოთამაშეს კავშირის სიჩქარეზე.


პასუხი 4:

ეს მართლაც კარგი კითხვაა! თქვენ მოახერხეთ გაუცნობიერებლად მოხვედრილიყავით თემაში, რომელიც არა მხოლოდ თამაშის დიზაინის, არამედ ზოგადად პროგრამირების ცენტრალურ ნაწილს წარმოადგენს. თქვენს კონკრეტულ კითხვაზე პასუხი არის ის, რომ ეს მთლიანად დამოკიდებულია იმაზე, თუ როგორ გადაწყვიტა დეველოპერმა თამაშის სტრუქტურა, მაგრამ ჩავუღრმავდეთ ამაში.

სათამაშო ძრავების უმეტესობაში ლოგიკური ნაკადი ისეა სტრუქტურირებული, რომ ტყვიის გასროლისას ხდება სხივის ჩამოსხმის შესრულება. სხივის ჩამოსხმა ნიშნავს, რომ ცეცხლის წერტილიდან ხაზი არის გაყვანილი და ხდება შემოწმება, თუ რაიმე მოდელი ეჯახება ამ ხაზს, ან სხივს. შეჯახების გამოვლენისას, სიგნალი ეგზავნება ნებისმიერ მოდელს, რომელსაც სხივი ეჯახება და მათ დაევალათ ლოგიკა, რომ გაუმკლავდეთ მათ ტყვიას. (მაგალითად, კედელმა შეიძლება არაფერი გააკეთოს, ხოლო მოთამაშემ ზიანი მიაყენოს).

სხვა თამაშებში ტყვიის რეალურ ფრენის გზა მოდელირებულია და ტყვიებზე გავლენას ახდენს სიმძიმე და აქვთ მგზავრობის დრო. ამის გასამკლავებლად, თავად ტყვია შეიძლება იყოს პასუხისმგებელი, თუ როგორ გადაადგილდება ის, შემდეგ კი ლოგიკა იმის შესახებ, თუ როგორ მოქმედებს ტყვია რამეზე და უფრო მკაცრად უნდა იყოს დაკავშირებული ტყვიასთან.

საბოლოო ჯამში, ეს არის კითხვა, რომელიც ხშირად გვხვდება ზოგადად პროგრამირების დროს. თქვენ დაუსვით კითხვა, რომელსაც მრავალი დეველოპერი საკუთარ თავს სვამს რეგულარულად: ”იმისათვის, რომ ლამაზად შევქმნათ სისტემა, რომლის მოდელირებაც მსურს, სად ეკუთვნის ლოგიკის თითოეული ნაწილი და ჩემი სისტემის რომელ ელემენტს უნდა შეუერთდეს იგი. ” ხშირად ეს არის რთული ხუროთმოძღვრული გადაწყვეტილება და არის მრავალი გამოწვევა, რაც პროგრამირებას ნაკლებად აქცევს მეცნიერებად, უფრო მეტად ხელოვნებად.


პასუხი 5:

დიდი ხანია რაც ვიდეო თამაშებისთვის არ დავწერე რაიმე კოდი, ასე რომ, შესაძლოა, ხელოვნების მდგომარეობა შეიცვალა (და ალბათ შეიცვალა), მაგრამ თამაშის რეალურ დროში თამაშის ძირითადი ამოცანა არ შეცვლილა: ის უნდა იყოს ისეთივე სწრაფი, როგორც შესაძლებელია

ამ მიზნის მისაღწევად, მე ტყვია მოვიფიქრე, როგორც სწორი ხაზი. საბრძოლო სიტუაციების უმეტესობისთვის ეს გონივრული მიახლოებაა. თუ შორეული სნაიპერული გასროლის მოდელირებას ცდილობდით, შეიძლება აგარიდებთ ძრავის და ვარდნაზე, მაგრამ ეს მინიმალური ფაქტორებია და ბევრად უფრო სწრაფი პროცესორების გარეშე (რაც დღეს გვაქვს) პრაქტიკული არ იყო, ყოველ შემთხვევაში, ჩემს შემთხვევაში დღეს.

ადამიანის სხეული რთული ფორმაა, თუმცა, ის ეტაპობრივად დავანგრიე. პირველ ეტაპზე მოთამაშეს მოდელირება გავუწიე ცილინდრად. ვერტიკალური ხაზი მოთამაშის პოზიციაზე, სიმაღლე და რადიუსი არის ყველა საჭირო ინფორმაცია. იქიდან მარტივი საკითხია მოთამაშის ცენტრიდან მანძილის მონახაზამდე, სადაც ტყვია მიდის. გეომეტრიის სტუდენტებს გაახსენდებათ, რომ მანძილი ყოველთვის იზომება სწორი კუთხით, რათა მიიღონ ყველაზე მცირე შესაძლო მანძილი. შემდეგ ეს მანძილი შედარებულია ფიგურის რადიუსთან. თუ მანძილი რადიუსზე მეტია, ტყვია აცდა მოთამაშეს და აღარ არის საჭირო რაიმე ზომების მიღება.

თუ მანძილი რადიუსზე ნაკლებია, თქვენ უნდა გადავიდეთ მე –2 ეტაპზე, რომელშიც სხეულის თითოეული ნაწილი წარმოდგენილია როგორც ცილინდრი (ან სფერო, თავის შემთხვევაში) თქვენ ვერ წარმოიდგენთ რომ ტყვია მოხვდა რაღაც სხეულზე; შეიძლება ის უვნებლად გაიარა ფეხებს შორის, მაგალითად. თქვენ შეამოწმებთ ტყვიის ხაზიდან ცილინდრის ხაზამდე მანძილს სხეულის თითოეული ნაწილისთვის და მიიღებთ დარტყმას, თუ ეს მანძილი ნაკლებია ცილინდრის რადიუსზე. (ან სფეროს რადიუსი, თავის შემთხვევაში)

თავდაპირველად ვამოწმებდი თავს, ვივარაუდებდი, რომ თავის დარტყმა საბედისწერო იქნებოდა და დამუშავება არ უნდა დავკარგო იმის გასარკვევად, იყო თუ არა იგივე ტყვია მკლავშიც, მაგალითად.

მე ვიცი, რომ ეს გარკვეულწილად გამარტივებულია: მაგალითად, მე განზრახ გამოვტოვე პროცესი, რომელიც ეხებოდა ჰიტის შემოწმებას მხოლოდ ბალონების სიგრძის მანძილზე, მხოლოდ იმიტომ, რომ მე ვცდილობდი სიწმინდეს. ამასთან, არის კიდევ ერთი საკითხი, რისი გაკეთებაც მსურდა, რადგან აღვნიშნე, რომ სიჩქარე ძირითადი მიზანი იყო.

ამ გამოთვლებში, ნაწილი, რომელიც დამუშავების ყველაზე მეტ დროს იღებს, არის კვადრატული ფესვის გაანგარიშება. კლასიკური 2D მანძილის ფორმულის სამგანზომილებიანი ანალოგი კვლავ მოითხოვს კვადრატულ ფესვს. იმისთვის, რომ ამ დროს გადავპარსულიყავი, მე ეს ბოლო ნაბიჯი არ გამიკეთებია და შევადარე დისტანციების კვადრატები, ვიდრე თვით მანძილები. იგივე შედეგები, უფრო სწრაფად.

ვაცნობიერებ, რომ სრულად არ ვუპასუხე თავდაპირველ კითხვას, მაგრამ თუ თქვენ დაწერეთ ობიექტი, რომ გააკეთოთ ეს გამოთვლები, და გადაეცით მას ტყვია და სამიზნე ობიექტი, შეგიძლიათ მიიღოთ იგივე შედეგი, ასეა თუ ისე.


პასუხი 6:

ძველად პერსონაჟს აქვს ან აგებულია ფაილზე, რომელსაც აქვს პერსონაჟის ყველა ატრიბუტი. უმეტესად დონეზე, მაგალითად, მთლიან ჯანმრთელობაზე, მაგრამ შეიძლება დაჭრილი იყოთ, ან გარკვეულ პროცენტამდე და მაინც ცოცხლად ჩაითვალოთ. ასე რომ ტყვია მოხვედრას ყოველთვის არ ნიშნავს რომ მკვდარი ხარ. რადგან თამაშის ავტორს უნდა დაადგინოს, ატყვია თუ არა მოთამაშეს ტყვია გულის არეში ან სხვა უბნებზე, განსაზღვრავს ზიანის ოდენობასა და ტიპს, ეს არ იქნება იგივე ყველა თამაშისთვის. ვხვდები, რომ ტყვია ან ნებისმიერი ობიექტი, ბომბი, ხელყუმბარა და ა.შ., ჯანმრთელობის სხვადასხვა დონეს იძლევა, იმისდა მიხედვით, თუ სად მოხვდება, ეს შეიძლება განსხვავდებოდეს. თამაშის ყველა ობიექტს აქვს მნიშვნელობა, მოძრაობს ან არ მოძრაობს. რამდენად ახლოს ხართ მასთან, თქვენი X, YZ სტატუსი თამაშში. ტყვიები X, Y, Z სტატუსით თითოეულ ჩარჩოზე გადის. ამ ყველაფრის მუდმივი ანალიზი ხდება. (Რეალური დრო). ახლა ხედავთ, თუ რატომ არ არის თამაშის დამზადება ისეთი მარტივი, როგორც ტექსტური დამამუშავებელი. თამაშის მტრები ან მოთამაშეები, იქნება ეს თქვენი კარგი ბიჭი ან ცუდი ბიჭი, მუდმივად იკვლევენ და აჩვენებენ ზოგიერთ თამაშში მათი ჯანმრთელობის დონეს. ზოგიერთ თამაშზე, თქვენი მკვდარი ან ცოცხალია, მაგალითად PacMan. სხვა თამაშებისთვის, თქვენი მასშტაბით 1-დან 10-მდე ან 1-დან 100-მდე და ა.შ. სხვა ობიექტები, თუმცა რეალურ ცხოვრებაში დიდი ხნით ადრე ვერ მოხერხდებოდა, როგორიცაა მანქანები, ნავები, ტანკები და ა.შ., იარაღიც კი, შეიძლება განადგურებულიყო ან დაჭრილიყო. მართლაც კარგ თამაშს შეიძლება ჰქონდეს იარაღი, რომელიც იკავებს, აცხელებს, ანელებს, ნაკლებად მძლავრ ლაზერს და ა.შ. გამოიყენებს და ბოროტად იყენებს. რაც უფრო რთულდება ობიექტი, მით უფრო მეტ თამაშს უნდა დაუთმოს კომპიუტერის ძალა თამაშს, ასე რომ თქვენ უნდა შეინარჩუნოთ ბალანსი.

ახლავე მახსოვს, მე არასდროს შემქმნია და არც დავწერე რაიმე თამაშის ან თამაშის პროგრამა. მე უბრალოდ ამოვიღე მაგალითები თამაშებიდან, როდესაც ვსწავლობდი თუ როგორ ააწყო ავტორი თამაშს.

მრავალი წლის წინ, ფრენის სიმულატორს, Chuck Yeager- ს, დაწერილ DOS- სთვის, თამაშის საქაღალდეში ჰქონდა კონფიგურაციის ფაილების სერია. თითოეულ მათგანში თითოეულ მათგანს ჰქონდა თითოეული თვითმფრინავის მახასიათებლები, უბრალო ტექსტის ფორმატში შენახული თამაშის საქაღალდეში. თქვენ მარტივად შეძლებთ მათი შეცვლას, hex რედაქტორით. ჩვენ გავაკეთეთ და შევძელით თამაში დაგვეგეგმა თვითმფრინავის ასაფრენად, და მაშინვე, როდესაც მან სიმაღლე მოიმატა, ის პირიქით გაფრინდებოდა. ახლა ამას ნამდვილი თვითმფრინავით ვერ გააკეთებ. მაგრამ სასიამოვნო და ძალიან რთული იყო დიდ მანძილებზე ფრენა, მაგრამ სასიამოვნო იყო! ვფიქრობ, გარკვეულ თამაშებს ასევე შეეძლებათ შეცვალოთ კონფიგურაციის ფაილები, რათა ხასიათი განადგურებული იყოს. ასე რომ, მტრები ვერ მოგკლავდნენ, რამდენიც არ უნდა დაგხვრიტეს. ეს უფრო მეტი სიამოვნება იყო, მაგრამ შემდეგ ავტორებმა მალევე მიხვდნენ ამ შეცდომას და დაშიფრეს ყველა ფაილი ისე, რომ ვერ იპოვნეთ რა მნიშვნელობებით უნდა შეცვალოთ საკუთარი თავი განადგურებული ან არაკვალიფიციური.


პასუხი 7:

სემ ლაზარუსმა ეს კარგად ახსნა (კარგად გაკეთდეს სემ!), თუმცა როგორ განხორციელდება ასეთი მექანიკოსი, დიდად არის დამოკიდებული თამაშზე.

სხივის დასკვნა არის ერთ – ერთი მთავარი მიდგომა, რომ მიიღოთ გამოსავალი ამისათვის. ეს განხორციელება გაკეთდა ბევრ ძველ თამაშში, რომლებსაც გაცილებით შეზღუდული შესაძლებლობები ჰქონდათ თამაშის დროს. ამის ზოგიერთი სხვა განმეორებაა "ჰიტ ბოქსების" ჩართვა, რომელიც კომპენსაციას უწევს ლაგდებას მრავალმხრივ თამაშებში და გაორმაგდა, როგორც შეჯახების ობიექტი (ქუდები დაეშვა იმ პირზე, ვინც ეს გაარკვია!). რაც დრო გავიდა, დეველოპერები სულ უფრო და უფრო საინტერესო გზებს იწყებენ ამის გადასაჭრელად.

მე დავინახე ჰიტის სკანირების მიდგომა, როდესაც ჰიტის აღმოჩენის შემდეგ მან გააკეთა გაანგარიშება ტყვიის ვარდნის დასადგენად. გასაკვირი იყო, რომ გაანგარიშება მარტივი იყო, 3D თამაშში ხელმისაწვდომი ზომებია X, Y და Z. ამ შემთხვევაში, როდესაც სკანირების შედეგად დაფიქსირდა დარტყმა, ის მიიღებს განსაზღვრულ ცვლადს "თანხის ვარდნა მანძილზე ზრდის" და გამოკლება Z განსაზღვრული ცვლადიდან.

ამ შემთხვევაში პროგრამისტებს შეუძლიათ გაითვალისწინონ შემდეგი ცვლადები გამოცდილების გასაუმჯობესებლად: ტყვია წარმოშობის ადგილმდებარეობა, ობიექტის ადგილმდებარეობა, მანძილი, სიმაღლე და დრო. როგორც წესი, ჰიტის სკანირების მიდგომაა მხოლოდ წერტილის რეგისტრაცია. ამასთან, ამ შემთხვევაში ტყვიის ვარდნა ხორციელდება დამატებითი ცვლადების აღრიცხვით. ზოგი შეიძლება აერთიანებს გარემოს ცვლადს, რომელიც განისაზღვრება დონის მიხედვით, რომელზეც მოთამაშე ასრულებს ქარის ან სხვა ცვლადების სიმულაციას.

თუმცა, როგორც ნებისმიერ პროგრამისტს შეუძლია გითხრათ, რაც უფრო რთულია სიმულაცია, მით უფრო მეტი რესურსია საჭირო გლუვი შედეგის უზრუნველსაყოფად. ერთი წუთით წარმოიდგინეთ, რომ ძალიან რთული გაანგარიშება გსურთ, მაგალითად ტყვიის დაცემა ძველ ონლაინ თამაშში. ამ სცენარში ტექნიკა უბრალოდ არ იყო მზად მხარი დაუჭიროს ასეთ ქმედებას. უფრო მეტი ყოველთვის არ არის კარგი და როდესაც საქმე ოპტიმიზაციას ეხება, მით უფრო მეტია, რაც უკეთესია, უკეთესი შესრულების შემთხვევაში.

როგორც წესი, სხივების სკანირების მიდგომით რეალურად ტყვია არ წარმოიქმნება, მისი "საბოლოო" შედეგი, როგორც წესი, მხოლოდ დასრულებულია მოხვედრილი პირისთვის წინასწარ განსაზღვრული ვარიანტის ჩართვით. ეს ჩვეულებრივ ჟღერადობის მსგავსია, დეკალის ან საინტერესოა აფეთქების მსგავსი. მიუხედავად იმისა, რომ თამაშში ტყვიის ნაკლებობა მნიშვნელოვნად ამცირებს თამაშისთვის საჭირო რესურსებს, ის სინამდვილეში არ არღვევს ჩაძირვას იმის გამო, თუ რამდენად სწრაფად მოძრაობენ ისინი (შეეცადეთ უყუროთ მოგზაურ ტყვიას, რომელიც ერთხელ გაისროლეს შიშველი თვალებით).

თამაშებში, სადაც კლავიშების კამერებია ჩართული, რომლებიც ტყვიებს აჩვენებს, მე ამის შესახებ 3 მიდგომაა, რაც მე ვიცი. პირველ რიგში, მხოლოდ ტყვიის ქვირითობა ხდება ამ თანმიმდევრობის დროს, იმ მომენტში, როდესაც კამერა იქცევა დარტყმისკენ მიმართული დარტყმისკენ "წერტილისკენ", ეს ჩვეულებრივ განისაზღვრება მედიანური დიაპაზონიდან მსროლელისგან სამიზნისკენ. ეს ქმნის ილუზიას, რომ ნასროლი ტყვია იყო ნასროლი, ამ შემთხვევაში ის ჯერ კიდევ ინარჩუნებს ილუზიას. მეორე ის არის, რომ რეალურად უნდა მოხდეს ტყვიის გამოყოფა ყოველ ჯერზე ხანძრის გაჩენის დაწყებისთანავე, დარწმუნებული ვარ, არ მჭირდება იმის მითითება, თუ რა რაოდენობის ნარჩენებია ეს რესურსებისთვის. მიუხედავად იმისა, რომ ზოგიერთ თამაშში ამას იყენებენ გაყიდვის წერტილად, მე ამას უარყოფითად ვთვლი, რადგან თამაშის მთლიანი ხარისხი უნდა დაეცეს და ამ ფუნქციას მხარს დაუჭერს. მესამე მიდგომა ამაზე სასაცილოა და მე ეს მხოლოდ ძველ თამაშებში და რამდენიმე ახალ თამაშში მინახავს. Sprites, sprites არის თამაშის განვითარების სამყაროს უცნაური მისტიკური არსებები. ამ შემთხვევაში სპრიტი (გამოსახულების ფაილი, რომელიც ყოველთვის არის პირდაპირ დამონტაჟებული პლეერის კამერისკენ), შეიძლება იყოს ანიმაციური სურათი, რომელიც ინიცირებისას ან ჩანს, რომ ანიმაციით იკუმშება მანძილზე ან შემცირდება გავლილი მანძილიდან გამომდინარე. Sprites შეიძლება ცოტათი იყოს მხიარული, რადგან მათ რეალურად შეუძლიათ ბევრი რესურსების მიღება, იმისდა მიხედვით, თუ რამდენად დეტალურია ისინი. Sprites ასევე იშვიათად გამოიყენება თანამედროვე თამაშებში მათი შეზღუდული გამოყენების გამო.


პასუხი 8:

მე უბრალოდ ავუხსნი როგორ მუშაობს. არსებობს 2 ტიპის ტყვია. ჰიტსკანი და ჭურვი. Hitscan ძირითადად არის მყისიერი ლაზერული ცეცხლსასროლი იარაღიდან იქ, სადაც მას ხვდება და ჭურვებს აქვს სამგანზომილებიანი ხედი.

HITSCAN (მულტიპლეერი)

როდესაც დააწკაპუნებთ იმ ფაქტზე, რომ დააწკაპუნეთ და სად იგზავნება სერვერზე, სერვერი აჭედავს გზას და განსაზღვრავს მტერს მოხვდით თუ ზედაპირზე, შემდეგ გადაუგზავნის გადაწყვეტილებულ შედეგს კლიენტს / კლიენტს (თქვენ მოთამაშეს), დაზიანებული მოთამაშე ან დარტყმული ზედაპირი. სწორედ ამიტომ, ზოგჯერ თქვენ ხედავთ, რომ სისხლი მოდის მტრისგან, მაგრამ მან 0 ზიანი მიაყენა და ამიტომ cs მოთამაშეებს 64-ის ნაცვლად 124 ნიშანი უნდათ, ხოლო წამში განახლების სიჩქარეა.

HITSCAN (Singleplayer)

ზუსტად იგივე რაც Multiplayer– ს, მაგრამ ვერასოდეს დადგება პრობლემა ტკიპის სიჩქარესთან (განახლების სიჩქარე).

ჭურვები ცოტათი უფრო რთულია, თქვენ უნდა გაგზავნოთ ინფორმაცია კლიენტსა და სერვერს შორის, რომ ჭურვი კვლავ დაფრინავს ჰაერში, მათ ჩვეულებრივ აქვთ ტყვია და ეს ყველაფერი ტრაექტორიად არის გათვლილი, რომელიც არის შემოწმებულია სერვერის მიერ Multiplayer- ში ან შესრულებულია კლიენტის მიერ Singleplayer- ში.

უკუცემა ჩვეულებრივ არის 0-დან და თანხას შორის და ეს არის კონუსის სიგანე, რომელშიც ტყვიები შეიძლება მოხვდეს. კონუსი იწყება მოთამაშის კამერიდან და მთავრდება ზედაპირზე ან ცის ყუთში. Csgo- ში, თითოეულ ტყვიას აქვს მითითებული ვექტორული მანძილი იქიდან, სადაც დაიწყეთ ცეცხლის გასაღების დაჭერა (თუ მაუსი არ გადაადგილდით, ამ შემთხვევაში უკუცემის ნიმუშის დაწყების პოზიცია იცვლება). ვექტორი არის "ლამაზი" მეთოდი, როგორც მანძილი, როგორც X და Y ღერძზე წერტილიდან.

იმედი მაქვს ყველაფერი გავწმინდე.


პასუხი 9:

ვიდეო თამაშში ტყვიის ფიზიკის განსახორციელებლად, როგორც წესი, არსებობს ორი მეთოდი:

ჰიტსკანი: ეს იყენებს იმას, რასაც ეწოდება იმის დადგენა, აპირებს თუ არა ის, რაც მოხვდება ჭურვით. ძირითადად, ძრავა დაინახავს, ​​თუ სად არის დამიზნებული იარაღი, მიაპყროს ხაზს იარაღიდან მაქსიმალური დიაპაზონის გარკვეულ წერტილამდე და დაინახოს, არის თუ არა რაიმე სხვა ობიექტი მხედველობაში. თუ კი, ის ობიექტს ეტყვის, რომ მას ტყვია მოხვდა. ამის კიდევ ერთი გვერდითი მოვლენაა ის, რომ თქვენ შეგიძლიათ შექმნათ იარაღი, რომელსაც შეუძლია შეაღწიოს მრავალჯერადი იარაღის ხაზში (მაგალითად, რკინიგზა Quake- ში), ყველა ობიექტის დაფიქსირებით, რომლებიც გადაკვეთენ სხივს.

ბევრი თამაში ამ მეთოდის გამოყენებას ირჩევს, რადგან მისი გამოთვლა სწრაფად ხდება და არ საჭიროებს ფიზიკის ახალი ობიექტის დაუყოვნებლივ გამოყენებას. გამოანგარიშება ხდება მყისიერად (თუ ტყვიის სიჩქარის ფაქტორს დავიწყებთ, მაშინ სამიზნე შესაძლოა იმ მომენტში გადაადგილდა), ასე რომ, იარაღის სროლის დროსა და სამიზნის დაზიანებას შორის მგზავრობის დრო არ არის. ჩამოსხმული სხივები სწორია და არ მიჰგავს რეალურ ტყვიებს. ამის კომპენსაციისთვის, პროგრამისტებს შეუძლიათ დაამატოთ შემთხვევითი გადახრები "რეალიზმის" მიმართულებით (უკუცემა, ქარი, სიმძიმე და ა.შ.)

ამის გამოყენების თამაშების მაგალითები: Call of Duty, Halo, Former Battlefield თამაშები და ა.შ.

საპროექტო ბალისტიკა:

ამ მეთოდით, სათამაშო ძრავა რეალურად ქმნის ახალ ქსელს სათამაშო სამყაროში საკუთარი მასით. ეს ტყვიას მისცემს საკუთარ სიჩქარეს და ზომას, რომელსაც ძრავა მიჰყვება. ტყვიის მოძრაობისას (პოტენციურად სრული გარე ბალისტიკური სიმულაციით), პროგრამისტს შეუძლია ლოგიკურად დაამატოს რა ხდება ობიექტის დარტყმის დროს. ეს ტყვიის ბევრად უფრო რეალისტური სიმულაციაა. მაგრამ პროგრამირება შეიძლება იყოს რთული და რეალური ინჟინრები საჭიროა თამაშის ძრავაში ასეთი ფიზიკის დასაშიფრად. ასევე მას შემდეგ, რაც ყველა ტყვია იქმნება და იმიტირებულია ძრავით, იგი იბეგრება სისტემაზე. ამიტომაც ისეთ თამაშებს, როგორიცაა Arma, მოითხოვს მაღალი დონის სისტემებს არა მხოლოდ მოთამაშის, არამედ AI მოკავშირეებისა და მტრების სიმულაციისთვის.

თამაშები, რომლებიც იყენებენ Projectile Ballistic- ს:

Arma, PuBG, Sniper Elite ფრენჩაიზია, Sniper Ghost Warrior. რაც შევაგროვე, Battlefield იყენებს სნაიპერებისთვის ჭურვის ბალისტიკური მიდგომის ძირითად სისტემას.


პასუხი 10:

პასუხების უმეტესობა ეხება გრაფიკას და როგორ მოქმედებს სხივების ჩამოსხმა მოდელირებაზე. მიუხედავად იმისა, რომ ეს ნამდვილად კარგი მიდგომაა, მე მსურს დავეყრდნო ძირითადი კლასის დიზაინსა და OOP– ის საფუძვლებს.

მსურს ჩემი კლასის სტრუქტურის მოდელირება ისე, რომ მტრის თითოეული ადამიანი / კედელი იყოს ობიექტი, რომელიც ითვალისწინებს რა ხდება ტყვიის დარტყმის დროს. ვიდრე ტყვია რეალურად მოხვდეს მტერს ტყვიის გადმოსახედიდან.

წარმოიდგინეთ შემდეგი კლასები: (აბსტრაქტულ დონეზე)

კლასის მიმართულება {ორმაგი x; ორმაგი y; ორმაგი z; }

კლასის პოზიცია {ორმაგი x; ორმაგი y; ორმაგი z;}

კლასის ტყვია {ორმაგი სიჩქარე; მიმართულება დ; პოზიცია p; bool ღონისძიება OnBullet (პოზიცია, მიმართულება); }

კლასის მტერი {პოზიცია p; int ჯანმრთელობა; ღონისძიება OnEnemyHit (პოზიცია); }

ახლა ფაქტობრივი ფუნქცია შეიცავს მტრებს, ტყვიებს, კედლებს და ა.შ., ის ასევე შეიცავს EventHandlers- ს, რომელიც შეამოწმებს არის თუ არა მტრების და ტყვიების / კედლებისა და ტყვიების გადაკვეთა.

კლასის სცენარი {მტერი e; ტყვია ბ; და ა.შ.…}

ასე რომ, თქვენს კითხვაზე პასუხის გასაცემად, არც მტერი ამოწმებს ტყვია დაარტყა მათ და არც ტყვია შეამოწმებს, მოხვდა თუ არა მტერი. სცენარი ამოწმებს გადაკვეთებს და ორივე მათგანს ან / და ტყვიას შეიძლება ჰქონდეს მოვლენები, რომლებიც განსაზღვრულია მათ კლასებში.

რა თქმა უნდა, სცენარის კლასს აქვს დინამიური სიები / მასივები, რომ იზრუნოს ობიექტების მრავალ შემთხვევაზე.


პასუხი 11:

გამოთვლითი თვალსაზრისით, მოთამაშეს უფრო ადვილი ექნება შეამოწმოს, მოხვდა თუ არა. ტყვიები უხვადაა და თითოეული ტყვიისთვის საგნების მინიჭება იქნება უამრავი გამოთვლითი რესურსი. ხშირად კონუსური ობიექტი იყენებდა გასროლას, რაც ზოგიერთ შემთხვევაში უფრო იაფია, ვიდრე ათეულობით ხაზის შექმნა ავტომატური ცეცხლსასროლი იარაღიდან ნასროლი ტყვიებით. ამასთან, ეს გამოიყენება იმ თამაშებში, სადაც ტყვიების გზა არ იყო გადატანილი ეკრანზე. მათთვის, ვინც ხაზს უსვამს, საჭირო იქნება ხაზის ობიექტის შექმნა.

ობიექტების გადაკვეთის გამოთვლა ძალიან სწრაფია და მას შემდეგ, რაც ტყვიები რეალურ დროში ითვლება (რადგან ის უფრო სწრაფად ითვლებოდა, ვიდრე მოთამაშის მოძრაობა), კომპიუტერულ ფასად უფრო იაფია, რომ არ მოხდეს ტყვიების დაუყოვნებლად და უფრო სწრაფად დააკონკრეტოთ ის მოთამაშე, რომელიც ამოწმებს გადაკვეთის კონუსს. . და თუ კონუსი სინამდვილეში კვეთს თავს და შეცვლის თავის გასროლის თვისებას.