从一位大侠的博客上看到,说手游尽可能的使用脚本,可以便于版本更新,觉得很有道理,每次更新执行文件太蛋疼了,所以从设计初就应该考虑进来.
比如我刚写的场景控制类,以后各种触发肯定跟着需求随时变动,但又不想写过多的脚本回调,那就直接挪到脚本好了,只要控制的好,效率还是可以保证的.
而主场景还是在C++中实现,便于数据管理.
主控脚本
--------------------------------------------------------
--文件名: control_iso.lua
--描 述: 等轴视距场景控制
--日 期: 11/3/2013
--作 者: KevinYuen
--版 权: Copyright (C) 2011 - All Rights Reserved
--备 注:
---------------------------------------------------------
-- 绑定的场景
local bind_scene = nil;
-- 获取指定节点坐标的地块索引
-- 方法来自网络
function tilePosFromLocation( location, tileMap )
-- Tilemap position must be subtracted, in case the tilemap position is scrolling
local x, y = tileMap:getPosition();
local pos = ccpSub( location, CCPointMake(x,y) );
local halfMapWidth = tileMap:getMapSize().width * 0.5;
local mapHeight = tileMap:getMapSize().height;
local tileWidth = tileMap:getTileSize().width;
local tileHeight = tileMap:getTileSize().height;
local tilePosDiv = CCPointMake(pos.x / tileWidth, pos.y / tileHeight);
local inverseTileY = mapHeight - tilePosDiv.y;
-- Cast to int makes sure that result is in whole numbers
local posX = math.floor( inverseTileY + tilePosDiv.x - halfMapWidth );
local posY = math.floor( inverseTileY - tilePosDiv.x + halfMapWidth );
-- make sure coordinates are within isomap bounds
posX = math.max(0, posX);
posX = math.min(tileMap:getMapSize().width - 1, posX);
posY = math.max(0, posY);
posY = math.min(tileMap:getMapSize().height - 1, posY);
return CCPointMake(posX, posY);
end
-- 创建控制
function createControl( scene )
bind_scene = scene;
if not bind_scene then return end; -- 绑定的场景
local touchBeginPoint = nil; -- 拖拽坐标记录
local touchSceneDragged = false; -- 是否拖拽过地图了
-- 触摸开始
local function onTouchBegan( x, y )
touchBeginPoint = {x = x, y = y}; -- 位置记录
touchSceneDragged = false; -- 重新开始记录
return true;
end
-- 触摸结束
local function onTouchEnded( x, y )
-- 没有绑定的场景返回
if not bind_scene then return end;
-- 如果拖拽过地图,那么就不进行拣选操作
if touchSceneDragged then return end;
-- 地图层拣选
local mapLayer = bind_scene:getMapLayer();
if mapLayer then
-- 坐标转换
local tmxNode = mapLayer:layerNamed( "ground" );
if tmxNode then
local Location = tmxNode:convertToNodeSpace( CCPointMake( x,y ) );
local tilePos = tilePosFromLocation( Location, mapLayer );
--local tilePos = CIsometricController:tilePosFromLocation( Location, mapLayer );
local tileSprite = tmxNode:tileAt( tilePos );
if tileSprite then
-- 隐藏选中的地块
tileSprite:setVisible( false );
return;
end
end
end
end
-- 触摸移动
local function onTouchMoved( x, y )
if not bind_scene or not touchBeginPoint then return end;
local cx, cy = bind_scene:getPosition();
bind_scene:setPosition( cx + x - touchBeginPoint.x, cy + y - touchBeginPoint.y );
touchBeginPoint = {x = x, y = y};
touchSceneDragged = true; -- 地图拖拽过了
end
-- 触摸事件处理
local function onTouch( eventType, x, y )
if eventType == CCTOUCHBEGAN then
return onTouchBegan(x, y)
elseif eventType == CCTOUCHMOVED then
return onTouchMoved(x, y)
else
return onTouchEnded(x, y)
end
end
-- 注册场景触摸事件脚本通告的相关事项
local controlLayer = CCLayer:create();
controlLayer:registerScriptTouchHandler( onTouch );
controlLayer:setTouchEnabled( true );
bind_scene:addChild( controlLayer, 0, ESLT_CONTROL );
end
明天开始学习动画,设计游戏对象类,看看如何封装好~先给张图: