这是第一版
require ("Data/MJCardData");
ModelCtrl = {};
local this = ModelCtrl;
local transform;
local gameObject;
local modelBehavior;
local modelParent;
local MJName = {};
--麻将桌控制器
MJModelCtrObj = nil;
MJModelBehaviour = nil;
--升降机
MJ_UPDOWN = nil;
--高亮材质
Desk_Hight = nil;
--普通材质
Desk_Low = nil;
--跑马灯东南西北
DongFlag = nil;
NanFlag = nil;
XiFlag = nil;
BeiFlag = nil;
--牌池
CardContent = {};
--牌面Sprite E开始是吃碰杠和牌
local PaiMianSprite = {"MJ_EDong","MJ_EXi","MJ_ENan","MJ_EBei","MJ_EZhong","MJ_EFa","MJ_EBai",
"MJ_Dong","MJ_Xi","MJ_Xan","MJ_Bei","MJ_Zhong","MJ_Fa","MJ_Bai",
"MJ_PaiDi","MJ_EPaiBei","MJ_EPaiDi",
"MJ_ETiao_1","MJ_ETiao_2","MJ_ETiao_3","MJ_ETiao_4","MJ_ETiao_5","MJ_ETiao_6","MJ_ETiao_7","MJ_ETiao_8","MJ_ETiao_9",
"MJ_Tiao_1","MJ_Tiao_2","MJ_Tiao_3","MJ_Tiao_4","MJ_Tiao_5","MJ_Tiao_6","MJ_Tiao_7","MJ_Tiao_8","MJ_Tiao_9",
"MJ_ETong_1","MJ_ETong_2","MJ_ETong_3","MJ_ETong_4","MJ_ETong_5","MJ_ETong_6","MJ_ETong_7","MJ_ETong_8","MJ_ETong_9",
"MJ_Tong_1","MJ_Tong_2","MJ_Tong_3","MJ_Tong_4","MJ_Tong_5","MJ_Tong_6","MJ_Tong_7","MJ_Tong_8","MJ_Tong_9",
"MJ_EWan_1","MJ_EWwan_2","MJ_EWwan_3","MJ_EWwan_4","MJ_EWwan_5","MJ_EWwan_6","MJ_EWwan_7","MJ_EWwan_8","MJ_EWwan_9",
"MJ_Wan_1","MJ_Wan_2","MJ_Wan_3","MJ_Wan_4","MJ_Wan_5","MJ_Wan_6","MJ_Wan_7","MJ_Wan_8","MJ_Wan_9",
};
PaiMianSprList = {};
--牌池四个容器
Cards_Dong = nil;
CardDContent = {};
Cards_Xi = nil;
CardXContent = {};
Cards_Nan = nil;
CardNContent = {};
Cards_Bei = nil;
CardBContent = {};
--玩家手牌
Player_Dong = nil;
Player_Nan = nil;
Player_Xi = nil;
Player_Bei = nil;
HandCard_Dong = {};
HandCard_Nan = {};
HandCard_Xi = {};
HandCard_Bei = {};
--打出去的牌和容器
Show_Dong = nil;
Show_DContent = {};
Show_Nan = nil;
Show_NContent = {};
Show_Xi = nil;
Show_XContent = {};
Show_Bei = nil;
Show_BContent = {};
--麻将尺寸,X为长,Y为高,Z为宽
MJModelSize = nil;
--构建函数--
function ModelCtrl.New()
logWarn("ModelCtrl.New--->>");
return this;
end
function ModelCtrl.Awake()
logWarn("ModelCtrl.Awake--->>");
resMgr:LoadPrefab('MJPrefabs',{"MJModel"},this.OnLoadFinshed);
resMgr:LoadSprites('MJPrefabs',PaiMianSprite,this.LoadSpriteFinshed);
StartCoroutine(this.Test);
end
--加载麻将桌的材质球
function ModelCtrl.OnLoadMaterial(objs)
Desk_Hight = objs[1];
Desk_Low = objs[0];
this.InitPanel();
this.InitEvent();
end
--加载麻将桌资源
function ModelCtrl.OnLoadFinshed(objs)
gameObject = newObject(objs[0]);
gameObject.name = "MJModel";
transform = gameObject.transform;
MJModelCtrObj = transform:Find("MJModelCtr").gameObject;
MJ_UPDOWN = MJModelCtrObj.transform:Find("MJ_UPDOWN").gameObject;
MJModelBehaviour = gameObject:AddComponent(typeof(LuaFramework.LuaBehaviour));
resMgr:LoadMaterial('MJMaterial',{"MJ_Desk_D","MJ_Desk_H"},this.OnLoadMaterial);
end
--加载麻将牌面
function ModelCtrl.LoadSpriteFinshed(objs)
print("加载图片",#PaiMianSprite);
for i=1,#PaiMianSprite do
PaiMianSprList[PaiMianSprite[i]] = objs[i - 1];
end
end
--初始化Panel,相关变量的赋值
function ModelCtrl:InitPanel()
DongFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Dong").gameObject;
NanFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Nan").gameObject;
XiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Xi").gameObject;
BeiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Bei").gameObject;
DongFlag:GetComponent('Renderer').material = Desk_Hight;
NanFlag:GetComponent('Renderer').material = Desk_Low;
Player_Dong = transform:Find("HandCards/Player_Dong");
Player_Nan = transform:Find("HandCards/Player_Nan");
Player_Xi = transform:Find("HandCards/Player_Xi");
Player_Bei = transform:Find("HandCards/Player_Bei");
Show_Dong = transform:Find("ShowCards/Show_Dong");
Show_Xi = transform:Find("ShowCards/Show_Xi");
Show_Nan = transform:Find("ShowCards/Show_Nan");
Show_Bei = transform:Find("ShowCards/Show_Bei");
Cards_Dong = MJ_UPDOWN.transform:GetChild(0);
Cards_Nan = MJ_UPDOWN.transform:GetChild(1);
Cards_Xi = MJ_UPDOWN.transform:GetChild(2);
Cards_Bei = MJ_UPDOWN.transform:GetChild(3);
end
--初始化事件,相关事件的注册
function ModelCtrl.InitEvent()
for k,v in pairs(CardData) do
if v then
table.insert(MJName,v);
end
end
this.LoadCard();
end
function ModelCtrl.LoadCard()
resMgr:LoadPrefab("MJMesh",MJName,this.LoadCardFinshed);
end
--加载麻将模型并实例化出136张牌
function ModelCtrl.LoadCardFinshed(objs)
for i=1,#MJName do
for j=1,4 do
local go = newObject(objs[i - 1]);
go.name = MJName[i];
if MJModelSize == nil then
MJModelSize = go:GetComponent('Renderer').bounds.size*0.8;
end
if j == 1 then
this.Card2Desk("Dong",go);
elseif j == 2 then
this.Card2Desk("Nan",go);
elseif j == 3 then
this.Card2Desk("Xi",go);
else
this.Card2Desk("Bei",go);
end
end
end
end
--将麻将放到指定牌池
--Pos指定将麻将放到(东西南北)的位置,go为麻将
function ModelCtrl.Card2Desk(Pos,go)
if Pos == "Dong" then
CardDContent[#CardDContent + 1] = go.name;
go.transform:SetParent(Cards_Dong.transform);
if #CardDContent < 18 then
go.transform.localPosition = Vector3.New(0,(9 - #CardDContent) * MJModelSize.z,0);
else
go.transform.localPosition = Vector3.New(0,(9 - (#CardDContent - 17)) * MJModelSize.z,MJModelSize.y);
end
go.transform.localEulerAngles = Vector3.New(180,0,0);
elseif Pos == "Nan" then
CardNContent[#CardNContent + 1] = go.name;
go.transform:SetParent(Cards_Nan.transform);
if #CardDContent < 18 then
go.transform.localPosition = Vector3.New((#CardDContent - 9) * MJModelSize.z,0,0);
else
go.transform.localPosition = Vector3.New((#CardDContent - 17 - 9) * MJModelSize.z,0,MJModelSize.y);
end
go.transform.localEulerAngles = Vector3.New(180,0,90);
elseif Pos == "Xi" then
CardXContent[#CardXContent + 1] = go.name;
go.transform:SetParent(Cards_Xi.transform);
if #CardDContent < 18 then
go.transform.localPosition = Vector3.New(0,(#CardDContent - 9) * MJModelSize.z,0);
else
go.transform.localPosition = Vector3.New(0,(#CardDContent - 17 - 9) * MJModelSize.z,MJModelSize.y);
end
go.transform.localEulerAngles = Vector3.New(180,0,180);
else
CardBContent[#CardBContent + 1] = go.name;
go.transform:SetParent(Cards_Bei.transform);
if #CardDContent < 18 then
go.transform.localPosition = Vector3.New((#CardDContent - 9) * MJModelSize.z,0,0);
else
go.transform.localPosition = Vector3.New((#CardDContent - 17 - 9) * MJModelSize.z,0,MJModelSize.y);
end
go.transform.localEulerAngles = Vector3.New(0,180,270);
end
go.transform.localScale = Vector3.one*0.8;
end
function ModelCtrl.Test()
-- WaitForSeconds(5);
-- ModelCtrl.ShowCard("Bei",1);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",2);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",3);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",4);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",5);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",6);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",7);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",8);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",9);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",10);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",11);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",12);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",13);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",14);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",15);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",16);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",17);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",18);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",19);
WaitForSeconds(5);
this.Card2Hand()
end
--打牌到牌堆
--pos将牌打出去的位置,是哪个玩家出的牌
--carddata中的索引值
function ModelCtrl.ShowCard(pos,index)
if pos == "Dong" then
for k,v in pairs(HandCard_Dong) do
if v == MJName[index] then
this.SetShowCardPos(Show_Dong,Show_DContent,v);
table.remove(HandCard_Dong,k);
end
end
return;
elseif pos == "Nan" then
for k,v in pairs(HandCard_Nan) do
if v == MJName[index] then
this.SetShowCardPos(Show_Nan,Show_NContent,v);
table.remove(HandCard_Nan,k);
end
end
return;
elseif pos == "Xi" then
for k,v in pairs(HandCard_Xi) do
if v == MJName[index] then
this.SetShowCardPos(Show_Xi,Show_XContent,v);
table.remove(HandCard_Xi,k);
end
end
return;
else
for k,v in pairs(CardBContent) do
if v == MJName[index].."_4" then
this.SetShowCardPos(Show_Bei,Show_BContent,v);
table.remove(HandCard_Bei,k);
end
end
return;
end
end
--设置打出去的牌的位置
--trf将牌放到的位置,存储的容器,牌的名字
function ModelCtrl.SetShowCardPos(trf,tab,name)
--将牌由手牌位置飞到目标位置
tab[#tab + 1] = name;
local targetPos = nil;
local residue = #tab % 6;
local quotient = (#tab - 1)/ 6;
local temp = string.format("%d",quotient);
if residue == 0 then
residue = 6;
end
targetPos = Vector3.New(MJModelSize.x * temp,(3 - residue + 0.5) * MJModelSize.z,0);
CardContent[name].transform:SetParent(trf);
local path = {CardContent[name].transform.localPosition,targetPos};
local seq = DOTween.Sequence();
seq:Append(CardContent[name].transform:DOLocalPath(path,0.2));
seq:PlayForward();
end
this.HandData = {
26,39,19,39,35,36,23,16,11,16,37,15,25
}
--发牌到玩家手牌
function ModelCtrl.Card2Hand()
table.sort(this.HandData,function(a,b) return a < b end);
for i=1,#this.HandData do
--模拟从牌池东开始给玩家发牌
--首先在东内获取服务器给的牌,没有则在南中获取,依次获取
--获取到后将牌移动到玩家手中
local temp = this.HandData[i] - 10;
print("数据=",temp.."名字=",CardData[temp]);
if CardDContent[CardData[temp]] then
CardDContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardNContent[CardData[temp]] then
CardNContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardXContent[CardData[temp]] then
CardXContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardBContent[CardData[temp]] then
CardBContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
else
logError("没有这种牌");
end
end
end
function ModelCtrl.SetHandCardPos()
end
第二版
require ("Data/MJCardData");
ModelCtrl = {};
local this = ModelCtrl;
local transform;
local gameObject;
local modelBehavior;
local modelParent;
local MJName = {};
--麻将桌控制器
MJModelCtrObj = nil;
MJModelBehaviour = nil;
--升降机
MJ_UPDOWN = nil;
--高亮材质
Desk_Hight = nil;
--普通材质
Desk_Low = nil;
--跑马灯东南西北
DongFlag = nil;
NanFlag = nil;
XiFlag = nil;
BeiFlag = nil;
--牌池
CardContent = {};
--牌面Sprite E开始是吃碰杠和牌
local PaiMianSprite = {"MJ_EDong","MJ_EXi","MJ_ENan","MJ_EBei","MJ_EZhong","MJ_EFa","MJ_EBai",
"MJ_Dong","MJ_Xi","MJ_Xan","MJ_Bei","MJ_Zhong","MJ_Fa","MJ_Bai",
"MJ_PaiDi","MJ_EPaiBei","MJ_EPaiDi",
"MJ_ETiao_1","MJ_ETiao_2","MJ_ETiao_3","MJ_ETiao_4","MJ_ETiao_5","MJ_ETiao_6","MJ_ETiao_7","MJ_ETiao_8","MJ_ETiao_9",
"MJ_Tiao_1","MJ_Tiao_2","MJ_Tiao_3","MJ_Tiao_4","MJ_Tiao_5","MJ_Tiao_6","MJ_Tiao_7","MJ_Tiao_8","MJ_Tiao_9",
"MJ_ETong_1","MJ_ETong_2","MJ_ETong_3","MJ_ETong_4","MJ_ETong_5","MJ_ETong_6","MJ_ETong_7","MJ_ETong_8","MJ_ETong_9",
"MJ_Tong_1","MJ_Tong_2","MJ_Tong_3","MJ_Tong_4","MJ_Tong_5","MJ_Tong_6","MJ_Tong_7","MJ_Tong_8","MJ_Tong_9",
"MJ_EWan_1","MJ_EWwan_2","MJ_EWwan_3","MJ_EWwan_4","MJ_EWwan_5","MJ_EWwan_6","MJ_EWwan_7","MJ_EWwan_8","MJ_EWwan_9",
"MJ_Wan_1","MJ_Wan_2","MJ_Wan_3","MJ_Wan_4","MJ_Wan_5","MJ_Wan_6","MJ_Wan_7","MJ_Wan_8","MJ_Wan_9",
};
PaiMianSprList = {};
--牌池四个容器
Cards_Dong = nil;
CardDContent = {};
Cards_Xi = nil;
CardXContent = {};
Cards_Nan = nil;
CardNContent = {};
Cards_Bei = nil;
CardBContent = {};
--玩家手牌
Player_Dong = nil;
Player_Nan = nil;
Player_Xi = nil;
Player_Bei = nil;
HandCard_Dong = {};
HandCard_Nan = {};
HandCard_Xi = {};
HandCard_Bei = {};
--打出去的牌和容器
Show_Dong = nil;
Show_DContent = {};
Show_Nan = nil;
Show_NContent = {};
Show_Xi = nil;
Show_XContent = {};
Show_Bei = nil;
Show_BContent = {};
--麻将尺寸,X为长,Y为高,Z为宽
MJModelSize = nil;
--构建函数--
function ModelCtrl.New()
logWarn("ModelCtrl.New--->>");
return this;
end
function ModelCtrl.Awake()
logWarn("ModelCtrl.Awake--->>");
resMgr:LoadPrefab('MJPrefabs',{"MJModel"},this.OnLoadFinshed);
resMgr:LoadSprites('MJPrefabs',PaiMianSprite,this.LoadSpriteFinshed);
StartCoroutine(this.Test);
end
--加载麻将桌的材质球
function ModelCtrl.OnLoadMaterial(objs)
Desk_Hight = objs[1];
Desk_Low = objs[0];
this.InitPanel();
this.InitEvent();
end
--加载麻将桌资源
function ModelCtrl.OnLoadFinshed(objs)
gameObject = newObject(objs[0]);
gameObject.name = "MJModel";
transform = gameObject.transform;
MJModelCtrObj = transform:Find("MJModelCtr").gameObject;
MJ_UPDOWN = MJModelCtrObj.transform:Find("MJ_UPDOWN").gameObject;
MJModelBehaviour = gameObject:AddComponent(typeof(LuaFramework.LuaBehaviour));
resMgr:LoadMaterial('MJMaterial',{"MJ_Desk_D","MJ_Desk_H"},this.OnLoadMaterial);
end
--加载麻将牌面
function ModelCtrl.LoadSpriteFinshed(objs)
print("加载图片",#PaiMianSprite);
for i=1,#PaiMianSprite do
PaiMianSprList[PaiMianSprite[i]] = objs[i - 1];
end
end
--初始化Panel,相关变量的赋值
function ModelCtrl:InitPanel()
DongFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Dong").gameObject;
NanFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Nan").gameObject;
XiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Xi").gameObject;
BeiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Bei").gameObject;
DongFlag:GetComponent('Renderer').material = Desk_Hight;
NanFlag:GetComponent('Renderer').material = Desk_Low;
Player_Dong = transform:Find("HandCards/Player_Dong");
Player_Nan = transform:Find("HandCards/Player_Nan");
Player_Xi = transform:Find("HandCards/Player_Xi");
Player_Bei = transform:Find("HandCards/Player_Bei");
Show_Dong = transform:Find("ShowCards/Show_Dong");
Show_Xi = transform:Find("ShowCards/Show_Xi");
Show_Nan = transform:Find("ShowCards/Show_Nan");
Show_Bei = transform:Find("ShowCards/Show_Bei");
Cards_Dong = MJ_UPDOWN.transform:GetChild(0);
Cards_Nan = MJ_UPDOWN.transform:GetChild(1);
Cards_Xi = MJ_UPDOWN.transform:GetChild(2);
Cards_Bei = MJ_UPDOWN.transform:GetChild(3);
end
--初始化事件,相关事件的注册
function ModelCtrl.InitEvent()
for k,v in pairs(CardData) do
if v then
table.insert(MJName,v);
end
end
this.LoadCard();
end
function ModelCtrl.LoadCard()
resMgr:LoadPrefab("MJMesh",MJName,this.LoadCardFinshed);
end
local KaiJuData = {pos = "Dong", index = 3};
--加载麻将模型并实例化出一张牌来填充牌池
--根据房间信息和KaiJuData确定牌池的张数和码牌的起点
function ModelCtrl.LoadCardFinshed(objs)
logWarn("根据房间信息确定牌池的张数---未完成");
local CardNum = 136;
local Cards = {};
for i=1,136 do
go = newObject(objs[0]);
table.insert(Cards,go);
end
--模型真是尺寸
MJModelSize = go:GetComponent('Renderer').bounds.size;
this.Card2Desk(Cards);
-- for i=1,#MJName do
-- for j=1,4 do
-- local go = newObject(objs[i - 1]);
-- go.name = MJName[i];
-- if MJModelSize == nil then
-- MJModelSize = go:GetComponent('Renderer').bounds.size*0.8;
-- end
-- if j == 1 then
-- this.Card2Desk("Dong",go);
-- elseif j == 2 then
-- this.Card2Desk("Nan",go);
-- elseif j == 3 then
-- this.Card2Desk("Xi",go);
-- else
-- this.Card2Desk("Bei",go);
-- end
-- end
-- end
end
--将麻将放到指定牌池
--data可以确定一行牌池放多少牌,可以确定码牌的起点
--Cards为即将填充到牌池的所有麻将对象
function ModelCtrl.Card2Desk(Cards)
logWarn("根据data确定每行的排数和起点---未完成");
--缩放比列(因牌桌放不下全部麻将,加入缩放比例)
local modelsize = MJModelSize * 1.02;
local ratio = Vector3.one * 0.8;
local Pos = "Dong";
local CardNums = 17;
--string.format("%d",arg0)向下取整
--local CentreIndex = string.format("%d",CardNums / 2);
local CentreIndex = math.ceil(CardNums / 2);
--index = 筛子点数加1
local index = 1;
if Pos == "Dong" then
for i=1, CardNums - index + 1 do
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
local go1 = CardContent[2 * i - 1];
local go2 = CardContent[2 * i];
this.SetDeskCardTRF(go1,go2,Cards_Dong);
local temp = index + i - 1;
go1.transform.localPosition = Vector3.New(0,(temp - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(temp - CentreIndex) * modelsize.z,0);
end
for i=1,CardNums do
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
local go1 = CardContent[2 * i - 1 + 2 * (CardNums - index + 1)];
local go2 = CardContent[2 * i + 2 * (CardNums - index + 1)];
this.SetDeskCardTRF(go1,go2,Cards_Nan);
go1.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z ,0);
end
for i=1,CardNums do
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
local go1 = CardContent[2 * i - 1 + 2 * (CardNums - index + 1) + 2 * CardNums];
local go2 = CardContent[2 * i + 2 * (CardNums - index + 1) + 2 * CardNums];
this.SetDeskCardTRF(go1,go2,Cards_Xi);
go1.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,0);
end
for i=1,CardNums do
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
local go1 = CardContent[2 * i - 1 + 2 * (CardNums - index + 1) + 4 * CardNums];
local go2 = CardContent[2 * i + 2 * (CardNums - index + 1) + 4 * CardNums];
this.SetDeskCardTRF(go1,go2,Cards_Bei);
go1.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,0);
end
for i=1,index - 1 do
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
table.insert(CardContent,Cards[1]);
table.remove(Cards,1);
local go1 = CardContent[ 8 * CardNums - 2 * index + (2 * i - 1)];
local go2 = CardContent[8 * CardNums - 2 * index + 2 * i];
this.SetDeskCardTRF(go1,go2,Cards_Dong);
go1.transform.localPosition = Vector3.New(0,(i - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i - CentreIndex - 1) * modelsize.z,0);
end
end
Cards_Dong.transform.localScale = ratio;
Cards_Nan.transform.localScale = ratio;
Cards_Xi.transform.localScale = ratio;
Cards_Bei.transform.localScale = ratio;
end
--设置牌池麻将的transform
function ModelCtrl.SetDeskCardTRF(go1,go2,bankerID)
local parent = MJ_UPDOWN.transform:GetChild(bankerID % 4);
go1.transform:SetParent(parent);
go1.transform.localEulerAngles = Vector3.zero;
go1.transform.localScale = Vector3.one;
go2.transform:SetParent(parent);
go2.transform.localEulerAngles = Vector3.zero;
go2.transform.localScale = Vector3.one;
end
function ModelCtrl.Test()
-- WaitForSeconds(5);
-- ModelCtrl.ShowCard("Bei",1);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",2);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",3);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",4);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",5);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",6);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",7);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",8);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",9);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",10);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",11);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",12);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",13);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",14);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",15);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",16);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",17);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",18);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",19);
WaitForSeconds(5);
this.Card2Hand()
end
--打牌到牌堆
--pos将牌打出去的位置,是哪个玩家出的牌
--carddata中的索引值
function ModelCtrl.ShowCard(pos,index)
if pos == "Dong" then
for k,v in pairs(HandCard_Dong) do
if v == MJName[index] then
this.SetShowCardPos(Show_Dong,Show_DContent,v);
table.remove(HandCard_Dong,k);
end
end
return;
elseif pos == "Nan" then
for k,v in pairs(HandCard_Nan) do
if v == MJName[index] then
this.SetShowCardPos(Show_Nan,Show_NContent,v);
table.remove(HandCard_Nan,k);
end
end
return;
elseif pos == "Xi" then
for k,v in pairs(HandCard_Xi) do
if v == MJName[index] then
this.SetShowCardPos(Show_Xi,Show_XContent,v);
table.remove(HandCard_Xi,k);
end
end
return;
else
for k,v in pairs(CardBContent) do
if v == MJName[index].."_4" then
this.SetShowCardPos(Show_Bei,Show_BContent,v);
table.remove(HandCard_Bei,k);
end
end
return;
end
end
--设置打出去的牌的位置
--trf将牌放到的位置,存储的容器,牌的名字
function ModelCtrl.SetShowCardPos(trf,tab,name)
--将牌由手牌位置飞到目标位置
tab[#tab + 1] = name;
local targetPos = nil;
local residue = #tab % 6;
local quotient = (#tab - 1)/ 6;
local temp = string.format("%d",quotient);
if residue == 0 then
residue = 6;
end
targetPos = Vector3.New(MJModelSize.x * temp,(3 - residue + 0.5) * MJModelSize.z,0);
CardContent[name].transform:SetParent(trf);
local path = {CardContent[name].transform.localPosition,targetPos};
local seq = DOTween.Sequence();
seq:Append(CardContent[name].transform:DOLocalPath(path,0.2));
seq:PlayForward();
end
this.HandData = {
26,39,19,39,35,36,23,16,11,16,37,15,25
}
--发牌到玩家手牌
function ModelCtrl.Card2Hand()
table.sort(this.HandData,function(a,b) return a < b end);
for i=1,#this.HandData do
--模拟从牌池东开始给玩家发牌
--首先在东内获取服务器给的牌,没有则在南中获取,依次获取
--获取到后将牌移动到玩家手中
local temp = this.HandData[i] - 10;
print("数据=",temp.."名字=",CardData[temp]);
if CardDContent[CardData[temp]] then
CardDContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardNContent[CardData[temp]] then
CardNContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardXContent[CardData[temp]] then
CardXContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardBContent[CardData[temp]] then
CardBContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
else
logError("没有这种牌");
end
end
end
-- function ModelCtrl.SetHandCardPos()
-- end
第三版
require ("Data/MJCardData");
ModelCtrl = {};
local this = ModelCtrl;
local transform;
local gameObject;
local modelBehavior;
local modelParent;
local MJName = {};
--麻将桌控制器
MJModelCtrObj = nil;
MJModelBehaviour = nil;
--升降机
MJ_UPDOWN = nil;
--高亮材质
Desk_Hight = nil;
--普通材质
Desk_Low = nil;
--跑马灯东南西北
DongFlag = nil;
NanFlag = nil;
XiFlag = nil;
BeiFlag = nil;
--牌池
CardContent = {};
--牌面Sprite E开始是吃碰杠和牌
local PaiMianSprite = {"MJ_EDong","MJ_EXi","MJ_ENan","MJ_EBei","MJ_EZhong","MJ_EFa","MJ_EBai",
"MJ_Dong","MJ_Xi","MJ_Xan","MJ_Bei","MJ_Zhong","MJ_Fa","MJ_Bai",
"MJ_PaiDi","MJ_EPaiBei","MJ_EPaiDi",
"MJ_ETiao_1","MJ_ETiao_2","MJ_ETiao_3","MJ_ETiao_4","MJ_ETiao_5","MJ_ETiao_6","MJ_ETiao_7","MJ_ETiao_8","MJ_ETiao_9",
"MJ_Tiao_1","MJ_Tiao_2","MJ_Tiao_3","MJ_Tiao_4","MJ_Tiao_5","MJ_Tiao_6","MJ_Tiao_7","MJ_Tiao_8","MJ_Tiao_9",
"MJ_ETong_1","MJ_ETong_2","MJ_ETong_3","MJ_ETong_4","MJ_ETong_5","MJ_ETong_6","MJ_ETong_7","MJ_ETong_8","MJ_ETong_9",
"MJ_Tong_1","MJ_Tong_2","MJ_Tong_3","MJ_Tong_4","MJ_Tong_5","MJ_Tong_6","MJ_Tong_7","MJ_Tong_8","MJ_Tong_9",
"MJ_EWan_1","MJ_EWwan_2","MJ_EWwan_3","MJ_EWwan_4","MJ_EWwan_5","MJ_EWwan_6","MJ_EWwan_7","MJ_EWwan_8","MJ_EWwan_9",
"MJ_Wan_1","MJ_Wan_2","MJ_Wan_3","MJ_Wan_4","MJ_Wan_5","MJ_Wan_6","MJ_Wan_7","MJ_Wan_8","MJ_Wan_9",
};
PaiMianSprList = {};
--牌池四个容器
Cards_Dong = nil;
CardDContent = {};
Cards_Xi = nil;
CardXContent = {};
Cards_Nan = nil;
CardNContent = {};
Cards_Bei = nil;
CardBContent = {};
--玩家手牌
Player_Dong = nil;
Player_Nan = nil;
Player_Xi = nil;
Player_Bei = nil;
HandCard_Dong = {};
HandCard_Nan = {};
HandCard_Xi = {};
HandCard_Bei = {};
--打出去的牌和容器
Show_Dong = nil;
Show_DContent = {};
Show_Nan = nil;
Show_NContent = {};
Show_Xi = nil;
Show_XContent = {};
Show_Bei = nil;
Show_BContent = {};
--麻将尺寸,X为长,Y为高,Z为宽
MJModelSize = nil;
--构建函数--
function ModelCtrl.New()
logWarn("ModelCtrl.New--->>");
return this;
end
function ModelCtrl.Awake()
logWarn("ModelCtrl.Awake--->>");
resMgr:LoadPrefab('MJPrefabs',{"MJModel"},this.OnLoadFinshed);
resMgr:LoadSprites('MJPrefabs',PaiMianSprite,this.LoadSpriteFinshed);
StartCoroutine(this.Test);
end
--加载麻将桌的材质球
function ModelCtrl.OnLoadMaterial(objs)
Desk_Hight = objs[1];
Desk_Low = objs[0];
this.InitPanel();
this.InitEvent();
end
--加载麻将桌资源
function ModelCtrl.OnLoadFinshed(objs)
gameObject = newObject(objs[0]);
gameObject.name = "MJModel";
transform = gameObject.transform;
MJModelCtrObj = transform:Find("MJModelCtr").gameObject;
MJ_UPDOWN = MJModelCtrObj.transform:Find("MJ_UPDOWN").gameObject;
MJModelBehaviour = gameObject:AddComponent(typeof(LuaFramework.LuaBehaviour));
resMgr:LoadMaterial('MJMaterial',{"MJ_Desk_D","MJ_Desk_H"},this.OnLoadMaterial);
end
--加载麻将牌面
function ModelCtrl.LoadSpriteFinshed(objs)
print("加载图片",#PaiMianSprite);
for i=1,#PaiMianSprite do
PaiMianSprList[PaiMianSprite[i]] = objs[i - 1];
end
end
--初始化Panel,相关变量的赋值
function ModelCtrl:InitPanel()
DongFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Dong").gameObject;
NanFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Nan").gameObject;
XiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Xi").gameObject;
BeiFlag = MJModelCtrObj.transform:Find("MJ_Desk/Flag_Bei").gameObject;
DongFlag:GetComponent('Renderer').material = Desk_Hight;
NanFlag:GetComponent('Renderer').material = Desk_Low;
Player_Dong = transform:Find("HandCards/Player_Dong");
Player_Nan = transform:Find("HandCards/Player_Nan");
Player_Xi = transform:Find("HandCards/Player_Xi");
Player_Bei = transform:Find("HandCards/Player_Bei");
Show_Dong = transform:Find("ShowCards/Show_Dong");
Show_Xi = transform:Find("ShowCards/Show_Xi");
Show_Nan = transform:Find("ShowCards/Show_Nan");
Show_Bei = transform:Find("ShowCards/Show_Bei");
Cards_Dong = MJ_UPDOWN.transform:GetChild(0);
Cards_Nan = MJ_UPDOWN.transform:GetChild(1);
Cards_Xi = MJ_UPDOWN.transform:GetChild(2);
Cards_Bei = MJ_UPDOWN.transform:GetChild(3);
end
--初始化事件,相关事件的注册
function ModelCtrl.InitEvent()
for k,v in pairs(CardData) do
if v then
table.insert(MJName,v);
end
end
this.LoadCard();
end
function ModelCtrl.LoadCard()
resMgr:LoadPrefab("MJMesh",MJName,this.LoadCardFinshed);
end
local KaiJuData = {pos = "Dong", index = 3};
--加载麻将模型并实例化出一张牌来填充牌池
--根据房间信息和KaiJuData确定牌池的张数和码牌的起点
function ModelCtrl.LoadCardFinshed(objs)
logWarn("根据房间信息确定牌池的张数---未完成");
local CardNum = 136;
local Cards = {};
for i=1,136 do
go = newObject(objs[0]);
table.insert(Cards,go);
end
--模型真是尺寸
MJModelSize = go:GetComponent('Renderer').bounds.size;
this.Card2Desk(Cards);
-- for i=1,#MJName do
-- for j=1,4 do
-- local go = newObject(objs[i - 1]);
-- go.name = MJName[i];
-- if MJModelSize == nil then
-- MJModelSize = go:GetComponent('Renderer').bounds.size*0.8;
-- end
-- if j == 1 then
-- this.Card2Desk("Dong",go);
-- elseif j == 2 then
-- this.Card2Desk("Nan",go);
-- elseif j == 3 then
-- this.Card2Desk("Xi",go);
-- else
-- this.Card2Desk("Bei",go);
-- end
-- end
-- end
end
--将麻将放到指定牌池
--data可以确定一行牌池放多少牌,可以确定码牌的起点
--Cards为即将填充到牌池的所有麻将对象
function ModelCtrl.Card2Desk(Cards)
logWarn("根据data确定每行的排数和起点---未完成");
--缩放比列(因牌桌放不下全部麻将,加入缩放比例)
local modelsize = MJModelSize * 1.02;
local ratio = Vector3.one * 0.8;
local Pos = "Dong";
local CardNums = 17;
--string.format("%d",arg0)向下取整
--local CentreIndex = string.format("%d",CardNums / 2);
local CentreIndex = math.ceil(CardNums / 2);
--index = 筛子点数加1
local index = 1;
local bankerID = 1;
--计算出庄家位置和码牌起点
for i=1,#Cards / 2 do
table.insert(CardContent,Cards[2 * i - 1]);
table.insert(CardContent,Cards[2 * i]);
local go1 = CardContent[2 * i - 1];
local go2 = CardContent[2 * i];
if i + index - 1 <= CardNums then
this.SetDeskCardTRF(go1,go2,bankerID);
go1.transform.localPosition = Vector3.New(0,(i + index - 1 - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i + index - 1 - CentreIndex) * modelsize.z,0);
elseif i + index - 1 <= 2 * CardNums then
this.SetDeskCardTRF(go1,go2,bankerID + 1);
go1.transform.localPosition = Vector3.New(0,(i + index - 1 - CardNums - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i + index - 1 - CardNums - CentreIndex) * modelsize.z,0);
elseif i + index - 1 <= 3 * CardNums then
this.SetDeskCardTRF(go1,go2,bankerID + 2);
go1.transform.localPosition = Vector3.New(0,(i + index - 1 - 2 * CardNums - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i + index - 1 - 2 * CardNums - CentreIndex) * modelsize.z,0);
elseif i + index - 1 <= 4 * CardNums then
this.SetDeskCardTRF(go1,go2,bankerID + 3);
go1.transform.localPosition = Vector3.New(0,(i + index - 1 - 3 * CardNums - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i + index - 1 - 3 * CardNums - CentreIndex) * modelsize.z,0);
else
this.SetDeskCardTRF(go1,go2,bankerID + 4);
go1.transform.localPosition = Vector3.New(0,(i + index - 1 - 4 * CardNums - CentreIndex) * modelsize.z,-modelsize.y);
go2.transform.localPosition = Vector3.New(0,(i + index - 1 - 4 * CardNums - CentreIndex) * modelsize.z,0);
end
end
Cards_Dong.transform.localScale = ratio;
Cards_Nan.transform.localScale = ratio;
Cards_Xi.transform.localScale = ratio;
Cards_Bei.transform.localScale = ratio;
end
--设置牌池麻将的transform
function ModelCtrl.SetDeskCardTRF(go1,go2,bankerID)
local parent = MJ_UPDOWN.transform:GetChild(bankerID % 4);
go1.transform:SetParent(parent);
go1.transform.localEulerAngles = Vector3.zero;
go1.transform.localScale = Vector3.one;
go2.transform:SetParent(parent);
go2.transform.localEulerAngles = Vector3.zero;
go2.transform.localScale = Vector3.one;
end
function ModelCtrl.Test()
-- WaitForSeconds(5);
-- ModelCtrl.ShowCard("Bei",1);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",2);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",3);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",4);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",5);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",6);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",7);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",8);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",9);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",10);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",11);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",12);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",13);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",14);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",15);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",16);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",17);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",18);
-- WaitForSeconds(2);
-- ModelCtrl.ShowCard("Bei",19);
WaitForSeconds(5);
this.Card2Hand()
end
--打牌到牌堆
--pos将牌打出去的位置,是哪个玩家出的牌
--carddata中的索引值
function ModelCtrl.ShowCard(pos,index)
if pos == "Dong" then
for k,v in pairs(HandCard_Dong) do
if v == MJName[index] then
this.SetShowCardPos(Show_Dong,Show_DContent,v);
table.remove(HandCard_Dong,k);
end
end
return;
elseif pos == "Nan" then
for k,v in pairs(HandCard_Nan) do
if v == MJName[index] then
this.SetShowCardPos(Show_Nan,Show_NContent,v);
table.remove(HandCard_Nan,k);
end
end
return;
elseif pos == "Xi" then
for k,v in pairs(HandCard_Xi) do
if v == MJName[index] then
this.SetShowCardPos(Show_Xi,Show_XContent,v);
table.remove(HandCard_Xi,k);
end
end
return;
else
for k,v in pairs(CardBContent) do
if v == MJName[index].."_4" then
this.SetShowCardPos(Show_Bei,Show_BContent,v);
table.remove(HandCard_Bei,k);
end
end
return;
end
end
--设置打出去的牌的位置
--trf将牌放到的位置,存储的容器,牌的名字
function ModelCtrl.SetShowCardPos(trf,tab,name)
--将牌由手牌位置飞到目标位置
tab[#tab + 1] = name;
local targetPos = nil;
local residue = #tab % 6;
local quotient = (#tab - 1)/ 6;
local temp = string.format("%d",quotient);
if residue == 0 then
residue = 6;
end
targetPos = Vector3.New(MJModelSize.x * temp,(3 - residue + 0.5) * MJModelSize.z,0);
CardContent[name].transform:SetParent(trf);
local path = {CardContent[name].transform.localPosition,targetPos};
local seq = DOTween.Sequence();
seq:Append(CardContent[name].transform:DOLocalPath(path,0.2));
seq:PlayForward();
end
this.HandData = {
26,39,19,39,35,36,23,16,11,16,37,15,25
}
--发牌到玩家手牌
function ModelCtrl.Card2Hand()
table.sort(this.HandData,function(a,b) return a < b end);
for i=1,#this.HandData do
--模拟从牌池东开始给玩家发牌
--首先在东内获取服务器给的牌,没有则在南中获取,依次获取
--获取到后将牌移动到玩家手中
local temp = this.HandData[i] - 10;
print("数据=",temp.."名字=",CardData[temp]);
if CardDContent[CardData[temp]] then
CardDContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardNContent[CardData[temp]] then
CardNContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardXContent[CardData[temp]] then
CardXContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
elseif CardBContent[CardData[temp]] then
CardBContent[CardData[temp]]:SetActive(false);
HandCardCtrl.GiveCard(CardData[temp]);
else
logError("没有这种牌");
end
end
end
-- function ModelCtrl.SetHandCardPos()
-- end