程序员

游戏开发学习笔记二:Lua语言学习

2019-04-26  本文已影响7人  Iamsoulmate

前言

本人小白一枚,目前在做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. 入门
2. 踩过的坑
  1. 循环遍历注意区别pairs 与 ipairs
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

区别可参考点这里

  1. 字符串拼接使用 ..
print("a" .. 'b')
print(157 .. 428)
  1. 使用 + 拼接字符串会报错
print("error" + 1)
--报错日志
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
  1. 使用 # 计算字符串长度
len = "www.runoob.com"
print(#len)
14
  1. 0为数组的起始索引
  2. function可以存进变量里面
funcation test1(n){
    print(n)
}
test2 = test1
print(test2(1))
  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
);
  1. Lua 可以对多个变量同时赋值
a, b = 10, 2*x 
--等同于
a=10; b=2*x
  1. 当变量个数和值的个数不一致时,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. 要点
  1. 类定义
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

注意:代码中的注释请仔细看

  1. 类使用
local classUser = require('app.scenes.User')
local user1 = classUser.new() --调用构造方法
user1:setName("Merry")       --方法调用
local name = user1:getName() --方法调用
  1. 类继承
local User = require("app.scenes.User")
local Student = class("Student", User)

function Student:crot()
    Student.super.cror()    --调用父类构造方法
end

return Student
  1. 方法重载
    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基础已经学完,懂得了基础语法后,更深的层次知识还是需要大家在项目实战中去学习。下面我们将开始学习游戏开发。
参考:

  1. https://www.runoob.com/lua/lua-tutorial.html
  2. 腾讯课堂《Cocos2d-Lua手游开发基础篇》

PS:本人也是小白学习,文中若有错误请指出来。谢谢!!!

上一篇下一篇

猜你喜欢

热点阅读