2013-07-22 15 views
8

Tôi khá mới đối với toàn bộ mô hình hướng đối tượng.Đang cố gắng lập mô hình với javascript hướng đối tượng

Tôi đang cố gắng lập mô hình nhân vật trong một trò chơi nhất định, bạn có các cấp độ, lớp học khác nhau và rất nhiều lựa chọn thiết bị và như vậy.

Mục tiêu của tôi cuối cùng là tạo một "tủ quần áo" ở một số nơi mà người chơi có thể mở trang web, thử một số trang bị và xem nó ảnh hưởng như thế nào đến thông số của họ, chi phí, v.v ...

Tôi đã có các phần chính được lập trình (here), nhưng đó là tác phẩm đầu tiên của tôi với html, css và javascript và nó chỉ là một mớ hỗn độn lớn vào lúc này. Tôi muốn bắt đầu ra đúng thời gian này :)


Giả sử tôi có một đối tượng cho nhân vật mà chúng ta sẽ được mô phỏng:

var Lord = function(){ 

    this.Level =  1; 
    this.Gender =  'Male'; 
    this.Faction =  'Knight'; 

    this.Attack =  0; 
    this.Defense =  1; 
    this.SpellPower = 0; 
    this.Knowledge = 0; 
    this.Luck =  0; 
    this.Morale =  1; 
    this.Initiative = 0; 

    this.addParameter = function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 
    this.changeLevelTo = function(Level){ 
     this.Level = Level; 
    }; 
    this.changeGenderTo = function(Gender){ 
     this.Gender = Gender; 
    }; 
    this.changeFactionTo = function(Faction){ 
     this.Faction = Faction; 
     //adjust default stats based on new faction 
    }; 
}; 

Vấn đề của tôi là thế này: Một hiệp sĩ bắt đầu với 1 Quốc phòng và 1 tinh thần, các phe phái khác nhau sẽ cung cấp cho bạn các chỉ số tăng khác nhau. Các giá trị này không thể được phân bổ lại. Một người chơi cũng nhận được một số điểm stat để chi tiêu cho các thông số khác nhau khi san lấp mặt bằng và chúng có thể được phân bổ lại.

Hơn nữa, người chơi có thể trang bị một số thiết bị cho phép tăng chỉ số và không thể tái phân bổ các chỉ số này (chỉ bằng cách bỏ chọn nó). Những gì tôi đã thực hiện trước đây là tôi đã tạo ra một loạt các mảng với chỉ số tương ứng với mỗi tham số, mỗi mảng đại diện cho tăng chỉ số mặc định từ các phe phái khác nhau, tăng tổng số từ thiết bị và thống kê trình phát được phân bổ thủ công. Sau đó tôi tổng hợp từng chỉ mục để cung cấp cho tôi một mảng thông số cuối cùng để hiển thị. Sau đó, người chơi chỉ có thể phân bổ lại các điểm trong mảng thứ 3 và không phải bất kỳ mảng nào khác.

Tôi nên thực hiện điều này bằng cách sử dụng lập trình hướng đối tượng như thế nào?

Tôi đã đọc trên một số khái niệm cơ bản (đóng gói, thừa kế, đa hình) nhưng họ là khá trừu tượng và khi tôi nhận được xuống để nó, tôi không thực sự biết khá phải làm gì: s

-

-


Responses


webstie này là khá khó để sử dụng: o

Ok, tôi sẽ cố gắng và xem những gì tôi có thể nhận được từ câu trả lời qternion của:

var Faction = function(atk, def, sp, kn, luk, mor, ini){ 
    this.Attack =  atk; 
    this.Defense =  def; 
    this.SpellPower = sp; 
    this.Knowledge = kn; 
    this.Luck =  luk; 
    this.Morale =  mor; 
    this.Initiative = ini; 
} 

var Knight = new Faction(0,1,0,0,0,1,0); 
var Wizard = new Faction(0,0,0,1,0,1,0); 

Sau đó trên đối tượng Chúa, tôi sẽ phải

//this.Faction = 'Knight' 
    this.Faction = Knight 

    this.Defense = function(){ 
     return this.Faction.Defense + this.someOtherClass.Defense; 
    } 

tôi sẽ tìm cách để cải thiện trên với nguyên mẫu sử dụng http://javascript.crockford.com/prototypal.html

Cảm ơn tất cả mọi người vì tất cả những đóng góp của bạn :)

+0

'Một hiệp sĩ bắt đầu với 1 Defense' - vì vậy thiết lập này đến 1 trong đối tượng của bạn theo nghĩa đen ... 'Defense: 0,' => ' Defense: 1, ' –

+0

right, hang on :) – Sylin

+1

Với tinh thần muốn tăng kỹ năng OO Javascript của bạn, bạn cũng có thể xem bài viết SO này về các chức năng tạo mẫu: http://stackoverflow.com/questions/12238103/javascript-prototype-vs-general-functions-performance-dễ đọc –

Trả lời

2

Bạn có thể có giá trị thống kê của mình là phương pháp thay vì biến thành viên. Bằng cách đó, bạn có thể tính toán trong khi gọi một stat cụ thể, cho knight.defense(). Đổi lại, phương thức defense() trong lớp nhân vật của bạn có thể gọi defense() từ lớp faction, defense() từ class equipmentSet, vv. Ưu điểm của việc này là bạn có thể thêm các mod bổ sung bất cứ khi nào, ví dụ nếu bạn quyết định bạn muốn có một hệ thống perk hoặc một cái gì đó.

Mỗi lớp phái sau đó có thể ghi đè lên chức năng phòng thủ() của họ cho công cụ sửa đổi của họ.

Tôi sẽ không gọi đây là cách hướng đối tượng nhất nhưng đó là cách tôi tự làm như một lập trình viên Javascript.

Phụ lục: Câu trả lời của Pluto cũng là cách bạn nhận được "các lớp" (thay vì các đối tượng riêng lẻ) có thể sử dụng lại được. Như đã đề cập, tôi cũng làm cho lớp Faction thay vì chỉ một chuỗi (bạn có thể gõ-check với instanceof):

var Faction = function(){ 
    this.prototype.defense = function() { return this.Defense; }; 
    this.prototype.initStats = function() { this.Defense = 0;}; 
    this.initStats(this); 
}; 

var Knight = new Faction(); 
Knight.prototype.initStats = function() { this.Defense = 1;}; 

Ví dụ.

+0

ok chờ đợi, hãy để tôi thử và làm theo: q – Sylin

+0

ok chờ đợi, vì vậy kể từ khi tôi sẽ tính toán phòng thủ trước khi trình bày nó, tôi chỉ có thể sử dụng giá trị trả về của phương pháp phòng thủ thay vì tính toán nó, gán nó cho tài sản quốc phòng, và sau đó sử dụng tài sản riêng của mình? Tôi nghĩ rằng tôi bắt đầu để có được điều này một chút bây giờ: D – Sylin

+0

Vâng, đó là nó. Bạn chỉ cần gán giá trị trả về theo cách thủ công nếu bạn muốn cache nó vì một lý do nào đó (ví dụ bạn có thể có các thay đổi stat tạm thời và bạn muốn cache bảo vệ cơ sở của ký tự cho một số kiểm tra khác). – qternion

2

Bạn có thể giữ mảng nếu muốn. Điều quan trọng nhất về lập trình hướng đối tượng là đóng gói, nó sẽ cung cấp phương tiện tương tác với đối tượng Ký tự của bạn mà không phải biết bất kỳ điều gì về việc triển khai ở mức độ thấp. Bạn muốn để đối phó với đối tượng, không mảng hoặc hashtables (ngay cả khi bên dưới nó tất cả, đó là cách đối tượng được thực sự được xây dựng!) Những gì bạn muốn là viết mã mà trông như thế này:

var link = Knight(); 
link.equip(new MasterSword()); 
alert(link.getAttackPoints()); 

Eh, @qternion loại đánh tôi với nó. Vì vậy, tôi đang chuyển câu trả lời này thành một wiki! Hãy mở ra sự khôn ngoan của SO trên cái này.

+0

Tôi không hoàn toàn chắc chắn những gì answer2wiki ngụ ý, nhưng nếu nó giúp bạn và tôi, sau đó tôi ổn với nó :) – Sylin

2

Chỉ cần thay đổi Chúa làm chức năng (ví dụ: var Lord = function() { /* current code */ }) và đặt thuộc tính của nó bằng this.Level = 1;.Sau đó, từ bây giờ, bạn có thể tạo nhiều Lãnh chúa theo ý muốn với new Lord() như hầu hết các ngôn ngữ lập trình hướng đối tượng.

Một ví dụ về điều này trong thực tiễn ...

var Lord = function() { 

    this.Level=1; 
    this.Gender='Male'; 
    this.Faction='Knight'; 

    /* ... */ 

    this.addParameter=function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 

    /* ... */ 
}; 
var a=new Lord(); 
var b=new Lord(); 
+0

ok, có lẽ tôi sẽ đổi thành Tôi đã định sử dụng ký pháp này cho các thiết bị, và sẽ chỉ có một nhân vật để mặc xung quanh vì vậy tôi đã sử dụng ký hiệu chữ, nhưng tôi không hoàn toàn quen thuộc với nó – Sylin