游戏开发学习笔记二:Lua语言学习
前言
本人小白一枚,目前在做Android开发闲暇时间想学习一下游戏开发,觉得很有意思,文中若出现错误之处请大家指出来。共同学习,共同进步。
一、环境搭建
1. Mac OS X 系统上安装
执行命令:
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
2. Window 系统上安装 Lua
window下你可以使用一个叫"SciTE"的IDE环境来执行lua程序,下载地址为:
本站下载地址:LuaForWindows_v5.1.4-46.exe
Github 下载地址:https://github.com/rjpcomputing/luaforwindows/releases
Google Code下载地址 : https://code.google.com/p/luaforwindows/downloads/list
双击安装后即可在该环境下编写 Lua 程序并运行。
你也可以使用 Lua 官方推荐的方法使用 LuaDist:http://luadist.org/
备注:开发工具可以使用sublime+QuickXDev
二、Lua语言基础
1. 入门
- 大家可以去这个网站,很详细的基础知识学习。
Lua语言学习
2. 踩过的坑
- 循环遍历注意区别pairs 与 ipairs
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
区别可参考点这里
- 字符串拼接使用 ..
print("a" .. 'b')
print(157 .. 428)
- 使用 + 拼接字符串会报错
print("error" + 1)
--报错日志
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: in ?
- 使用 # 计算字符串长度
len = "www.runoob.com"
print(#len)
14
- 0为数组的起始索引
- function可以存进变量里面
funcation test1(n){
print(n)
}
test2 = test1
print(test2(1))
- function 可以以匿名函数(anonymous function)的方式通过参数传递
-- function_test2.lua 脚本文件
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
return key.."="..val;
end
);
- Lua 可以对多个变量同时赋值
a, b = 10, 2*x
--等同于
a=10; b=2*x
- 当变量个数和值的个数不一致时,Lua会一直以变量个数为基础
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
3. 线程thread
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
4. userdata(自定义类型)
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用
5. Lua面向对象
1. 介绍
lua没有面向对象,但是有人开发了tolua++ 的第三方软件包,让lua支持面向对象,quick-cocos2dx默认已经集成了这个包。
2. 要点
- 类定义
local User = class('User')
--变量
User.name = 'Jeck'
User.age = 23
User.id = 1
function User:ctor()
print('User create()')
end
--使用User.赋值的话改变的是所有new出来对象的值相当于是静态变量
function User:getName()
return User.name
end
function User:setName(str)
User.name = str
end
--调用self的方法改变的的new出来对象自己的值
function User:getAge()
return self.age
end
function User:setAge(num)
self.age = num
end
return User
注意:代码中的注释请仔细看
- 类使用
local classUser = require('app.scenes.User')
local user1 = classUser.new() --调用构造方法
user1:setName("Merry") --方法调用
local name = user1:getName() --方法调用
- 类继承
local User = require("app.scenes.User")
local Student = class("Student", User)
function Student:crot()
Student.super.cror() --调用父类构造方法
end
return Student
- 方法重载
lua中没有方法重载,无论是否有参数,默认都是同一个方法,调用的时候会调用下面写的那个方法
local User = require("app.scenes.User")
local Student = class("Student", User)
function Student:ctor()
Student.super.ctor()
end
function Student:ctor(name)
print("调用带参构造")
end
return Student
这种情况Student.new()方法会调用到带参构造,如果两个方法互换位置,则会调用无参构造,例如:
local User = require("app.scenes.User")
local Student = class("Student", User)
function Student:ctor(name)
print("调用带参构造")
end
function Student:ctor()
Student.super.ctor()
end
return Student
三、总结
至此已经lua基础已经学完,懂得了基础语法后,更深的层次知识还是需要大家在项目实战中去学习。下面我们将开始学习游戏开发。
参考:
- https://www.runoob.com/lua/lua-tutorial.html
- 腾讯课堂《Cocos2d-Lua手游开发基础篇》