2010-12-14 41 views
6

Tôi có khá nhiều kinh nghiệm về PHP (khoảng 5 năm kinh nghiệm với một số trang web được tạo và hai trò chơi trình duyệt). Đây là lần đầu tiên tôi thực sự rối tung xung quanh với một công cụ cốt lõi thay vì chỉ phát triển một plugin hoặc mô-đun cho một cái gì đó như Joomla. Tôi có nhiều kinh nghiệm về các ngôn ngữ hướng đối tượng khác (như Java).Phát triển trò chơi Codeigniter

Câu hỏi của tôi là, tôi thấy mình phát triển trang web giống như một trang web bình thường, nhưng tôi muốn nó linh hoạt hơn và tôi không chắc mình đang làm điều đó đúng. Theo một cách nào đó, tôi cảm thấy mình đang xây dựng một nửa CMS.

Ví dụ: tôi có trang chính được thiết lập thông qua bộ điều khiển kiểm soát chế độ xem hiện đang được hiển thị. Trang xem chính trông giống như sau:

<?php $this->load->view("headerview"); ?> 
<?php $this->load->view($contentview); ?> 
<?php $this->load->view("footerview"); ?> 

trong chính tệp chế độ xem, vì vậy tôi có thể tự động tải nội dung, những người khác không thực sự thay đổi). Đây là câu hỏi đầu tiên của tôi, vì tôi làm tất cả các điều khiển thông qua tập tin điều khiển chính của tôi, điều này có đúng không?

Chức năng chỉ mục của tôi đặt chế độ xem chính là chế độ xem được tải với các biến cho “lượt xem nội dung” và “số lần xem”. Khi “contentview” là trò chơi, nó có một ngăn chia nhỏ, một hiển thị số liệu thống kê của người chơi và phần còn lại hiển thị trang nào người chơi hiện đang ở (cửa hàng thương gia, trong một trận chiến, khám phá thế giới, v.v.). Điều xác định những gì đang được hiển thị ở đây là biến "gamecontent" (cũng được truyền trong bộ điều khiển "chính").

<?php $this->load->view("menubar"); ?> 
<?php $this->load->view($gamecontent); ?> 

Trong ngắn hạn, tất cả xử lý chế độ xem hiện đang được thực hiện trong bộ điều khiển chính, tức là một bộ điều khiển duy nhất.

$data['title'] = "Experimental Page"; 
$data['maincontent'] = "gameview"; 
if($page == 1) { 
    $data['gamecontent'] = "townview"; 
} else if ($page == 2) { 
    $data['gamecontent'] = "merchantview"; 
} else if ($page == 3) { 
    $data['gamecontent'] = "explorationview"; 
} else if ($page == 4) { 
    $data['gamecontent'] = "hospitalview"; 
} else if ($page == 5) { 
    $data['gamecontent'] = "fightview"; 
} else if ($page == 6) { 
    $data['gamecontent'] = "adminview"; 
} 

$this->load->helper(array('form','url')); 
$this->load->library('form_validation'); 
$this->load->view('mainview', $data); 

Tôi chưa bắt đầu thêm chức năng chiến đấu và mua sắm, nhưng tôi có thể thấy bộ điều khiển này rất lớn, rất nhanh. Điều này có vẻ sai với tôi, nhưng bằng cách nào đó tôi không thể xây dựng cách sắp xếp chính xác thiết lập cốt lõi. Mục tiêu của tôi là (hy vọng) phân chia các bộ điều khiển để mỗi người xử lý một chức năng trò chơi riêng biệt, như chữa bệnh, chiến đấu, khám phá và vân vân, và được tách ra giống như các mô hình của tôi là (người dùng, mob, vật phẩm, ...). v.v.)

Có ai có thể giúp tôi tìm ra cách sắp xếp hợp lý dự án này không?

+1

Hơi không liên quan, nhưng tất cả các điều kiện đó có thể được thay thế bằng bảng tra cứu, ví dụ: '$ table = array (" townview "," merchantview "," explorationview ", ...); $ data ['gamecontent'] = $ table [$ page - 1]; 'hoặc một cái gì đó dọc theo những dòng đó. Sau đó, bạn có thể tách nội dung trò chơi thành "tệp cấu hình" riêng của mình và có phân tích cú pháp PHP (và lưu vào bộ nhớ cache), nhưng điều đó có thể quá mức nếu bạn không có nhiều dữ liệu để duy trì. –

+0

Đó là một lượng dữ liệu hợp lý nhỏ, tôi nhận ra mình có thể lưu trữ các trang theo nhiều cách, nhưng đây thực sự là để hoàn thành công việc :) – Organiccat

+0

Tôi phát triển một trò chơi bằng mã đánh lửa (poker, không kém) và đi xuống cùng một con đường bạn đang tìm kiếm chính mình. Nhìn lại, symfony cung cấp một kiến ​​trúc tốt hơn cho việc này. – Dolph

Trả lời

3

Tôi sử dụng thành phần Symfony Event Dispatcher để làm điều gì đó như thế này; các thành phần có thể được cài đặt mà không cần sử dụng Symfony Framework, vì vậy bạn có thể sử dụng nó với CodeIgniter, nhưng có thể đã có một cái gì đó tương tự có sẵn cho bạn; Tôi không biết CodeIgniter.

Trình điều phối sự kiện là triển khai chung của Observer Pattern.

  • Tôi có một danh sách các module mà đăng ký chính nó như các nhà quan sát cho bất cứ hành động mà họ xử lý
  • Mỗi yêu cầu đi qua một hành động (ví dụ"townview")
  • Bộ điều khiển của tôi chỉ tạo một Sự kiện với bất kỳ hành động nào giống như tên; Hệ thống điều phối sự kiện sau đó tìm thấy bất kỳ mô-đun nào yêu cầu có thể xử lý hành động đó và chuyển quyền kiểm soát cho chúng

Bằng cách này bộ điều khiển chính không thay đổi, cho dù bạn có bao nhiêu hành động; nó chỉ tạo ra một sự kiện và ném nó ra thông qua người điều phối; nếu nó không được xử lý nó sẽ ném một lỗi lớn (trong DEV) hoặc một lỗi tốt (trong PROD).

Điều này đặc biệt hữu ích trong ứng dụng của chúng tôi, nơi chúng tôi có nhiều thành phần tùy chọn có thể được bật hoặc tắt cho những người dùng/khách hàng khác nhau; không có logic phức tạp trong bộ điều khiển ở tất cả, tôi chỉ không đăng ký các mô-đun nếu chúng không được kích hoạt cho một khách hàng.

+0

Tôi không phải là mật thiết quen với việc gửi đi sự kiện nhưng có vẻ như rất nhiều dịch vụ web, đúng không? Ví dụ, tôi có một chương trình Flash gọi AMFPHP server phục vụ bất cứ phương thức nào mà tôi gọi và trả về kết quả, giữ mã phía máy chủ ở một bên và phía máy khách trên một mặt khác. Giống? Hay tôi đang đi sai đường? – Organiccat

+0

Vâng, nó * có thể *, nhưng trong trường hợp này không liên quan gì đến việc gửi đi sự kiện. Ý tưởng là mỗi mô-đun nói với một bộ điều khiển trung tâm "Tôi có thể xử lý sự kiện X", sau đó ở nơi khác trong mã bạn có thể tạo sự kiện X và yêu cầu một cái gì đó xử lý nó. Nó làm giảm sự ghép nối, vì người tạo sự kiện (trong trường hợp này là bộ điều khiển của bạn) không cần biết về những thứ đang thực sự xử lý sự kiện (ví dụ: các chế độ xem khác nhau của bạn). Hãy xem trang wiki, sau đó đọc qua tài liệu điều phối sự kiện - họ giải thích mọi thứ rất rõ ràng. –

Các vấn đề liên quan