[Series] Tạo Game 2D hoàn chỉnh bằng React Native

0
Dịch vụ dạy kèm gia sư lập trình
Bài này thuộc phần 1 của 3 phần trong series Phát triển Game 2D bằng React Native

React Native đang dần trở thành nền tảng lập trình cross-platform được ưu chuộng nhất. Đặc biệt là các công ty khởi nghiệp, những người cần tiết kiệm chi phí và thời gian để phát triển sản phẩm.

Trên VNTALKING, mình cũng từng xuất bản một series học lập trình React Native qua ví dụ, bạn có thể xem lại nhé.

Nối tiếp chủ đề về React Native, chúng ta sẽ cùng nhau xây dựng một Game 2D bằng React Native có đồ họa đơn giản.

Sau khi bạn hoàn thành xong series Game 2D bằng React Native này, mình đảm bảo bạn sẽ rất tự tin với kiến thức React native của mình. Bạn sẽ hiểu và biết cách vận dụng component, style, Storing Data, UI animation và nhiều hơn nữa. Hãy cùng mình lần lượt khám phá chúng nhé!

Nội dung chính phần 1 của series:

1. React-Native (RN) với real-native: Sự khác biệt giữa chúng là gì?

  • React-Native là gì, ai là người đứng sau nó?
  • Tại sao bạn nên chọn React Native để phát triển ứng dụng mobile?
  • Những điểm tương đồng và khác biệt chính giữa React Native và ứng dụng native
  • Đôi điều về tính năng Hot Reloading
  • RN compile và hoạt động dưới background như thế nào?

2. Expo là gì?

  • Tìm hiểu Expo Framework.
  • Lịch sử phát triển của Expo framework
  • Ưu và nhược điểm của việc sử dụng Expo qua việc phát triển ứng dụng React-Native

3. Sự giống và khác nhau giữa React và React-Native:

  • States và props
  • Flexbox (cách nó hoạt động trong React-Native)
  • Component và những component built-in quan trọng nhất được xây dựng sẵn.

4. Khởi tạo môi trường:

  • Cài đặt CLI, tạo dự án
  • Khám phá cấu trúc chỉ dẫn
  • Nội dung (icon, phông chữ, nhạc, sfx)

React-Native với Real-native: Sự khác biệt là gì?

Có thể bạn luôn nghĩ rằng các ứng dụng hybrid luôn có hiệu năng kém hơn hẳn so với các ứng dụng được viết theo kiểu native. Nhưng đó là quá khứ rồi.

Về cơ bản, React-Native sử dụng các native block tương tự như là bạn sử dụng trong khi phát triển các ứng dụng gốc với Swift, Java hoặc Kotlin. Sự khác biệt duy nhất là bạn đặt các block này cùng với JavaScript.

Tuy nhiên, có một điều đáng chú ý ở đây là nếu nó chỉ là kiểu wrapper API đơn giản, thì chắc nó không thể thu hút được các lập trình viên trên thế giới như vậy?

Sức mạnh thực sự của React-Native đến từ việc cung cấp cho bạn một loạt tính năng cải tiến trải nghiệm cho nhà phát triển. Chẳng hạn như tính năng Live Reloading, cho phép bạn tải lại ứng dụng ngay khi bạn vừa lưu code, tiết kiệm thời gian phải build lại và chuyển tới màn hình cần kiểm tra.

Hoặc Hot Reloading đưa các thay đổi của đoạn mã bạn vừa viết mà không cần cài lại lại ứng dụng và làm mất trạng thái lúc trước.

Mình cũng đã có hẳn bài viết so sánh chi tiết sự khác nhau giữa React Native và ứng dụng Native tại đây: So sánh giữa Hybrid và Native App – Cái nào tốt hơn?

Expo là gì?

Nếu bạn để ý, ngay trong tài liệu chính thức của nhà phát hành React Native, họ cũng khuyến khích hoặc luôn có mã code minh hoặc nếu bạn sử dụng Expo. Điều đó cho thấy sự phổ biến của Expo, điều mà bạn nên cân nhắc khi bắt đầu dự án.

Expo là một SDK mà xuất phát điểm như một bộ toolkit không chính thức. Nhưng sau đó nó đã phát triển thành một dự án lớn hơn nhiều với các tính năng rất quan trọng như:

  • Cập nhật ứng dụng qua OTA (tức là cập nhật ứng dụng trực tiếp mà không cần qua App Store),
  • Social authentication
  • Các tính năng liên quan Camera
  • Push Notification
  • Và còn nhiều dịch vụ bên thứ 3 phục vụ cho nhu cầu phát triển ứng dụng của bạn, đặc biệt là hoàn toàn miễn phí!

Ngoài ra, Expo còn cung cấp thêm dịch vụ online playground (Snacks), nơi mà bạn có thể chạy thử ngay lập tức ứng dụng của người khác mà không cần phải build và chạy trên máy tính của bạn.

Tuy nhiên, điểm cốt lõi của Expo là khả năng mở rộng React-Native với các component có sẵn. Đấy là còn chưa kể đội ngũ phát triển Expo rất cẩn thận trong việc viết tài liệu, nên bạn hoàn toàn yên tâm mà tìm hiểu Expo.

Nhược điểm duy nhất mà mình thấy đó là kích thước file sau khi build khá là lớn. Ví dụ, với ứng dụng đơn giản nhất như hello world mà file APK đã có kích thước tận ~30MB.

Giới thiệu ứng dụng sẽ xây dựng trong series này

Để minh họa cho những kiến thức React Native sẽ áp dụng, chúng ta sẽ cùng nhau xây dựng một mini game có tên là “ColorBlinder”.

Màn hình chính của game khá đơn giản: đó là những ô vuông có màu giống nhau, trừ một ô. Nhiệm vụ của người chơi là chạm vào ô có màu khác đó càng nhanh càng tốt.

Luật chơi của game chỉ có vậy thôi. Rất đơn giản phải không?!

[Series] Xây dựng Game hoàn chỉnh bằng React Native

Tạo dự án và thiết lập môi trường phát triển

Việc đầu tiên là bạn cần cài đặt expo CLI. Công cụ cho phép đơn giản hóa việc tạo dự án React Native.

npm i -g expo-cli

sau khi cài đặt xong expo-CLI, hãy sử dụng công cụ này để tạo dự án, bạn gõ lệnh: expo init colorblinder và làm theo hướng dẫn.

expo init colorblinder

## choose `empty` template for this project
## choose `managed` workflow
## write in `ColorBlinder`
## if it asks, use yarn to install dependencies. (If you don’t have it, [be sure to check it out](https://yarnpkg.com/), it’s a fast alternative to npm)

cd colorblinder
npm start ## or yarn start if you have yarn, or expo start, whichever you prefer

Bạn cứ làm theo hướng dẫn của trình CLI này là sẽ ổn, nó sẽ tự động thiết lập môi trường cần thiết cho phát triển ứng dụng như cài sẵn Expo Client, tự động mở Chrome tab và kết nối tới máy ảo.

Cấu trúc dự án Game 2D bằng React Native

Ok, việc tiếp theo là chúng ta cùng nhau ngó qua cấu trúc thư mục dự án để hiểu rõ hơn cách tổ chức mã nguồn mà expo-CLI đã tạo sẵn cho mình.

├── App.js
├── app.json
├── assets
│   ├── icon.png
│   └── splash.png
└── package.json
# a few more files that we don’t care about yet

Cấu trúc cũng đơn giản đúng không? Nói chung cũng không có gì đặc biệt, bạn có thể đọc lại bài viết mà mình đã giải thích chi tiết chức năng của chúng:.Tổ chức mã nguồn tối ưu cho dự án React Native lớn

Bắt đầu với React Native

Cũng giống như mọi ứng dụng, việc bạn cần phải navigate giữa các màn hình là điều cơ bản nhất rồi. React Native có một thư viện hỗ trợ việc này, đó là react-navigation

Để sử dụng thư viện này, tất nhiên chúng ta cần phải cài đặt nó rồi:

yarn add react-navigation
## Nếu bạn không có yarn, sử dụng npm thay thế: npm install react-navigation

Tiếp theo, chúng ta tạo thư mục components để chứa các components bạn tạo sau này (header, grid…) và thư mục screens để chứa màn hình như: màn hình home, game…

OK, giờ thì chúng ta tạo Home.js có nội dung như sau:

import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default class Home extends Component {
 render() {
   return (
     <View style={styles.container}>
       <Text>ColorBlinder - Home screen!</Text>
     </View>
   );
 }
}

const styles = StyleSheet.create({
 container: {
   flex: 1,
   backgroundColor: '#fff',
   alignItems: 'center',
   justifyContent: 'center',
 },
});

Nói chung, dù là component hay screen thì nó đều extend từ React.Component class cả, bản chất chúng đều là component cả.

Với mỗi component, chúng ta tạm hiểu là có 2 thành phần: một là phần logic để build ra html và phần style cho chúng.

Trong React native sẽ có những component built-in sẵn như: Text, View… nó tương ứng với các thẻ span, div vậy.

Còn về style thì nó chỉ là react native đã wrapper lại từ CSS mà thôi, dù có pháp nhìn có khác đôi chút nhưng cơ bản là giống với  CSS mà bạn đã quá quen thuộc rồi.

Định nghĩa Router

Chúng ta cần định nghĩa router cho màn hình Home.js trong App.js

import { createStackNavigator, createAppContainer } from "react-navigation";
import Home from './screens/Home';

const AppNavigator = createStackNavigator({
 Home: {
   screen: Home
 }
});

export default createAppContainer(AppNavigator);

Mình đang sử dụng react-navigation để tạo một stack mới, và trả về một component React mà mình có thể render.

Giờ thì chạy thử ứng dụng thôi.react-native run-android

Kết quả sẽ được màn hình như dưới đây:
React-Native-Mobile-App-Screen-ColorblinderBạn có thấy có một thanh action bar phía trên cùng màn hình không? Vì chúng ta đang sử dụng các thiết lập mặc định nên nó xuất hiện như vậy. Nếu là ứng dụng thường thì không sao nhưng với game thì người ta hay để chế độ toàn màn hình để có nhiều không gian hiển thị đồ họa game hơn.

Để bỏ thanh action bar đó, bạn mở App.js và thêm đoạn code sau:

const AppNavigator = createStackNavigator(
 {
   Home: {
     screen: Home
   }
 },
 {
   initialRouteName: "Home",
   headerMode: "none",
 }
);

Vậy là ẩn được thành action bar rồi đấy.

Sử dụng font tùy chỉnh

Thông thường các game đều sử dụng những font chữ kiểu lạ lạ, rất ít khi sử dụng mấy font truyền thống như roboto hay Arial…

Để có thể sử dụng các font chữ tùy chỉnh, bạn mở App.js và thêm đoạn code sau:

import React, { Component } from 'react'
import { AppLoading, Font } from 'expo';
import Routes from './screens/Routes'

class App extends Component {
 state = {
   isFontLoaded: false
 }

 async componentDidMount() {
   await Font.loadAsync({
     'dogbyte': require('./assets/fonts/dogbyte.otf'),
   });
   this.setState({ isFontLoaded: true })
 }

 render() {
   if(!this.state.isFontLoaded) {
     return <AppLoading />
   } else {
     return <Routes />
   }
 }
}

export default App;

Ok, vậy là xong rồi đấy.

colorblinder-react-native-homescreen

Mời bạn tải mã nguồn đầy đủ của bài viết này tại đây

Hẹn gặp lại bạn ở bài tiếp theo trong series Game 2D bằng React Native, chờ nhé!

Xem tiếp các bài trong Series
Phần kế tiếp: Phần 2. Xây dựng màn hình Home của Game 2D
Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcReact Native – Cách đổi tên Package name chuẩn chỉ, không lỗi
Bài tiếp theoThuật toán đảo ngược chuỗi liên kết (Linked List)
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Thông báo