//触屏事件处理
void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event)
{
    //屏幕转换到射线
    kmVec3    tPt;
    kmVec3	  tDir;
    // 获取点在视图中的坐标
    CCPoint touchLocation = touches[0]->getLocation();
    auto    visibleSize = Director::getInstance()->getVisibleSize();
    auto	origin = Director::getInstance()->getVisibleOrigin();
    //线条容器
    std::vector<LightLineRender::Line> lines;
    //设置线条位置

    //闪电的起点和终点
    Vec2	tFishPos(Vec2(visibleSize / 2) + origin);
    tFishPos = m_FishLayer->GetSpritePosition() + origin;
    Vec3 segStart = Vec3(0,0,-8);
    Vec3 segEnd   = Vec3(touchLocation.x - tFishPos.x ,touchLocation.y - tFishPos.y ,-8);
    //取得方向
    Vec3  dir = segEnd - segStart ;
    float fLength = dir.length();
    dir.normalize();
    //顺时针转动45度形成一个偏移点做为第一个闪电链线段。
    Vec3  rotate_left;
    Mat4  rotate_left_Mat;
    kmMat4RotationZ(&rotate_left_Mat,MATH_DEG_TO_RAD(-45));
    kmVec3TransformCoord(&rotate_left,&dir,&rotate_left_Mat);
    rotate_left.normalize();
    //逆时针转动45度形成一个偏移点做为第一个闪电链线段。
    Vec3  rotate_right;
    Mat4  rotate_right_Mat;
    kmMat4RotationZ(&rotate_right_Mat,MATH_DEG_TO_RAD(45));
    kmVec3TransformCoord(&rotate_right,&dir,&rotate_right_Mat);
    rotate_right.normalize();

    //分成三段闪电链
    Vec3  v1_s = segStart ;
    Vec3  v1_e = segStart + dir * fLength / 4.0 + rotate_left * (fLength / 6.0);

    Vec3  v2_s = v1_e ;
    Vec3  v2_e = segStart + dir * fLength / 2.0 + rotate_right * (fLength / 6.0);

    Vec3  v3_s = v2_e ;
    Vec3  v3_e = segEnd;

    lines.push_back( LightLineRender::Line( v1_s, v1_e, 0 ) );
    lines.push_back( LightLineRender::Line( v2_s, v2_e, 0 ) );
    lines.push_back( LightLineRender::Line( v3_s, v3_e, 0 ) );
    //创建出闪光链
    LightLineRender*	_lighting = dynamic_cast<LightLineRender*>(getChildByTag(10));
    //使用线段容器创建闪电链
    _lighting->setLines( lines );
    _lighting->setPosition(tFishPos);
    //这一句可以让闪电链在1秒内渐渐消隐。它通过调节Shader中的u_color值从1变为0来实现。
    _lighting->OpenAlphaToZero(1.0);
    //击中乌龟,让乌龟翻身。
    m_FishLayer->AttackWuGui();
}
Exemple #2
0
static void dlUpdateMatrix( dlObject *object )
{
   kmMat4 translation,
          rotation,
          scale,
          temp;

   CALL("%p", object);

   /* translation */
   kmMat4Translation( &translation,
                      object->translation.x,
                      object->translation.y,
                      object->translation.z  );

   /* rotation */
   kmMat4RotationX( &rotation, kmDegreesToRadians(object->rotation.x) );
   kmMat4Multiply(  &rotation, &rotation,
                    kmMat4RotationY( &temp, kmDegreesToRadians(object->rotation.y) ) );
   kmMat4Multiply(  &rotation, &rotation,
                    kmMat4RotationZ( &temp, kmDegreesToRadians(object->rotation.z) ) );

   /* scale */
   kmMat4Scaling( &scale,
                  object->scale.x,
                  object->scale.y,
                  object->scale.z  );

   /* build matrix */
   kmMat4Multiply( &translation, &translation, &rotation );
   kmMat4Multiply( &object->matrix, &translation, &scale );
   object->transform_changed = 0;
}
void Transform::flush()
{
    if (m_needFlush)
    {
        m_needFlush=false;
        kmMat4Identity(&m_matrix);
        kmMat4 t_mat;
        
        //position
        kmMat4Identity(&t_mat);
        kmMat4Translation(&t_mat,m_x,m_y,0);
        kmMat4Multiply(&m_matrix, &m_matrix, &t_mat);
        
        //rotation
        kmMat4Identity(&t_mat);
        kmMat4RotationZ(&t_mat, m_rotationZ*PI/180.0f);
        kmMat4Multiply(&m_matrix, &m_matrix, &t_mat);
        
        //scale
        kmMat4Identity(&t_mat);
        kmMat4Scaling(&t_mat, m_scaleX, m_scaleY, 1);
        kmMat4Multiply(&m_matrix, &m_matrix, &t_mat);
        
        //anchorPoint
        kmMat4Identity(&t_mat);
        kmMat4Translation(&t_mat,(-m_anchorX*m_width),(-m_anchorY*m_height),0);
        kmMat4Multiply(&m_matrix, &m_matrix, &t_mat);
        
    }
}
Exemple #4
0
kmMat4* hueRotation(kmMat4* m, float r) {
    kmMat4 mat0;
    kmMat4 mat1;
    kmMat4 temp;

    // Make an identity matrix.
    kmMat4Identity(&mat0);

    // Rotate the grey vector into positive Z.
    // Sin = 1/sqrt(2).
    // Cos = 1/sqrt(2).
    kmMat4RotationX(&temp, M_PI_4);
    kmMat4Multiply(&mat1, &temp, &mat0);

    // Sin = -1/sqrt(3).
    // Cos = sqrt(2/3).
    kmMat4RotationY(&temp, -0.615479709);
    kmMat4Multiply(&mat0, &temp, &mat1);

    // Shear the space to make the luminance plane horizontal.
    float lx, ly, lz;
    xformRGB(&mat0, rwgt, gwgt, bwgt, &lx, &ly, &lz);

    float zsx = lx / lz;
    float zsy = ly / lz;
    shearZMatrix(&temp, zsx, zsy);
    kmMat4Multiply(&mat1, &temp, &mat0);

    // Rotate the hue.
    float rad = r * M_PI / 180;
    kmMat4RotationZ(&temp, rad);
    kmMat4Multiply(&mat0, &temp, &mat1);

    // Unshear the space to put the luminance plane back.
    shearZMatrix(&temp, -zsx, -zsy);
    kmMat4Multiply(&mat1, &temp, &mat0);

    // Rotate the grey vector back into place.
    // Sin = 1/sqrt(3).
    // Cos = sqrt(2/3);
    kmMat4RotationY(&temp, 0.615479709);
    kmMat4Multiply(&mat0, &temp, &mat1);

    // Sin = -1/sqrt(2).
    // Cos = 1/sqrt(2).
    kmMat4RotationX(&temp, -M_PI_4);
    kmMat4Multiply(&mat1, &temp, &mat0);

    kmMat4Fill(m, mat1.mat);
    return m;
}
Exemple #5
0
/**
 * Builds a rotation matrix from pitch, yaw and roll. The resulting
 * matrix is stored in pOut and pOut is returned
 */
kmMat4* kmMat4RotationYawPitchRoll(kmMat4* pOut, const kmScalar pitch, const kmScalar yaw, const kmScalar roll)
{

    kmMat4 yaw_matrix;
    kmMat4RotationY(&yaw_matrix, yaw);

    kmMat4 pitch_matrix;
    kmMat4RotationX(&pitch_matrix, pitch);

    kmMat4 roll_matrix;
    kmMat4RotationZ(&roll_matrix, roll);

    kmMat4Multiply(pOut, &pitch_matrix, &roll_matrix);
    kmMat4Multiply(pOut, &yaw_matrix, pOut);

    return pOut;
}
Exemple #6
0
void drawSprite(float x, float y, float w, float h, float a, int tex)
{


    glUseProgram(__spr.spriteProg);
    kmMat4Assign(&__spr.otm, &__spr.opm);
    kmMat4Translation(&__spr.t, x, y, -1); // support z layers?
    kmMat4RotationZ(&__spr.r,a);
    kmMat4Multiply(&__spr.t,&__spr.t,&__spr.r);
    kmMat4Multiply(&__spr.otm, &__spr.otm, &__spr.t);

    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);

    glBindTexture(GL_TEXTURE_2D, tex);

    glEnableVertexAttribArray(__spr.vert_attrib);
    glBindBuffer(GL_ARRAY_BUFFER, __spr.quadvbo);
    glVertexAttribPointer(__spr.vert_attrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glEnableVertexAttribArray(__spr.uv_attrib);
    glBindBuffer(GL_ARRAY_BUFFER, __spr.texvbo);
    glVertexAttribPointer(__spr.uv_attrib, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glUniform1i(__spr.texture_uniform, 0);
    glUniform2f(__spr.u_size, w,h);


    glUniformMatrix4fv(__spr.opm_uniform, 1, GL_FALSE, (GLfloat *) & __spr.otm);

    glDrawArrays(GL_TRIANGLES, 0, 6);


    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    glDisableVertexAttribArray(__glp.uv_attrib);
    glDisableVertexAttribArray(__glp.vert_attrib);

}