12/08/2018, 09:28

Hướng dẫn tạo game Corona SDK

Bài viết này sẽ hướng dẫn các bạn từng bước làm quen với game engine Corona thông qua việc tạo 1 game đơn giản đó là game Tic-Tac-Toe qua đó giới thiệu về ngôn ngữ Lua, Corona API, và cách sử dụng Corona Simulator để build game. I. Setup môi trường công cụ Để sử dụng corona ẹngine chúng ta ...

Bài viết này sẽ hướng dẫn các bạn từng bước làm quen với game engine Corona thông qua việc tạo 1 game đơn giản đó là game Tic-Tac-Toe qua đó giới thiệu về ngôn ngữ Lua, Corona API, và cách sử dụng Corona Simulator để build game.

I. Setup môi trường công cụ

Để sử dụng corona ẹngine chúng ta cần download Corona SDK trên trang chủ của Corona giải nén ta được một thư mục tên là CoronaSDK, bên trong thư mục có một chương trình là Corona Simulator.

Thông thường chúng ta sẽ chủ yếu làm việc với Corona Simulator để code game và test trên simulator là đủ đáp ứng phần lớn nhu cầu, tuy nhiên Corona cũng có 1 phiên bản mở rộng riêng là Corona Enterprise cung cấp thêm 1 số tính năng đặc biệt, ví dụ như mở rộng các thư viện native, chi tiết các bạn có thể xem trên trang chủ của Corona!

Bản chât Lua là một ngôn ngữ thông dịch và Corona đã cung cấp một bộ thông dịch đi kèm vì vậy bạn có thể thoải mái sử dụng bất cứ text editor nào để tạo các lua scripts. Một số lựa chọn tốt đó là Sublime Text, Eclipse, Visual Studio Code …

II. Làm quen với Corona Simulator

Corona cung cấp 1 công cụ rất mạnh đó là simulator, giúp chúng ta có thể test game một cách trực quan, như đã nói ở trên Lua là một ngôn ngữ thông dịch do vậy mọi sự thay đổi của source code sẽ đưa ra kết quả trên simulator rất nhanh chóng, Corona đưa ra 2 lựa chọn là bỏ qua thay đổi hoặc chạy lại (relauch) chương trình.

Để khởi dộng simulator, chúng ta chạy chương trình Corona Simulator trong thư mục Corona SDK, khi lần đầu chạy chương trình sẽ yêu cầu chúng ta đăng nhập để sử dụng, giao diện sẽ có hình dạng 1 thiết bị có thể android hoặc iOS, chúng ta có thể điều chỉnh trong menu Window - > View As

Ngoài ra phiên bản mới của Corona simulator có cung cấp chức năng Corona Composer cho phép việc dựng sẵn 1 scene qua công cụ kéo thả, để sử dụng các bạn chọn Window - > Corona Composer.

Để tạo 1 project mới chọn File - > New Project, để mở 1 project có sẵn chọn File - > Open Chúng ta tạo 1 project và đặt tên là Tictactoe.

III. Tạo game Tic-tac-toe

tictactoe_simulator.png

Tic-tac-toe là một game nổi tiếng, có rất nhiều phiên bản cũng như biến thể, ở đây người viết sẽ tạo game tic-tac-toe với cách chơi là 2 người chơi trên cùng 1 máy điện thoại, hi vọng rằng sẽ có cơ hội hướng đẫn thêm các phiên bản chơi với AI hoặc 2 người chơi 2 máy khác nhau về sau này.

Để bắt đầu thì mọi project game viết trên corona đều có một số file bắt buộc phải có

build.settings —-> lưu giữ settings cần thiết strong quá trình build

config.lua ——> lưu giữ các onfig của game ví dụ như chế độ hiển thị, các quyển truy cập …

main.lua ——> là entry của chương trình, thường dùng cho việc khởi tạo

Chúng ta sử dụng text editor để tạo lần lượt các file trong thư mục project như sau

build.settings

build.settings
settings = {
   orientation = {
      default = "landscapeRight",
      supported = {
         "landscapeRight",
      },
   },

   iphone = {
      plist = {
         UIStatusBarHidden=true,
      },
   },
}

config.lua

application = {
	content = {
		awidth = 320,
		height = 480,
		scale = 'letterBox',
	}
}

main.lua

display.setStatusBar(display.HiddenStatusBar)

local centerX = display.contentWidth/2
local centerY = display.contentHeight/2

Chạy thử chương trình vào Corona Simulator chọn File => Relauch

Như đã nói ở trên file build.settings lưu trữ các tham số cần thiết trong quá trình build, ở đây ta có thể thấy orientation(màn hình), trạng thái status bar ở iPhone. Config.lua ở đây có các tham số liên quan đến game đó là awidth, height, và scale mode, ở đây 'letterBox' có nghĩa là scale khu vực nội dung để lấp đầy màn hình trong khi vẫn giữ tỉ lệ tương ứng.

Đến phần chính của chúng ta là code game Trước hết cần tạo ra layout của game gồm có: 9 ô vuông bàn cờ, một vài text thông báo Để làm việc đó trước hết ta tạo ra 1 ô vuông bản cờ chúng ta sửa lại file main.lua như sau

local pieceSize = 65

-- Screen Centers
local centerX = display.contentWidth/2
local centerY = display.contentHeight/2

createPiece = function( x, y, size )
	--
	-- create a rectangle first
	--
	local piece = display.newRect( 0, 0, size, size )

	-- move the piece
	piece.x = x
	piece.y = y

	piece:setFillColor( 117, 117, 117, 255 )
	piece:setStrokeColor( 0, 0, 142, 255)
	piece.strokeWidth = 2

	piece.label = display.newText( ', 0, 0, native.systemFont, 48 )
	piece.label.x = piece.x
	piece.label.y = piece.y

	return piece

end

createPiece( centerX, centerY, pieceSize )

Hàm display.newRect giúp ta tạo 1 hình chữ nhật với position và size cho trước Với 2 method setFillColorsetStroke chúng ta tạo được màu sắc cho ô bàn cờ chạy thử chương trình File => Relauch

Tạo ra 9 ô bản cờ như sau thêm method sau vào main.lua

createBoard = function()

	local startX    = centerX - pieceSize  -- Column 1 starts once-piece awidth left of center
	local startY    = centerY - pieceSize  -- Row 1 starts once-piece height above center

	--
	-- 1. Draw the board (3-by-3 grid of text objects over rectangles).
	--
	for row = 1, 3 do
		local y = startY + (row - 1) * pieceSize

		for col = 1, 3 do
			local x = startX + (col - 1) * pieceSize

			local piece =  createPiece( x, y, pieceSize )

		end
	end

endcreatePiece( centerX, centerY, pieceSize )
createBoard()

chạy thử chương trình

Vậy là chúng ta đã tạo được 9 ô bàn cờ, tiếp theo là code phần đặt dấu (O hoặc X theo lượt) sửa lại file main.lua ta thêm function sau

onTouchPiece = function( event )

	local phase = event.phase
	local target = event.target

	if (phase == 'ended') then
		if (target.label.text == ') then

			target.label.text = currentTurn

			if ( checkForWinner( currentTurn ) ) then

				print('Winner is: ' .. currentTurn)
				gameStatusMsg.text = currentTurn .. " wins!"
				currentTurnMsg.isVisible = false
				gameIsRunning = false

				resetGameButton.isVisible = true
				resetGameButtonText.isVisible = true

			elseif ( isBoardFull() ) then

				print("No Winner!")
				gameStatusMsg.text = "Stalemate!"
				currentTurnMsg.isVisible = false
				gameIsRunning = false

				resetGameButton.isVisible = true
				resetGameButtonText.isVisible = true

			end

			if (currentTurn == 'X') then
				currentTurn = 'O'
				target.label:setFillColor( 69, 0, 68, 255 )
			else
				currentTurn = 'X'
				target.label:setFillColor( 0, 173, 0, 255 )
			end

			--currentTurnMsg.text = "Current Turn: " .. currentTurn

		end
	end

end

sửa lại function createPiece

…
	piece:addEventListener( 'touch', onTouchPiece )
	return piece
end

với lênh addEventListener chúng ta đã gắn listener cho sự kiện khi touch vào 1 ô Khi touch vào 1 ô, chúng ta cần kiểm tra lươt đi đó người chơi có dành chiến thắng hay không qua function checkWinner nếu không ai dánh chiến thắng sau lượt đi thì cần kiểm tra đã hết nước đi hay chưa qua function isBoardFull Tiếp theo cần đổi lượt cho những người chơi và cập nhật lại text thông báo lượt X hay O qua biến currentTurnMsg.text

function kiểm tra ngừoi thắng như sau

checkForWinner = function( turn )

	local board = theBoard

	print( 'Check winner' )
	--check all rows
	for i = 1, 3 do
		for j = 1, 3 do
			if ( board[i][j].label.text ~= turn ) then
				break
			elseif ( j == 3 ) then
				return true
			end
		end
	end

	--chek all colunms
	for i = 1, 3 do
		for j = 1, 3 do
			if ( board[j][i].label.text ~= turn ) then
				break
			elseif ( j == 3) then
				return true
			end
		end
	end

	--check all diagonals
	for i = 1, 3 do
		if ( board[i][i].label.text ~= turn ) then
			break
		elseif ( i == 3 ) then
			return true
		end
	end

	for i = 1, 3 do
		if ( board[4-i][i].label.text  ~= turn ) then
		 	break
		elseif ( i == 3) then
			return true
		end
	end

	return false

end

kiểm tra còn nước đi hay không

--
-- ========================
-- check board is full or not
--
isBoardFull = function ()

	local board = theBoard

	for i = 1, 3 do
		for j = 1, 3 do
			if ( board[i][j].label.text == ' ) then
				return false
			end
		end
	end

	return true

end

Nếu đã thấy người thắng, ta đưa ra 1 thông báo qua biến

gameStatusMsg.text = currentTurn .. ‘win’

và show button để reset game

resetGameButton.isVisible = true

File => Relauch để chạy lại game.

Nếu không có người thắng, đẵ hết ô có thể đi, ta cũng đưa ra thông báo và show button reset game Trên đây là những điểm mấu chốt, cụ thể người đọc có thể tham khảo source code ở đây: https://github.com/TienHP/techblog201505

*Build game:

Corona hiện hỗ trợ build game ra 2 nền tảng android & iOS chọn File => Build (ios/android)

Với iOS bạn điền 1 số thông tin cơ bản: tên App, version, quan trọng nhất là Code Signing Identity, đây chính là Provisioning Profile có thể downlaod từ apple. Quá trình build sẽ tạo ra 1 file app, có thể sử dụng itunes để cài đặt trên thiết bị thật.

Với android những thông tin quan trọng gồm có: tên app, version code, package name, key store chi tiết về các thông tin này, bạn đọc có thể tham khảo trên trang chủ của Corona. Quá trình build sẽ tạo ra 1 file apk có thể cài trực tiếp lên điện thoại android.

Như vậy là ta đã tạo được game tictactoe 2 người chơi trên 1 điện thoại. Chúc các bạn chơi vui vẻ thành quả của mình !

0