The top bottom constraint is a bit tricky. As camera keeps moving with plane. I used camera as a reference to calcuate the top and bottom screen edge.
1. Get camera position
2. Calculate current top edge Y location
3. Calculate current bottom edge Y location
4. Compare with current plane location, and return signals, -1 as plane too low, 1 as plane too high, 0 for plane inside the screen
5. feed the signal and mouse movement to function edgeMoveFilter, which only permit plane move toward centre if it is on edge
The code is below and red marks are comments.
******Oninit.lua****************
--Global variable
--set touch move parameters
Sensitivity = 0.005
--invert = -1 -> is inverted
Invert = 1
Threshold=3.5
-- Plane Contrain
Xmin = -0.87
Xmax = 0.87
-- Plane Top Bottom Constrain
Ymin = -1.50
Ymax = 1.30
--filter movement so plane will only move towards center if touchs edge
function edgeMoveFilter(limitSignal,oldX)
if limitSignal == -1and oldX > 0then
return oldX
elseif limitSignal == -1and oldX < 0then
return0
elseif limitSignal == 1and oldX >0then
return0
elseif limitSignal ==1and oldX <0then
return oldX
end
return0
end
--check if over boundary on Y axis
function YoverLimit(obj,cameraObj)
local vec3 = obj:getPosition()
local cameraV = cameraObj:getLinearVelocity()
--get camero position
local cameraP = cameraObj:getPosition()
--calculate bottom edge ;ocation
local nextYmin = cameraP.y+Ymin
--calculate top edge location
local nextYmax = cameraP.y+Ymax
--check whether plane is on edge and return signals
if vec3.y < nextYmin then
return-1
elseif vec3.y > nextYmax then
return1
else
return0
end
end
--endNew-----------
function XoverLimit(obj)
local vec3 = obj:getPosition()
if vec3.x < Xmin then
return-1
elseif vec3.x > Xmax then
return1
else
return0
end
end
function printPosition(obj)
local vec3 = obj:getPosition()
dPrintf("position x: " .. vec3.x)
dPrintf("position y: " .. vec3.y)
dPrintf("position z: " .. vec3.z)
end
function velocityCap(v,vmax)
if (v>vmax) then
return vmax
elseif (v < -vmax) then
return -vmax
elsereturn v
end
end
******planeTouchMove.lua****************
mouse=OgreKit.Mouse()
scene = OgreKit.getActiveScene()
play = scene:getObject("plane")
--new--get camera objcet
camera = scene:getObject("Camera")
--end new---------------------------
logicM = OgreKit.LogicManager()
myLogicObject = logicM:getObject("plane")
mySensor = myLogicObject:getSensor("Collision")
maxVelocity=0.08
mouse:capture()
--print current plane posistion on screen
--printPosition(play)
--using threshold to filter out unwanted small touch movement
if ((mouse.xrel>Threshold or mouse.xrel<-Threshold)or(mouse.yrel>Threshold or mouse.yrel<-Threshold)and (not(play.touchBoundary))) then
Blender 3D game engine provides location constraint to limit object in a certain area. However this was not implemented in the Gamekit package. I have to do some scripting to get around it. So my plane will not fly out of the screen. Below is the script and red bits are my explanations. This is apart of series tutorials to create a 2d arcade plane game using Blender 3D and gamekit. Check this blog for more details.
-------BELOW IS OnInit.lua--------------
--Global variable
--set touch move parameters
Sensitivity = 0.005
--invert = -1 -> is inverted
Invert = 1
Threshold=3.5
-- Plane Constrain parameter
Xmin = -0.87--This is the left boundary, adjust if necessary
Xmax = 0.87--This is the right boundary, adjust if necessary
--this function is to stop plane moving cross the boundary
function xMoveFilter(limitSignal,oldX)
if limitSignal == -1and oldX > 0then
return oldX
elseif limitSignal == -1and oldX < 0then
return0
elseif limitSignal == 1and oldX >0then
return0
elseif limitSignal ==1and oldX <0then
return oldX
end
return0
end
--this function is to determine whether plane is over the broundary
function XoverLimit(obj)
local vec3 = obj:getPosition()
if vec3.x < Xmin then
return-1
elseif vec3.x > Xmax then
return1
else
return0
end
end
--this function is for debug used to display plane position
function printPosition(obj)
local vec3 = obj:getPosition()
dPrintf("position x: " .. vec3.x)
dPrintf("position y: " .. vec3.y)
dPrintf("position z: " .. vec3.z)
end
function velocityCap(v,vmax)
if (v>vmax) then
return vmax
elseif (v < -vmax) then
return -vmax
elsereturn v
end
end
-------BELOW IS planeTouchMove.lua--------------
mouse=OgreKit.Mouse()
scene = OgreKit.getActiveScene()
play = scene:getObject("plane")
logicM = OgreKit.LogicManager()
myLogicObject = logicM:getObject("plane")
mySensor = myLogicObject:getSensor("Collision")
maxVelocity=0.08
mouse:capture()
--print current plane posistion on screen
printPosition(play)
--using threshold to filter out unwanted small touch movement
if ((mouse.xrel>Threshold or mouse.xrel<-Threshold)or(mouse.yrel>Threshold or mouse.yrel<-Threshold)and (not(play.touchBoundary))) then
velocityY=velocityCap((mouse.yrel) * Sensitivity, maxVelocity)
velocityX=velocityCap((mouse.xrel) * Sensitivity, maxVelocity)
--check if plane over screen boundary
limitSignal = XoverLimit(play)
--the X Y directions are swapped as the screen is in landscape
this video showing how to build blender 3d gamekit ( free game engine )iPhone ios application for running blender 3D game on iOS devices.
download cmake from cmake.org.in xcode project setting, change code signing to no, i missed that in the video.
The goal of gamekit is to create a basic game engine that allows fast prototyping build around open source software free for commercial use.
Using Ogre or Irrlicht for graphics, Bullet for physics, OpenAL for sound
OgreKit is most actively developed and in svn/trunk, the suspended Irrlicht version is in svn/branches/IrrKit.
Engine is written in C++ and the game logic can be done in C++, Lua scripting or logic bricks