Đẳng Cấp Học Sinh

Đẳng Cấp Học Sinh

Đại Ân 2
 
Trang ChínhPortalCalendarTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập

Share | 
 

 Game Maker (phần 7): Tạo đồ họa 3D 'giả cầy'

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
zavasaki11
Thành Viên Cấp 2
Thành Viên Cấp 2


Tổng số bài gửi : 21
Join date : 03/05/2012
Age : 23
Đến từ : Đại Ân 2

Bài gửiTiêu đề: Game Maker (phần 7): Tạo đồ họa 3D 'giả cầy'    Mon May 21, 2012 4:48 pm

Một câu hỏi đầu tiên đặt ra là: Liệu có phải game 3D mới là “thời thượng” không? Thực ra không phải vậy. Tất cả các trò chơi đều có hình ảnh 2D trên màn hình máy tính của bạn. Có thể chúng trông như 3D nhưng kỳ thực chỉ là 2D.

Vậy khi nói một trò chơi nào đó là 3D thì người ta ám chỉ điều gì? Hơi khó tìm ra câu trả lời ngay lập tức vì đây là sự kết hợp giữa cách tạo game với hình ảnh mà người chơi nhìn thấy và cách họ điều khiển trò chơi.

Các game 3D hiện đại đều thiết kế thế giới ảo bằng hình ảnh ba chiều và nhờ đến hỗ trợ phần cứng 3D để thể hiện các hình ảnh đó. Với một điểm nhìn cho trước, phần cứng này sẽ tạo ra hình ảnh chuẩn xác cùng với những yếu tố khác như ánh sáng, bỏ đi bề mặt ẩn (nghĩa là các đối tượng nằm khuất sau các đối tượng khác sẽ không được nhìn thấy, do đó không cần vẽ ra), cùng những hiệu ứng không gian. Việc thiết kế thế giới 3 chiều với các đối tượng 3 chiều là một việc khó và tốn thời gian. Đồng thời, việc tạo ra kết cấu logic của game như hành vi của các đối tượng, kiểm tra mức đụng độ và chuyển động của camera… cũng không đơn giản và ngốn rất nhiều nhân lực, tiền bạc.

Một câu hỏi mà bạn sẽ đặt ra là công việc này có nằm ngoài tầm với của mình không. Câu trả lời là cả “có” và “không”. Game Maker không hỗ trợ làm game loại này nhưng tạo ra được các trò chơi “có vẻ giống” 3D. Thực ra, nhiều trò chơi “giả 3D” trước và sau 1995 không dùng đến kỹ thuật 3D thật sự, ví dụ những game nổi tiếng như Đế Chế và Command and Conquer. Các nhà thiết kế đã dùng nhiều kỹ xảo để tạo cho người chơi cảm giác như hòa mình vào không gian 3 chiều vậy.


Một cảnh trong Đế chế.


Các quy tắc căn bản:

Vật thể khuất sau vật thể khác là vô hình. Thường là bạn không thể nhìn xuyên qua các vật thể rắn. Vì vậy, bạn chỉ cần cho hiển thị những đối tượng có thể nhìn thấy thật sự. Quá trình này gọi là bỏ đi bề mặt ẩn. Phần cứng hỗ trợ đồ họa 3D cũng có cơ chế bỏ đi bề mặt ẩn một cách tự động, nhưng do Game Maker chỉ xử lý 2D, bạn sẽ dùng đến những kỹ thuật “giả cầy” là vẽ các sprite phản ứng với những đối tượng game (object) theo trật tự chính xác. Đối tượng nào nằm xa nhất thì vẽ trước rồi dẫn dần đến đối tượng gần nhất và các lớp nằm trước luôn “đè” lên một phần nào đó của các lớp nằm sau. Trong phần mềm này, bạn có thể làm được điều đó bằng cách thiết lập “độ dày” cho các instance khác nhau. Những instance có độ dày lớn hơn thì được vẽ trước và nằm về phía xa hơn.



Vật thể nằm xa hơn có vẻ như nhỏ hơn. Tận dụng đặc điểm thị giác này, bạn sẽ tạo ra cảm giác 3D thật hơn. Game Maker có thể làm được điều này bằng cách thay đổi kích cỡ của sprite, tùy thuộc vào khoảng cách. Hoặc bạn có thể tạo ra các sprite có kích thước khác nhau rồi dùng chức năng chỉnh tỷ lệ. Và tất nhiên, khi vật thể di chuyển càng gần đến người nhìn thì nó phải lớn hơn. Đây là một ấn tượng rất mạnh khi di chuyển trong thế giới 3D. Dù vậy, bạn vẫn nên cẩn thận. Nếu như tỷ lệ này bị tính sai thì sẽ tạo ra sự phản cảm rất lớn.



Vật thể nằm ở phía xa thì sẽ mờ nhạt hơn. Bạn có thể làm được điều này bằng cách sử dụng các sprite khác nhau cho một instance, tùy theo “độ dày” của chúng.

Vật thể nằm ở phía xa hơn có vẻ như di chuyển chậm hơn. Khi di chuyển sang phải, trái, bạn sẽ phải làm cho vật thể mất thời gian di chuyển nhiều hơn, còn khi vật thể chạy thẳng hướng về phía bạn thì có vẻ như nó không thay đổi vị trí trên màn hình. Nói chung, tốc độ di chuyển theo chiều dọc nên chậm hơn khi theo chiều ngang.

Vật thể luôn có bóng. Rất khó đổ bóng lên một vật thể khác nhưng bạn có thể đổ bóng dễ dàng lên sàn nhà. Và ngay cả khi không có bóng, bạn cũng nên để những điểm tối quanh chân vật thể để tạo ấn tượng nó đang đứng trên sàn nhà. Hãy đảm bảo những chiếc bóng này luôn luôn nối theo gót chân của vật thể. Ví dụ như ba hình dưới đây. Với hình đầu tiên, bạn không thể xác định được vị trí của đối tượng. Còn cái bóng của hình thứ 2 làm cho bạn biết chỗ mà nhân vật đang đứng. Hình thứ 3 nom giống như nhân vật đang nhảy lên.



Các đường thẳng song song có vẻ như sẽ gặp nhau ở một điểm nào đó, ví dụ như hai lề đường. Nói một cách chính xác thì tầm nhìn đã tạo ra một góc chiếu và theo một mức độ nào đấy, thị giác đã “bóp méo” vật thể. Nhưng điều này cần được áp dụng để tạo ra không khí 3D. Xét hai hình dưới đây:



Hình bên trái cho thấy mặt chiếu không có góc. Các dòng kẻ thẳng là những đường song song. Hình bên phải dùng đến sự chuyển đổi góc và do đó tạo ra cảm giác các đường thẳng sẽ gặp nhau tại một điểm nào đó. Hình chiếu góc là yếu tố rất quan trọng khi muốn làm game 3D nhưng không may là chẳng dễ gì khi làm được điều này bằng các sprite. Để hạn chế điều này, bạn có thể dùng đến các góc 45 độ. Nếu nhìn từ bên cạnh, các hình ảnh trông cũng chấp nhận được. Nói chung, hiệu quả của các đường song song không ấn tượng nhưng cũng làm cho người nhìn không bị rối mắt. Đây là điều cơ bản của những trò chơi giả 3D.



Nếu nhìn kỹ bạn sẽ thấy các đường thẳng vẫn song song (điều này là sai) nhưng tạo ra cảm giác 3D hơn. Tạo ra hình ảnh kiểu “giả cầy” mà vẫn ngon này là điều hoàn toàn có thể trong tầm tay của Game Maker và sau đây, chúng ta hãy bắt tay vào thực hiện.

Tạo hình thị sai

Như đã nói ở trên, vật thể nằm ở phía xa thì di chuyển chậm hơn và bạn có thể áp dụng điều này với các cảnh nền cuộn sang các bên và những đối tượng game dạng tĩnh.

Với Game Maker, bạn đã biết cách chèn hình nền (background) vào các room. Thường thì một room chỉ có một hình nền nhưng bạn có thể chèn nhiều hơn thế. Và để nhìn thấy các background, chúng cần phải “trong suốt” một phần nào đó hoặc phủ lên một phần của room. Bằng cách đặt tốc độ của nền thấp hơn với tốc độ thấp hơn, bạn sẽ tạo cho người chơi cảm giác chúng ở xa tít tắp. Hãy thử ví dụ sau đây với một chiếc xe đang chạy bên lề đường (đừng xét đến chất lượng đồ họa mà chỉ xét đến hiệu ứng của nó thôi).

Trước hết, ta sử dụng 2 nền. Nền đầu tiên tạo ra một vài đỉnh núi phía xa xa.



Nó sẽ được đặt lên phần trên của room và chạy sang trái với tốc độ chậm (1). Các đỉnh núi được “lát” theo chiều ngang chứ không theo chiều dọc. Còn nền thứ hai thể hiện một con đường rất nhỏ được đặt ở tận cùng của room và di chuyển nhanh hơn (4) và cũng chạy theo phương nằm ngang. Bây giờ chúng ta sẽ đặt một chiếc xe lên đường nhưng nó không nhất thiết phải di chuyển vì con đường đã di chuyển nên sẽ tạo ra ảo giác là chiếc xe này đang chạy. Vì con đường chuyển động nhanh hơn rặng núi nên bạn sẽ có cảm giác rặng núi này đang ở phía xa xa.

Để tạo thêm chiều sâu vào bức tranh này, chúng ta có thể đặt một vài cái cây với một số kích thước khác nhau. Với mỗi cái cây, chúng ta tạo ra một object. Hãy đảm bảo là cái cây nhỏ nằm phía sau cây trung bình và cây này phải nằm sau cây lớn. Cây lớn được đặt sát mép đường và có tốc độ như con đường này (4). Cây trung bình đặt xa hơn và có tốc độ là 3. Cuối cùng, cái cây nhỏ có tốc độ là 2. Hãy đặt hai cái cây cùng loại ở những vị trí thích hợp để làm sao khi chúng biến mất ở phía bên trái thì chúng sẽ xuất hiện lại ở phía tay phải (cùng với một chút ngẫu nhiên để tạo cảm giác đa dạng hơn). Kết quả đạt được như sau:



Bạn có thể tìm thấy phần demo này trong file parallax.gm6. Tất nhiên đây chưa phải là một trò chơi vì chúng ta chưa cho người chơi rồ ga để phóng đi hay thêm các chướng ngại vật trên đường…

Tạo hình thị sai là một phương pháp rất hữu dụng, ví dụ như game nền platform (trong đó nền game được cuộn sang trái, phải hoặc lên xuống theo đường đi của nhân vật). Trong trường hợp trên, bạn nên đặt tốc độ của các nền chuyển động giống như tốc độ của nhân vật mà người chơi điều khiển.

Tạo hình chiếu song song

Mặc dù các game ba chiều thực sự phải dùng đến các phép chiếu góc, trước hết chúng ta hãy bàn đến các hình chiếu song song. Trong một hình chiếu loại này, kích cỡ của đối tượng game vẫn không đổi và không phụ thuộc vào khoảng cách. Các đường thẳng song song vẫn giữ nguyên trong tình trạng song song. Điều này khiến bạn dùng sprite dễ dàng hơn vì các sprite đều có kích thước cố định. Nhưng một điều rõ ràng là cách này sẽ “bóp méo” cảnh. Để hạn chế tình trạng “méo mó” này, hãy đảm bảo người chơi không thể nhìn thấy các đối tượng nằm ở phía xa. Chúng ta có thể làm được điều đó bằng cách đặt góc nhìn từ trên xuống dưới (thường là góc 45 độ). Vì vậy, những hình vuông sẽ trông giống hình chữ nhật.

Một hình nền sẽ trông như sau:



Bạn có thể dễ dàng tạo ra hình ảnh như vậy. Chúng ta đơn giản là xác định tỷ lệ theo chiều dọc.

Chúng ta sẽ thực hiện phương pháp này với một demo nhỏ, trong đó người chơi điều khiển một nhân vật có thể đi qua một khu vực đầy cây cối. Có ba thứ cần chú ý (1) thực hiện đúng yêu cầu bỏ đi bề mặt ẩn (vẽ nhân vật này trước khi vẽ cái cây để có thể bị lấp trong bóng cây đó); (2) đảm bảo tốc độ của nhân vật đúng như quy luật thông thường, ví dụ như sang phải sang trái phải nhanh hơn tiến hoặc lùi; (3) điều quan trọng nhất là tạo ra các vụ đụng độ thật chính xác.

Hãy bắt đầu bằng việc bỏ đi bề mặt ẩn.

Như bạn đã biết, mỗi sprite đều có một vị trí gốc và hãy mặc định nó ở góc tận cùng bên trái của hình sprite. Khi đặt instance của object tại một điểm xác định nào đó, chúng ta luôn đặt nó cùng với điểm gốc. Khi thực hiện công việc trong thế giới 3D, điều dễ nhất là xác định gốc của nó tại vị trí đang đứng. Như vậy, chúng ta đặt gốc của tất cả các sprite cho vị trí đó. Ví dụ như đối với một nhân vật đang đi trong rừng, bạn có thể xác định sprite như sau:



Chú ý rằng chúng ta có thể thiết lập một bounding box như dưới đây. Nhân vật được thể hiện bằng 4 sprite khác nhau với các hướng đi khác nhau. Một điều rõ ràng là chúng ta phải đặt cả 4 hình này với cùng vị trí gốc và chung một bounding box.

Và lúc này, hãy thực hiện “độ sâu” của hình ảnh. Trong nhiều trường hợp, thứ tự các đối tượng phải được vẽ giống như thứ tự mà chúng xuất hiện trên nền. Vì vậy, bằng cách xác lập vị trí gốc như trên, trục y của instance xác định vị trí đó. Instance có tọa độ y thấp (gần ở phía trên đỉnh của cửa sổ) cần phải vẽ trước instance có tọa độ cao (và do đó “độ sâu” thấp hơn). Bạn có thể làm điều này bằng cách để tọa độ đó mang giá trị âm.



Đối với các object tĩnh, ví dụ như cây cối, chúng ta chỉ cần làm việc này một lần trong sự kiện khởi tạo. Còn đối với các object động, ví dụ như nhân vật trong ví dụ này, chúng ta phải làm điều đó trông từng bước một. Tốt hơn hết là hãy dùng sự kiện End Step để đảm bảo tất cả các sự kiện khác đều được thực hiện trước khi “độ sâu” này được áp dụng.

Thứ hai là sự chuyển động của nhân vật. Chúng ta có thể làm được điều này bằng cách thông thường với các phím mũi tên. Trong mỗi sự kiện phím mũi tên, hãy đặt chuyển động theo hướng chính xác và đặt đúng sprite cho instance. Cũng vậy, để tạo hình ảnh động của sprite trong khi di chuyển và không tạo hình động trong khi nhân vật đứng yên, chúng ta có thể dùng đến biến số image_speed. Biến số này xác định tốc độ mà các hình ảnh đơn trong tập hợp ảnh làm thành hình động được thể hiện. Số 1 sẽ khiến ảnh động này di chuyển với tốc độ bình thường còn số 0 sẽ làm ngưng chuyển động. Bạn có thể dùng giá trị -1 cho các hình đơn để chúng không thay đổi trong khi đã di chuyển theo đúng 1 hướng nào đó.



Chúng ta thiết lập giá trị tốc độ bằng 0 cho thời điểm người chơi thả phím này ra. Và bạn cũng có thể làm điều này khi có sự kiện đụng độ xảy ra.

Nhưng chú ý điều quan trọng mà chúng ta phải quan tâm trong khía cạnh 3D là sự khác nhau về tốc độ. Đối với chuyển động theo phương nằm ngang, bạn có thể dùng tốc độ 3 còn theo chiều thẳng đứng là 2. Bạn phải thử nghiệm với các con số khác nhau để tạo ra hiệu ứng tốt nhất cho trò chơi của mình.

Điều cuối cùng và cũng là điều quan trọng nhất là các sự kiện đụng độ. Thường thì sự kiện này xảy ra khi các sprite “phủ” nhau một phần. Điều này rất dễ với game 2D nhưng không hề đơn giản với game 3D. Vì vậy, chúng ta cần một cách khác để xác định việc này. Ví dụ: chỉ khi chân của nhân vật chạm vào gốc cây thì mới diễn ra sự kiện đụng độ thật sự. Cách dễ dàng để làm được điều này là xác định một bounding box cho tất cả các sprite và không dùng chức năng kiểm tra đụng độ chính xác. Một đụng độ chỉ được thiết lập khi các bounding box “phủ” nhau một phần và đó mới chính là điều chúng ta cần.

Đối với các hình phức tạp hơn, bouding box này không thể chỉ ra chính xác được “vùng đụng độ”. Và trong trường hợp này, chúng ta có thể dùng đến một tính năng khác của Game Maker.

Một object có thể có “vỏ ngoài” khác so với sprite để thể hiện các instance. Do đó, bạn hãy tạo một sprite thứ hai có hình của “vùng đụng độ” như yêu cầu và dùng làm “vỏ ngoài” cho vụ đụng độ này. Đó chính là các nguyên liệu cần thiết để làm game 3D. Để mọi thứ trông có vẻ xinh xắn hơn, bạn hãy dùng đến các hình lát làm nền, ví dụ như kích cỡ 48x24 chẳng hạn, hay thêm vào những bức tường gồ ghề cho nền này. Sau đó, bạn có thể dùng đến một kỹ thuật tiêu chuẩn mà theo đó hãy xác định một object dạng tường “vô hình” rồi đặt những instance này lên mặt trên của tường. Như vậy, nhân vật sẽ dừng lại vì nó sẽ đụng vào những instance vô hình trong khi người chơi chỉ nhìn thấy hình nền tuyệt đẹp ở phía sau.

Công đoạn cuối cùng là tạo room. Chúng ta sẽ dùng đến một cảnh và tạo ra chiều sâu với kích cỡ 400x200. Chú ý bảng thông tin nên đặt ngang ở dưới màn hình để không gian game trông có vẻ rộng.



Xác định tỷ lệ hình ảnh

Khi dùng đến hình chiếu song song, nếu giữ cảnh có độ cao ở mức nào đó từ mặt đất lên theo một hướng xác định và chỉ thể hiện một phần nhỏ trong thế giới đó thì phương pháp này là ổn. Nhưng nếu muốn tạo ra góc nhìn của người thứ nhất hoặc nhìn sát hơn xuống mặt đất thì chúng ta phải cần đến phép chiếu góc. Kích cỡ của vật thể phải nhỏ hơn khi ở phía xa. Nhưng làm thế nào để có được điều đó? Trong phần tạo hình thị sai, chúng ta đã xét đến ví dụ về ba cái cây có kích cỡ khác nhau. Chúng sẽ thể hiện tốt khi những cái cây này giữ khoảng cách cố định. Nhưng trong thế giới 3D, người chơi có thể tiến đến gần chúng và do đó, kích thước này cần phải thay đổi liên tục.

Chúng ta có thể tạo ra vô số sprite khác nhau, mỗi sprite một kích thước. Tuy nhiên, việc này sẽ làm tốn bộ nhớ. Bạn có thể nghĩ rằng sẽ làm việc này cho các vật thể quan trọng để tạo ra ấn tượng tốt nhất. Nhưng chúng ta phải làm việc này với vô số sprite khác nữa.

Trước hết, chúng ta cần có một sprite cho cái cây và chỉ dùng một sprite. Nếu thích đụng độ với cái cây, bạn có thể đặt vị trí gốc tạo gốc cây. Các đặc điểm của sprite này được thể hiện như dưới đây:



Sau đó, bạn tiếp tục dùng đến hình rặng núi để làm nền nhưng lần này là không cuộn và dùng đến room lớn với độ rộng 2000. Đặt nhân vật chính ở giữa phần dưới của room và dùng kích thước cảnh nhìn (view) là 480x320 để giữ nhân vật này ở giữa bằng cách thiết lập biên giới của view để “đi theo” nhân vật như sau:



Nhân vật sẽ di chuyển từ trái sang phải khi người chơi nhấn phím mũi tên trái, phải. Chúng ta phải tránh để họ di chuyển quá xa về hai bên. Khi ghi điểm, chúng ta dùng thời gian mà nhân vật “sống”. Vì vậy, trong sự kiện Step của người chơi, chúng ta thiết lập giá trị 1 cho điểm số. Khi người chơi đụng với gốc cây là chúng ta hiển thị danh sách những người ghi điểm cao nhất và khởi động lại game. Điều còn lại phải giải quyết là cái cây. Có 3 yếu tố cần phải xử lý là kích thước, vị trí của màn hình và độ sâu. Những cái cây sẽ xuất hiện tại tung độ 180. Trong sự kiện End Step, chúng ta chỉnh tỷ lệ sprite dựa trên tung độ và có thể thay đổi biến số image_xscale và image_yscale, như dưới đây:



Bạn có thể áp dụng điều này để xoay hoặc chiếu hình sprite nhưng chúng ta không cần đến chức năng đó. Điều thứ hai là độ sâu. Trong sự kiện Step, hãy đặt độ sâu này với giá trị âm. Điều này có nghĩa là cái cây tiến gần đến phần dưới của màn hình (với tọa độ y tăng dần và gần người chơi hơn) hoặc ra xa màn hình tùy theo ý của bạn. Nhưng lưu ý đặt “độ sâu” thích hợp cho nhân vật để có vị trí chính xác giữa các lùm cây.

Điều cuối cùng là phải kiểm soát sự di chuyển của nhân vật và sẽ khó khăn hơn bạn tưởng tượng. Chúng ta có thể để các vòm lá này di chuyển xuống liên tục và do đó tăng tốc độ theo chiều dọc. Cũng vậy, các vật thể di chuyển về các cạnh bên nếu tiến đến gần hơn (do các đường thẳng song song có vẻ như sẽ gặp nhau ở một điểm nào đó). Vì vậy, dựa trên vị trí của cái cây so với điểm giữa của cảnh nhìn, chúng ta phải điều chỉnh tốc độ theo chiều ngang. Bạn có thể thực hiện được bằng đoạn mã sau với các con số thử nghiệm.



Để hoàn thiện trò chơi, chũng ta cần phải thêm một số thứ khác như hủy nó đi khi nó biến mất ở dưới màn hình và thêm object điều khiển để xử lý sự xuất hiện của những cái cây này.

Bạn có thể dùng cơ chế tương tự để tạo ra một trò chơi bắn súng với góc nhìn người thứ nhất. Điều này sẽ được nói kỹ hơn ở kỳ sau.

Nguồn : [You must be registered and logged in to see this link.]
Về Đầu Trang Go down
Xem lý lịch thành viên
 

Game Maker (phần 7): Tạo đồ họa 3D 'giả cầy'

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Đẳng Cấp Học Sinh :: Lập Trình - Thiết Kế :: Phát Triển Game :: Game Maker-