Thứ Ba, 26 tháng 8, 2014

Cloud computing là gì - Bài tập tuần 1 - THDC_SIE_20141_Nguyễn Triệu Triết_20138806

-Cloud computing tiếng Việt có nghĩa là “Điện toán đám mây” hay còn được gọi là điện toán máy chủ ảo là mô hình điện toán sử dụng các công nghệ máy tính và phát triển dựa vào mạng internet.Thuật ngữ “đám mây” ở đây là lối nói ẩn dụ chỉ mạng internet ( dựa vào cách được bố trí của nó trong sơ đồ mạng máy tính) và như một lien tưởng về sự phức tạp của các cơ sở hạ tầng chứa trong nó.Ở mô hình điện toán này,mọi khả năng liên quan đến công nghệ thông tin đều được cung cấp dưới dạng “dịch vụ”,cho phép người dùng các dịch vụ công nghệ từ một nhà cung cấp nào đó trong “đám mây” mà không cần phải có các kiến thức,kinh nghiệm về công nghệ đó,cũng như không cần quan tâm đến cơ sở hạ tầng phục vụ công nghệ đó

-Cloud computing là hình mẫu trong đó thông tin được lưu trữ thường trực trong các máy chủ trên internet và chỉ được lưu trữ tạm thời ở các máy khách ,bao gồm máy tính cá nhân máy tính doanh nghiệp hay các phương tiện máy tính cầm tay.

-Cloud computing là khái niệm bao gồm các khái niệm như phần mềm dịch vụ web 2.0 và các vấn đè khác xuất hiện gần đây ,các xu hướng công nghệ nổi bật,trong đó đề tài chủ yếu của nó là vấn đề dựa vào internet để đáp ứng những nhu cầu điện toán của người dùng.

-Thuật ngữ “cloud computing” xuất hiện từ năm 2007 để khái quát lại các hướng đi của cơ sở hạ tầng thông tin vốn đã và đang diễn ra.Các nguồn điện toán khổng lồ như phần mềm ,dịch vụ sẽ nằm lại các máy chủ ảo (đám mây) trên internet thay vì trên máy tính gia đình và văn phồng trên mặt đất để mọi người kết nối và sử dụng mỗi khi họ cần.

*Ví dụ các công nghệ dựa trên cloud computing.
      1.Google App Engine:là công nghệ của hãng Google cung cấp cho người dùng những ứng dụng về kinh doanh có thể truy cập từ các trình duyệt web nhưng toàn bộ dữ liệu được lưu trữ trên máy chủ.
     2.One Drive:là công nghệ của hãng Microsoft cung cấp cho người dùng tính năng chỉ với một tài khoản nhập với máy chủ sau khi tải dữ liệu lên đám mây người dùng có thể truy cập lại những dữ liệu đó từ một thiết bị khác có sử dụng tài khoản này.
     3.Icloud:là công nghệ của hãng Apple có tính năng gần giống với One Drive của Microsoft, dùng để lưu trữ dữ liệu và thông tin người dùng trên đám mây.


NOTE: THDC_SIE_20141_Nguyễn Triệu Triết_20138806

  • Tên thư mục bài tập tuần 1 đặt sai
  • Bài lầm nên >=3 trang và có hình minh họa

Thứ Hai, 25 tháng 8, 2014

Những cải tiến cơ bản từ Windows 7 lên Windows 8 - BT tuần 1 - THDC_SIE_20141_LeMinhNguyen_20138317

Những cải tiến cơ bản từ Windows 7 lên Windows 8


Hệ điều hành mới của Microsoft bao gồm nhiều cái tiến cơ bản, ví dụ như thiết lập đa màn hình tốt hơn, Windows Explorer cải tiến mạnh mẽ, đồng bộ tài khoản dựa trên công nghệ điện toán đám mây và cách thức mới để cá nhân hóa máy tính của bạn.
Windows 8 có thể đồng bộ hóa những thiết lập cá nhân của bạn lên nhiều máy tính khác nhau, giúp bạn hạn chế tối đa những rắc rối có thể gặp phải trong việc tùy chỉnh môi trường Windows của bạn bằng cách thủ công trên nhiều máy tính khác nhau.
Bạn có thể đồng bộ theme và hình nền cho desktop, lock screen, account pictures, passwords, HomeGroup settingss, Modern UI app settings, browers history, favorites và nhiều tính năng khác nữa.
Đương nhiên là bạn phải có tài khoản của trên Microsoft để kết nối nhiều PC chạy Windows 8.

Mạng xã hội đã được tính hợp vào trong tính năng Modern UI của Windows 8 với khả năng chia sẻ các item giữa các ứng dụng Modern UI.

Bạn có thể sử dụng chức năng này để chia sẻ nhiều thứ hay ho như các đường link, hình ảnh với bạn bè của bạn thông qua Mail hoặc là bạn có thể post hình ảnh lên các mạng xã hội như Facebook, Linkedln và Twitter thông qua ứng dụng People.

Tính năng Sharing phải được tính hợp trong các ứng dụng của các nhà phát triển ứng dụng thứ 3, vì vậy Sharing có thể không hoạt động với tất cả các ứng dụng Modern UI
Trong Windows 8, Microsoft đã cải tiến chức năng thiết lập đa màn hình. Giao diện màn hình destop truyền thống hiện nay đã có thanh Taskbars và hình nền riêng biệt cho mỗi màn hình. Bạn có thể truy cập vào thanh Charms hay thanh Running Apps từ bất kì màn hình nào.

Khoảng không lưu trữ
Trong Windows 8, Microsoft cho phép bạn mở rộng khả năng lưu trữ bằng việc cho phép đồng hóa dữ liệu, thành một không gian duy nhất. Bạn có thể đồng hóa cả một ổ cứng di động, một USB trên hệ thống của bạn và Windows sẽ hiểu rằng: đó là một phần của ổ cứng máy tính.

Nếu USB của bạn tự nhiên ngắt kết nối, nó sẽ có thể gây ra lỗi cho hệ thống tập tin của bạn nếu như bạn đang truy cập tập tin đó để sao lưu hoặc lưu trữ trên 2 ổ đĩa khác nhau. Tuy nhiên, Microsoft đã tính tới vấn đề này và hệ thống RAID sẽ giải quyết vấn đề đó, RAID bảo vệ dữ liệu của bạn và đảm bảo rằng tập tin đó sẽ không bị lỗi.

Thời gian khởi động nhanh hơn
Theo như Microsoft thì Windows 8 có hệ thống khởi động lai. Hệ thống này cho phép cải thiện thời gian khởi động đáng kể so với Windows 7. Hệ thống khởi động lai mới kết hợp các quá trình trong khởi động lạnh (tạm dịch từ cold boot) và chế độ Hibernate.

ARM
Trước Windows 8, các máy tính cá nhân hầu hết dùng bộ xử lý x86. Nhưng nay, phiên bản Windows RT có thể chạy với bộ xử lý ARM. Microsoft dường như đang phá vỡ truyền thống lâu đời bằng việc ra mắt máy tính bảng Surface RT, với phần cứng do Microsoft phát triển. Chip ARM có lợi thế là tiêu thụ ít điện năng hơn x86, giúp kéo dài thời gian dùng pin Windows Store Phần quan trọng của Windows 8 chính là các ứng dụng theo phong cách Modern. Các ứng dụng này giúp làm nổi bật giao diện Modern UI cũng như tính năng cảm ứng của Windows 8. Bạn chỉ có thể mua các ứng dụng này qua Windows Store. 

Microsoft xây dựng kho ứng dụng nhằm khuyến khích phát triển các ứng dụng người dùng, bên cạnh đó là thúc đẩy doanh số cho các thiết bị Windows 8. Apple là một trong những hãng khá thành công với kho ứng dụng, tạo tiền đề cho việc thúc đẩy doanh số thiết bị iOS

Những cải tiến từ Windows 8 lên Windows 8.1

Windows 8.1 Update tập trung cải thiện trải nghiệm của người dùng máy tính với chuột và bàn phím truyền thống chứ không có nhiều điểm mới về mặt cảm ứng. Ở thanh tác vụ, khi bạn vừa cập nhật Windows 8.1 Update xong thì ứng dụng Windows Store sẽ được ghim ra đây, một động thái giúp người dùng desktop truyền thống dễ dàng khám phá kho ứng dụng của Microsoft. Và khi đang chạy các app theo phong cách Windows 8, bạn có thể di chuyển con trỏ chuột xuống cạnh dưới màn hình để thanh tác vụ hiện ra.

Bên cạnh đó, ở thanh tiêu đề của các app Modern giờ đây sẽ có thêm nút đóng, thu nhỏ và snap (giống app dạng cửa sổ bình thường), menu mới khi nhấn chuột phải vào các ô Live Tile (có tùy chọn đổi kích thước, unpin...). Khi thu nhỏ thì app này sẽ nằm trên thanh tác vụ của Windows 8.1 Update, tương tự như khi bạn thu nhỏ những phần mềm desktop bình thường.


Chưa hết, Microsoft bổ sung thêm một ô tile giúp mở nhanh trình cài đặt PC Settings. Hãng cũng cho phép hiển thị ứng dụng Modern trong thanh tác vụ khi chạy trong môi trường desktop và chúng ta vẫn xem được hình ảnh thu nhỏ của app.


Microsoft cho biết thêm rằng hãng đang làm việc với một số hãng sản xuất phần cứng để xác định xem những chiếc PC nào không được trang bị màn hình cảm ứng, hoặc có nhưng không phải là cách nhập liệu chính. Kế tiếp, Microsoft sẽ giúp các công ty phần cứng thiết lập mặc định chế độ boot thẳng vào giao diện desktop đối với những máy tính như thế. Những chiếc PC dùng màn hình cảm ứng hoặc tablet thì vẫn sẽ boot trực tiếp vào màn hình Start như Windows 8 từ trước tới nay.

Và nếu máy tính của bạn boot ngay vào desktop thì hình ảnh và các tập tin MP3 của bạn sẽ được mở trong phiên bản desktop của những ứng dụng tương ứng, thay vì phải chuyển sang chạy app Photos và Music của Windows 8. Nút shutdown và tìm kiếm cũng được mang ra ngay Start Screen để tiết kiệm thời gian cho người dùng. Lưu ý rằng nút shutdown này chỉ có mặt trên các PC truyền thống, còn nếu search sẽ hiện diện ở mọi thiết bị dùng Windows 8.1 Update.


Cải tiến cuối cùng liên quan đến hệ điều hành này nằm ở chỗ nó chỉ cần thiết bị với RAM 1GB và bộ nhớ trong 16GB là đã có thể chạy được. Nhờ điểm mới này mà chúng ta sẽ thấy nhiều hơn các PC và tablet giá rẻ chạy Windows trong thời gian tới. Microsoft cũng đã thực hiện nhiều thay đổi để giúp giảm kích thước bộ cài Windows 8.1 Update xuống thấp hơn 60% so với trước để giúp các hãng sản xuất thực hiện việc cài đặt Windows một cách nhanh chóng hơn.
  


Hướng dẫn tạo và chia sẻ thư mực bằng Google Drive

Bạn nào chưa biết làm thì làm theo các bước sau nhé!

1. Tạo thư mục "gốc" trên Google Drive



2. chia sẻ thư mục



Danh sách nộp bài tập tuần D3T 20141

Danh sách nộp bài tập tuần D3T 20141


Chủ Nhật, 24 tháng 8, 2014

Điểm cuối kỳ (có cộng) CTDLGT 20133

Các bạn có thắc mắc gì thì email lại nhé!

Bạn Trần Xuân Tới 20102348 có đi thi cuối kỳ nhưng không có bài là thế nào? Bạn nào biết bạn ấy thì hỏi giùm nhé!








Thứ Sáu, 15 tháng 8, 2014

Mì Gói và Nguy Cơ Tim Mạch

source : http://www.gocnhinalan.com/bai-cua-khach/mi-goi-va-nguy-co-tim-mach.html

Tại Sao Mì Gói Gây Hại Cho Sức Khỏe?
Why Ramen Noodles Could Cut Your Life Short? mi goi By: Beth Greenfield – Yahoo-Health- 15 Aug 2014
Phỏng dịch: Melissa Mai

Món hợp khẩu vị nhưng rẻ tiền – mì gói – sản phẩm của nhiều sinh viên và dân tiết kiệm, có thể gây bệnh tim mạch và tiểu đường. Theo Journal of Nutrition, tất cả loại mì ăn liền đều gia tăng độ rủi ro  với hiện tượng tim mạch từ ăn uống (gây nhồi máu cơ tim và não bộ), nhất là với phụ nữ.

 Holy hotplates! Instant ramen noodles, beloved cheap dinner of college kids and budget eaters everywhere, have been linked to heart attacks and diabetes. A study published in the Journal of Nutrition found that the ramen, along with other instant noodle products, may increase a person’s risk for cardiometabolic syndrome — a risk factor for severe cardiovascular disease and stroke — especially in women.

Nghiên khảo này rất quan trọng vì nhiều người ăn mì gói mà không biết về rủi ro tiềm ẩn. Đây là báo cáo truyền thông đến từ Hyun Joon Shin, nghiên cứu viên về tim mạch của Đại Học Baylor và chuyên gia dinh dưỡng tại Đại Học Harvard.

“This research is significant since many people are consuming instant noodles without knowing possible health risks,” said lead researcher Hyun Joon Shin, MD, in a press release. Shin, a clinical cardiology fellow at Baylor University Medical Center and a nutrition epidemiology doctoral student at the Harvard School of Public Health, could not be reached for further comment.

Trong nghiên cứu, các nhà khoa học đã điều tra 10,711 người lớn tuổi từ 19 đến 64, do Korean National Health và Nutrition Examination thu thập. Họ tìm thấy việc ăn bất cứ loại mì gói nào trên 2 lần 1 tuần sẽ tác dụng vào hiện tượng tim mạch do ăn uống và gây ra những biến chứng ảnh hưởng đến hệ thống tim mạch, bài tiết và dinh dưỡng của cơ thể.

For the study, researchers looked at the data of 10,711 adults between the ages of 19 and 64, collected via the nationally representative Korean National Health and Nutrition Examination Survey of 2007-2009. They found that eating instant noodles — ramen, lo mein, glass, Thai, or other — twice or more a week was associated with cardiometabolic syndrome, a collection of abnormalities affecting the body’s cardiovascular, renal, and metabolic systems.

Lý do cụ thể chính yếu chưa rõ rang, nhưng Shin lưu ý đến sự kiện mì gói d0ong1 trong Styrofoam có chứa bisphenol A, gây phản ứng cho hormone (khiến phụ nữ dễ bị tổn thương hơn). Tuy nhiên, sản phẩm mì gói cũng chứa rất nhiều nguyên liệu không lành mạnh như MSG, các hóa chất bảo quản  như TBHQ và lượng chất mỡ hòa tan rất cao.

Although the specific cause of the problem was not immediately clear, Shin noted that it might stem from the fact that most instant noodle meals come packaged in Styrofoam, which contains bisphenol A (BPA), a known hormone disruptor — which is also why women could have been more affected in this study. But the food product contains plenty of unhealthy ingredients, including MSG and the chemical preservative tertiary-butylhydroquinone (TBHQ), and is also high in saturated fat.

Nghiên cứu thực hiện tại Hàn Quốc, xứ có lượng người tiêu dung mì gói (per capita) cao nhất thế giới và bệnh tim mạch cùng béo phì đang gia tăng đáng kể. Tuy nhiên, báo cáo cũng thích ứng với người tiêu dung tại Mỹ, đứng hàng thứ 6 về tiêu thụ toàn cầu, theo Wotld Instant Noodles Association, với 4 ngàn 3 trăm tỷ gói mì bán ra trong 2013/ (đứng sau Trung Quốc, Indonesia, Nhật, Việt Nam và Ấn Độ).

The study focused on individuals in South Korea, Shin said, as the country has the highest per-capita number of instant noodle consumers in the world, and because, in recent years, health problems there, including heart disease and obesity, have been on the rise. But the findings appear to be quite relevant to consumers stateside too, as the United States ranked sixth globally in instant noodle sales, according to the World Instant Noodles Association, which found that the United States accounted for 4,300 billion units sold in 2013 (coming in just behind China, Indonesia, Japan, Vietnam, and India — and one spot above South Korea, in fact).

Đây không phải lần đầu có báo động về mì gói. Vào 2012, một video truyền trực tuyến cho thấy bên trong một bộ tiêu hóa. khi vừa ăn xong mì gói – và hình ảnh rất tệ hại (theo một nghiên cứu khác không kết luận của Dr. Braden Kuo). bao tử phải làm việc liên tục nhiều giờ để thanh hóa hết chất ăn và TBHQ, một phó phẩm của dầu khí, được coi như thủ phạm. Nhiều năm trước, giới chức y tế Mã Lai phát hành mộ cảnh báo về nguy cơ tim mạch, vỡ mạch máu não  và hại thận vì những độc tố như chất làm đặc (thickeners), chất bão hòa,  sodium, và các chất bảo quản.

This is not the first time ramen noodles have been publicly maligned. In 2012, a viral video taken from inside the digestive tract, part of a small and inconclusive study by Dr. Braden Kuo, showed just what happened after instant ramen was ingested — and it wasn’t pretty. The stomach worked overtime, struggling for hours to grind up the strands; TBHQ, a petroleum byproduct, was named as a possible culprit. Years earlier, Malaysian health officials issued a warningagainst eating instant noodles because of ingredients such as thickeners, stabilizers, sodium, and preservatives that have been linked to heart disease, stroke, and kidney damage.

Nissan Foods, nhà sản xuất mì gói đầu tiên tại Mỹ, không trả lời các câu hỏi của Yahoo Health. Nissin Foods, maker of the first instant ramen noodle in Japan in 1958 (and the company that brought Top Ramen to the U.S. in 1972), did not respond to a request for comment from Yahoo Health.

Kết luận? Ăn mì gói và ráng chấp nhận rủi ro cho mình.

The bottom line? Ingest the cheap and filling noodles at your own risk

Thứ Tư, 13 tháng 8, 2014

Lich dạy kỳ mới

7560975609IT3010Cấu trúc dữ liệu và giải thuậtCơ điện tử-K56SLT+BT1120Đang xếp TKBViện Công nghệ Thông tin và Truyền thôngĐại học đại tràPhòng Đào tạo Đại họcViện Công nghệ Thông tin và Truyền thông1,615,616,2-9,TC-401;2,314,316,2-9,TC-401;3,511,513,2-9,TC-401;144
7477374773IT1110Tin học đại cươngĐiện tử 5,6,7,8-K58CLT+BT1180Đang xếp TKBTNViện Công nghệ Thông tin và Truyền thôngĐại học đại tràPhòng Đào tạo Đại họcViện Công nghệ Thông tin và Truyền thông1,621,624,2-9,12-19,D5-103;234

Lớp CTDLGT sắp bị hủy do có ít người đăng ký, bạn nào đã đăng ký rồi thì nên chủ động hủy lớp nhé!

Thứ Hai, 11 tháng 8, 2014

Lịch bảo vệ BTL CTDLGT 20133

Thời gian :

  • Chiều thứ 5 sau 4h chiều
  • Sáng thứ 3 (19/8): 11h sáng ->12h
  • Sáng thứ 6 (22/8): 11h sáng ->12h
  • Extra : Chiều thứ 6 (22/8): 3h30 chiều ->5h (contact qua FB trước )

Địa điểm: 602 B1

Các bạn bảo vệ nhớ mang hoặc chuẩn bị máy, chương trình để chạy được luôn, và giấy để demo nếu cần :)

Thứ Tư, 6 tháng 8, 2014

Bài 30: Học làm game thứ 5 - Space Ship ( Part 2 - End )


Hi, Rảnh rỗi tranh thủ viết cho xong game Space Ship này.
Bài trước chúng ta đã thiết kế sơ bộ xong phần màn chơi, song còn thiếu một số phần quan trọng trong game nên có mà chúng ta sẽ bổ sung ngay sau đây:

+ Bắn đạn khi Touch màn hình
+ Bắt sự kiện va chạm giữa đạn và thiên thạch
+ Tính điểm
+ Game Over

Đơn giản có thế thôi, chúng ta sẽ lướt nhanh!

B1: Bắn đạn khi Touch màn hình

Bạn mở file HelloWorldScene.h thêm vào dòng lệnh sau, trong public

// Hàm bắt sự kiện touch, dùng multiTouch, hoặc Touch thôi cũng được
void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)

Tiếp đó trong HelloWorldScene.cpp ta thiết kế hàm này như sau

void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)
{
SimpleAudioEngine::getInstance()->playEffect("laser_ship.wav"); // Âm thanh

Size winSize = Director::getInstance()->getWinSize();

// Lấy sprite Laser từ bộ lưu trữ Vector
Sprite *shipLaser = (Sprite *) _shipLasers->at(_nextShipLaser++);

if ( _nextShipLaser >=_shipLasers->size())   // Reset index laser
_nextShipLaser = 0;
// Đặt vị trí ở phía mũi tàu, và cho hiện lên
shipLaser->setPosition(Point(_ship->getPosition().x + shipLaser->getContentSize().width/2, _ship->getPosition().y));
shipLaser->setVisible(true);
// set body
auto laserbody = PhysicsBody::createBox(shipLaser->getContentSize()/2);  

laserbody->setContactTestBitmask(0xf);  
laserbody->setDynamic(true);
shipLaser->setPhysicsBody(laserbody);

// Di chuyển đạn, gọi tới hàm setInvisible để xử lý
shipLaser->stopAllActions();
shipLaser->runAction(Sequence::create( 
MoveBy::create(0.5,Point(winSize.width, 0)),
CallFuncN::create(this, callfuncN_selector(HelloWorld::setInvisible)), 
NULL 
));
}

B2: Bắt sự kiện va chạm

Thêm hàm sau vào file HelloWorldScene.h

bool onContactBegin(const PhysicsContact &contact);

Và xây dựng nó trong file HelloWorldScene.cpp như sau

bool HelloWorld::onContactBegin(const PhysicsContact& contact)    
{
auto laser = (Sprite*)contact.getShapeA()->getBody()->getNode();
int Tag1 = -1;
if(laser) 
Tag1 = laser->getTag();
auto asteroid = (Sprite*)contact.getShapeB()->getBody()->getNode();
int Tag2 = -1;
if(asteroid) Tag2 =  asteroid->getTag();

//Va chạm giữa đạn và Thiên Thạch
if((Tag1==KLASER&Tag2==KASTEROID)||(Tag2==KLASER&Tag1==KASTEROID))
{
SimpleAudioEngine::sharedEngine()->playEffect("explosion_large.wav"); 
_world->removeBody(laser->getPhysicsBody());
laser->setVisible(false);
_world->removeBody(asteroid->getPhysicsBody());
asteroid->setVisible(false); 
}
// Va chạm giữa thiên thạch và Ship
if((Tag1==KSHIP&Tag2==KASTEROID)||(Tag2==KSHIP&Tag1==KASTEROID))

{
_lives--;

}

return true; 
}

Và không được quên đoạn code Listener ở init()

auto contactListener = EventListenerPhysicsContact::create();
contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);

OK, giờ là tới phần Tính điểm và GameOver

B3: Tính điểm và GameOver

Trong hàm update() bạn thêm vào 1 đoạn sau đây

if (_lives <= 0) { // Kiểm tra không còn mạng nào thì game Over
_ship->stopAllActions();
_ship->setVisible(false);
_world->removeBody(_ship->getPhysicsBody());
this->endScene(KENDREASONLOSE);   // Game Over

Hàm endScene xây dựng như sau

void HelloWorld::endScene( EndReason endReason ) {

if (_gameOver) // trạng thái game
return;
_gameOver = true;

Size winSize = Director::getInstance()->getWinSize();

char message[10] = "";
if ( endReason == KENDREASONLOSE)
strcpy(message,"You Lose"); 

// Tạo 2 Label để làm thông báo
LabelBMFont * label ;
label = LabelBMFont::create(message, "Arial.fnt");
label->setScale(0.1);
label->setPosition(Point(winSize.width/2 , winSize.height*0.6));
this->addChild(label);


// Tạo 1 nút reset game là 1 label
LabelBMFont * restartLabel;
strcpy(message,"Restart");
restartLabel = LabelBMFont::create(message, "Arial.fnt");

MenuItemLabel *restartItem =  MenuItemLabel::create(restartLabel,CC_CALLBACK_1(HelloWorld::resetGame,this));

restartItem->setScale(0.1);
restartItem->setPosition( Point(winSize.width/2, winSize.height*0.4));

Menu *menu = Menu::create(restartItem, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu);

restartItem->runAction(ScaleTo::create(0.5, 1.0));
label ->runAction(ScaleTo::create(0.5, 1.0));
this->unscheduleUpdate(); // dừng update Scene
}

Và nhớ phải thêm thuộc tính bool _gameOver vào phần public của HelloWorldScene.h, đồng thời trong hàm init() phải khởi tạo nó với giá trị false

Bổ sung hàm endScene() và resetGame() vào trong lớp HelloWorld, và hàm resetGame như sau

void HelloWorld::resetGame(Ref* pSender) {
auto scene = HelloWorld::createScene();
Director::getInstance()->replaceScene(TransitionZoomFlipY::create(0.5, scene));  

Size winSize = Director::getInstance()->getVisibleSize();

}

Giờ ta thêm 1 chút phần tính điểm. Khi bắn mỗi thiên thạch ta được 10 điểm.

Bạn thêm 1 thuộc tính int score, LabelBMFont * _scoreDisplay;vào lớp HelloWorldScene, và khi khởi tạo thêm đoạn code này

_scoreDisplay = LabelBMFont::create("Score: 0", "Arial.fnt", 
visibaleSize.width * 0.3f);
_scoreDisplay->setAnchorPoint(Point(1, 0.5));
_scoreDisplay->setPosition(
Point(visibaleSize.width * 0.8f, visibaleSize.height * 0.94f));
this->addChild(_scoreDisplay);

Trong hàm kiểm tra va chạm chúng ta sẽ tính điểm bằng đoạn code nhỏ như thế này

score+=10;
char szValue[100] = { 0 }; // Lấy ra điểm qua mảng đệm char
sprintf(szValue, "Score: %i", score); // Chuyển sang chuỗi => chuỗi
_scoreDisplay->setString(szValue); // Hiện điểm lên

Bạn có thể làm thế với Live để theo dõi số mạng của Ship

OK, Build thử xem kết quả thế nào nhé, cũng không tệ với 1 game "tự tui".

Và sau đây mình làm thêm 1 bước Bonus nữa là 

Bonus: Điều khiển Ship bằng Accelerometer - gia tốc kế

Trước hết bạn copy 2 file VisibleRect.h, .cpp trong bài cpp-tests vào Class của chúng ta. sau đó trong phần init() thêm đoạn code này vào

#define FIX_POS(_pos, _min, _max) \
if (_pos < _min)        \
_pos = _min;        \
else if (_pos > _max)   \
_pos = _max; 

auto listener = EventListenerAcceleration::create([=](Acceleration* acc, Event* event){
auto shipSize  = _ship->getContentSize();

auto ptNow  = _ship->getPosition();

log("acc: x = %lf, y = %lf", acc->x, acc->y);

ptNow.x += acc->x * 9.81f;
ptNow.y += acc->y * 9.81f;

FIX_POS(ptNow.x, (VisibleRect::left().x+shipSize.width / 2.0), (VisibleRect::right().x - shipSize.width / 2.0));
FIX_POS(ptNow.y, (VisibleRect::bottom().y+shipSize.height / 2.0), (VisibleRect::top().y - shipSize.height / 2.0));
_ship->setPosition(ptNow);
});

auto dispathcher = Director::getInstance()->getEventDispatcher();

dispathcher->addEventListenerWithSceneGraphPriority(listener, this);

Vậy thôi, hãy build lại và thử trên ĐT thật, khi nghiêng xem Ship có di chuyển không nhé, nếu di chuyển là đã thành công

Kết thúc bài này, chúng ta cùng nghiên cứu 1 số vấn đề sau

+ Bắn đạn = Touche, duyệt vector
+ Va chạm
+ Tính điểm, game Over
+ Di chuyển Ship bằng gia tốc kế

Download Code

Mình dừng bài học ở đây nhé

Bài 31: Làm game gì bây giờ?

Lịch thi CTDLGT 20133


73636 IT3010 Cấu trúc dữ liệu và giải thuật Thứ năm 14/08/14 Kíp 2 Nhóm 1 70 D3-301 5
73636 IT3010 Cấu trúc dữ liệu và giải thuật Thứ năm 14/08/14 Kíp 2 Nhóm 2 70 D3-401 5

Thứ Sáu, 1 tháng 8, 2014

Bài 29: Học làm game thứ 5 - Space Ship ( Part 1 )

Hi, Lâu nay bận kiếm cơm nuôi cái dạ dày nên ít có thời gian post bài. Cơ mà, nếu mọi người đã đọc được tới đây rồi thì đã có thể độc lập nghiên cứu rồi đấy. Mình thấy nhiều bạn tiến cũng khá xa rồi ( lạc hậu rồi ). Tuy nhiên lúc rảnh rỗi mình vẫn cứ viết bài thôi, vì đây là Blog học tập của mình mà, nếu bạn nào rảnh rỗi thì vào ôn luyện lại cũng không sao, có gì mình không đúng thì chỉ giúp, OK?

Trong bài học làm game thứ 5 này, mình sẽ cùng mọi người làm 1 cái game nho nhỏ, tên là Space Ship, tất nhiên là dạng đơn giản thôi, chứ phức tạp quá thì lại phải trình bày, chia part khá nhọc. Mọi người thông cảm, hi vọng trong tương lai sẽ post được những bài công phu, chuẩn mực hơn.

Bài code này mình nhặt nhạnh trên mạng thôi, ở trang http://www.raywenderlich.com/ thì phải, code trên phiên bản 2.x. Mình đã convert lại sang 3.x theo đúng cách làm ở bài trước, và có sửa đổi thêm thắt một chút để chuẩn hơn. Nói trước là bài này chỉ là một bài mẫu nên code khá thô, không thiết kế thành nhiều lớp phức tạp, chức năng cũng đơn giản, không cầu kỳ. Do đó bạn nào muốn tham khảo 1 bài học làm game chuẩn mực: Thiết kế lớp tốt, nhiều chức năng, màu mè đồ họa, code tối ưu, có khả năng tái sử dụng trong nhiều dự án thì không nên đọc bài này. Bạn có thể tìm được những bài nâng cao của Game này ở trên mạng nhé.

Trong Part 1 này, chúng ta sẽ có thể làm được những công việc sau:

+ Tái sử dụng lại lớp Parallax ở bài trước, bài 25
+ Thiết kế màn chơi cho game

Bắt đầu

B1: Tái sử dụng lớp Parallax

Trước tiên bạn tạo 1 Project mới, SpaceShip
Copy 2 file ParallaxNodeExtras.h, .cpp từ bài 25 vào Class
Mở file ParallaxNodeExtras.cpp lên ta sửa hàm updatePosition 1 chút như sau
Xóa hết đoạn code trong lệnh if(po->getChild() == node)
thay bằng đoạn sau

if(po->getChild() == node)

if (node->getContentSize().width<visibleSize.width)
{
po->setOffset(po->getOffset() + Point(visibleSize.width + node->getContentSize().width,0));

}else {
// Mục đích chỗ này áp dụng cho với những đối tượng có chiều rộng > màn hình sẽ di chuyển đúng po->setOffset(po->getOffset() + Point(node->getContentSize().width*2,0));
}

B2: Thiết kế màn chơi

Mở file HelloWorldScene.h lên, lớp này được thiết kế như sau

#include "ParallaxNodeExtras.h"

USING_NS_CC;

using namespace cocos2d;

class HelloWorld : public cocos2d::Layer
{
private:

SpriteBatchNode * _batchNode; // Batch node để lưu các đối tượng có Action
Sprite * _ship;

    ParallaxNodeExtras *_backgroundNode; // Backround là 1 đối tượng Parallax
    Sprite *_spacedust1; // đám bụi 1
    Sprite *_spacedust2; // đám bụi 2
    Sprite *_planetsunrise; // hành tinh
    Sprite *_galaxy;      // thiên hà
    Sprite *_spacialanomaly;  // chịu
    Sprite *_spacialanomaly2;   // chịu

    // Vector để lưu các thiên thạch, dạng con trỏ
    Vector<Sprite*>* _asteroids;
    // Chỉ số để truy cập
    int _nextAsteroid;
    float _nextAsteroidSpawn;  // Thời gian xuất hiện thiên thạch tiếp theo
    float _nextAsteroidtimer;       // Bộ định thời ( hay bộ đếm thời gian, cứ 1 khoảng thời gian thì làm 1 việc gì đó
    // 1 Vector để lưu đạn Laser của tàu, dạng con trỏ
    Vector<Sprite*>* _shipLasers;
    // index
    int _nextShipLaser;
    
    int _lives; // mạng  

    void update(float dt);

    PhysicsWorld* _world;
    void setPhyWorld(PhysicsWorld* world){ _world = world; };
    
public:
    virtual bool init();

    bool onContactBegin(const PhysicsContact& contact);

    static cocos2d::Scene* createScene();
    
    void menuCloseCallback(Ref* pSender);

    CREATE_FUNC(HelloWorld);    

    //Lấy giá trị random trong 1 khoảng
    float randomValueBetween(float low, float high);
    // Ẩn đi
    void setInvisible(Node * node);
    void onTouchesBegan(const std::vector<Touch*>& touches, Event *event); // Multi Touch
};

#endif // __HELLOWORLD_SCENE_H__

OK, sang bước tiếp theo, mở file HelloWorldScene.cpp, ta thiết kế các function như sau:

À nhớ phần include thêm đoạn code sau

#include "SimpleAudioEngine.h"
using namespace CocosDenshion;

using namespace cocos2d;
using namespace CocosDenshion;
using namespace std;

// Định nghĩa các Tag, cho 3 loại đối tượng
enum 
{
KSHIP,
KLASER,
KASTEROID

};

// Hàm tạo Scene với Physics, đơn giản quá rồi
Scene* HelloWorld::createScene()
{
    Scene *scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
Vect gravity(0.0f, 0.0f); // Vector gia tốc =0
scene->getPhysicsWorld()->setGravity(gravity);  
    HelloWorld *layer = HelloWorld::create();
layer->setPhyWorld(scene->getPhysicsWorld());
    scene->addChild(layer);

    return scene;
}

Hàm HelloWorld::init()

//Nạp Resource

Size visibaleSize = Director::getInstance()->getVisibleSize();
Size winSize = Director::getInstance()->getWinSize();
_batchNode = SpriteBatchNode::create("Sprites.pvr.ccz"); // File này là file ảnh đã mã hóa, tạo bởi TexturePacker nhé, ko mở được bằng trình xem ảnh thông thường, mở = PVR view của soft TexturePacker, hoặc soft tương tự
this->addChild(_batchNode);
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Sprites.plist");  

//Dựng các vật thể

_ship = Sprite::createWithSpriteFrameName("SpaceFlier_sm_1.png");
_ship->setPosition(Point(visibaleSize.width * 0.1, winSize.height * 0.5));
_ship->setTag(KSHIP); // đặt tag để phân biệt trong va chạm
_batchNode->addChild(_ship, 1); // Insert vào BatchNode để thực hiện Action

// Tạo body cho Ship, -23 là offset, vì ảnh cắt ko chuẩn nên thừa ra khoảng trống nhiều, mình phải giảm bớt kích thước body cho chuẩn,
auto shipBody = PhysicsBody::createCircle(_ship->getContentSize().width / 2-23); 
// Ko có cái này thì không thể xử lý va chạm được
shipBody->setContactTestBitmask(0xf); 
// Va chạm tĩnh
shipBody->setDynamic(false);
_ship->setPhysicsBody(shipBody); 
//Tạo parallax node
_backgroundNode = ParallaxNodeExtras::create();
this->addChild(_backgroundNode,-1) ;

// 2 mảng bụi, add vào Parallax
unsigned int dustQuantity = 2;
for(unsigned int i = 0; i < dustQuantity; i++)
{
auto dust = Sprite::create("bg_front_spacedust.png");
dust->setAnchorPoint(Point(0,0.5));
_backgroundNode->addChild(dust,
0, //order (thứ tự) lớp. Order lớn hơn thì nằm trên che khuất lớp có order nhỏ hơn
Point(0.5, 1), // tốc độ
Point( i*(dust->getContentSize().width),winSize.height/2)); // vị trí
}

// Tạo các vật thể khác, add vào Parallax

_planetsunrise = Sprite::create("bg_planetsunrise.png");
_galaxy = Sprite::create("bg_galaxy.png"); _galaxy->setAnchorPoint(Point(0,0.5));
_spacialanomaly = Sprite::create("bg_spacialanomaly.png");
_spacialanomaly2 = Sprite::create("bg_spacialanomaly2.png");
// Tốc độ di chuyển của vật thể
Point dustSpeed = Point(0.5, 0);
Point bgSpeed = Point(0.05, 0);

// PARALLAX Scolling
_backgroundNode->addChild(_galaxy,-1, bgSpeed, Point(0,winSize.height * 0.7));
_backgroundNode->addChild(_planetsunrise, -1 , bgSpeed, Point(600, winSize.height * 0));
_backgroundNode->addChild(_spacialanomaly, -1, bgSpeed, Point(900, winSize.height * 0.3));
_backgroundNode->addChild(_spacialanomaly2, -1, bgSpeed, Point(1500, winSize.height * 0.9));

// Update scene
this->scheduleUpdate();

// Làm 3 cái Particle trang trí cho game lung linh 1 tí
HelloWorld::addChild(ParticleSystemQuad::create("Stars1.plist"));
HelloWorld::addChild(ParticleSystemQuad::create("Stars2.plist"));
HelloWorld::addChild(ParticleSystemQuad::create("Stars3.plist"));
    
// Giờ thì tạo bộ lưu trữ 

    // Bộ lưu mảng thiên thạch
    #define KNUMASTEROIDS 15
    _asteroids = new Vector<Sprite*>(KNUMASTEROIDS);
    for(int i = 0; i < KNUMASTEROIDS; ++i) {
        Sprite *asteroid = Sprite::createWithSpriteFrameName("asteroid.png");
        asteroid->setVisible(false); // ẩn Sprite vừa tạo, nếu không ẩn, bạn sẽ thấy nó dồn hết về tọa độ 0,0
        asteroid->setTag(KASTEROID);  // đặt tag
        _batchNode->addChild(asteroid); // insert vào batch node
        _asteroids->pushBack(asteroid); // insert vào Vector
    }
    
// Bộ lưu mảng đạn Laser    #define KNUMLASERS 5
    _shipLasers = new Vector<Sprite*>(KNUMLASERS);
    for(int i = 0; i < KNUMLASERS; ++i) {
        Sprite *shipLaser = Sprite::createWithSpriteFrameName("laserbeam_blue.png");
        shipLaser->setVisible(false); 
        shipLaser->setTag(KLASER);
        _batchNode->addChild(shipLaser);
        _shipLasers->pushBack(shipLaser);
    }

 this->setTouchEnabled(true);

    
_lives = 3;
_nextShipLaser =0; // index
_nextAsteroid = 0; // index
_nextAsteroidtimer =0;
_nextAsteroidSpawn = 1.6f; // Cứ 1.6 giây thì xuất hiện 1 thiên thạch
    
// Nạp Audio
    SimpleAudioEngine::getInstance()->playBackgroundMusic("SpaceGame.wav",true);
    SimpleAudioEngine::getInstance()->preloadEffect("explosion_large.wav");
    SimpleAudioEngine::getInstance()->preloadEffect("laser_ship.wav");
return true;

Xong phần init() rùi, giờ tiếp tục dựng một số function game nào

Hàm update(float delta)

Point scrollDecrement = Point(5, 0); // Tốc độ di chuyển của Parallax
Size winSize = Director::getInstance()->getWinSize();

// Update vị trí của Parallax
_backgroundNode->setPosition(_backgroundNode->getPosition() - scrollDecrement);
_backgroundNode->updatePosition();

_nextAsteroidtimer+=delta; // Đếm thời gian

if (_nextAsteroidtimer > _nextAsteroidSpawn) { 

_nextAsteroidtimer = 0; // reset bộ đếm timer

// Vị trí random
float randY = randomValueBetween(0.0,winSize.height);
float randDuration = randomValueBetween(2.0,10.0); // Thời gian di chuyển trên màn hình

// Lấy ra sprite tại index _nextAsteroid
Sprite *asteroid = (Sprite *)_asteroids->at(_nextAsteroid);
_nextAsteroid++;

//reset index
if (_nextAsteroid >= _asteroids->size())
_nextAsteroid = 0;

asteroid->stopAllActions(); // dừng mọi Action
// Đặt lên màn hình, và hiển thị
asteroid->setPosition( Point(winSize.width+asteroid->getContentSize().width/2, randY));
asteroid->setVisible(true);

// Đặt body, -15 là hiệu chỉnh kích thước fix bug của ảnh
auto asbody = PhysicsBody::createCircle(asteroid->getContentSize().width/2-15);
// Xử lý va chạm
asbody->setContactTestBitmask(0xf); 
asteroid->setPhysicsBody(asbody);

// Di chuyển với tốc độ và vị trí cho trước, khi di chuyển tới cuối màn hình, gọi hàm setInvisible, để thực hiện 1 số thao tác
asteroid->runAction(Sequence::create(
MoveBy::create(randDuration, Point( - winSize.width - asteroid->getContentSize().width, 0)), 
CallFuncN::create(CC_CALLBACK_1(HelloWorld::setInvisible,this)), 
NULL
));        
}

OK, giờ xây dựng thêm 1 số hàm phụ là có thể chạy game được rồi

void HelloWorld::setInvisible(Node * node) {
node->setVisible(false); // ẩn đi
_world->removeBody(node->getPhysicsBody()); // remove Body
}

// Lấy Random trong khoảng cho trước
float HelloWorld::randomValueBetween(float low, float high) {
return (((float) rand() / RAND_MAX) * (high - low)) + low;
}


OK rồi đó, build thử game xem có chạy nổi không, Ngon lành nhé

 Cũng khá đẹp đấy chứ!

Trong bài này chúng ta đã cùng nghiên cứu 1 số vấn đề nhỏ sau đây:

+ Sử dụng lại lớp đã được thiết kế từ bài trước, có mở rộng 1 chút
+ Sử dụng Vector để lưu trữ dữ liệu, cái này mình thấy dùng khá nhiều, và cũng khá là hay
+ Tạo bộ lưu trữ đối tượng bằng vector, nạp đối tượng vào bộ lưu trữ khi bắt đầu vào game, ẩn chúng đi...
+ Định thời cho 1 sự kiện theo thời gian

Vậy thôi nhỉ, tuy chỉ là những vấn đề nhỏ, nhưng nhiều vấn đề nhỏ kết hợp lại với nhau nhuần nhuyễn sẽ cho ra vấn đề LỚN đấy.

Download CODE+RESOURCE

Mình dừng bài này ở đây. Hẹn gặp lại

Bài 30: Học làm game thứ 5 - Space Ship ( Part 2 - End )

Bài đăng phổ biến