浏览代码

Improved 2d camera system -IN PROGRESS-

pull/107/head
raysan5 9 年前
父节点
当前提交
a3f16c8459
共有 2 个文件被更改,包括 32 次插入14 次删除
  1. +27
    -9
      examples/core_2d_camera.c
  2. +5
    -5
      src/core.c

+ 27
- 9
examples/core_2d_camera.c 查看文件

@ -22,11 +22,14 @@ int main()
Camera2D camera; Camera2D camera;
camera.position = (Vector2){ 0, 0 };
camera.origin = (Vector2){ 100, 100 };
camera.offset = (Vector2){ 0, 0 };
camera.target = (Vector2){ 400, 200 };
camera.rotation = 0.0f; camera.rotation = 0.0f;
camera.zoom = 1.0f; camera.zoom = 1.0f;
Rectangle player = { 400, 200, 40, 40 };
camera.target = (Vector2){ player.x + 20, player.y + 20 };
SetTargetFPS(60); SetTargetFPS(60);
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
@ -35,16 +38,28 @@ int main()
{ {
// Update // Update
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
if (IsKeyDown(KEY_RIGHT)) camera.position.x--;
else if (IsKeyDown(KEY_LEFT)) camera.position.x++;
else if (IsKeyDown(KEY_UP)) camera.position.y++;
else if (IsKeyDown(KEY_DOWN)) camera.position.y--;
if (IsKeyDown(KEY_RIGHT)) player.x -= 2;
else if (IsKeyDown(KEY_LEFT)) player.x += 2;
else if (IsKeyDown(KEY_UP)) player.y -= 2;
else if (IsKeyDown(KEY_DOWN)) player.y += 2;
// Camera target follows player
camera.target = (Vector2){ player.x + 20, player.y + 20 };
if (IsKeyDown(KEY_R)) camera.rotation--; if (IsKeyDown(KEY_R)) camera.rotation--;
else if (IsKeyDown(KEY_F)) camera.rotation++; else if (IsKeyDown(KEY_F)) camera.rotation++;
if (IsKeyDown(KEY_W)) camera.zoom += 0.005f;
if (IsKeyDown(KEY_S)) camera.zoom -= 0.005f;
// Camera controls
if (IsKeyDown(KEY_R)) camera.rotation--;
else if (IsKeyDown(KEY_F)) camera.rotation++;
camera.zoom += ((float)GetMouseWheelMove()*0.05f);
if (IsKeyPressed(KEY_Z))
{
camera.zoom = 1.0f;
camera.rotation = 0.0f;
}
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Draw // Draw
@ -56,7 +71,10 @@ int main()
DrawText("2D CAMERA TEST", 20, 20, 20, GRAY); DrawText("2D CAMERA TEST", 20, 20, 20, GRAY);
DrawRectangle(0, 300, screenWidth, 50, GRAY); DrawRectangle(0, 300, screenWidth, 50, GRAY);
DrawRectangle(400, 250, 40, 40, RED);
DrawRectangleRec(player, RED);
DrawRectangle(camera.origin.x, 0, 1, screenHeight, GREEN);
DrawRectangle(0, camera.origin.y, screenWidth, 1, GREEN);
EndDrawing(); EndDrawing();
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------

+ 5
- 5
src/core.c 查看文件

@ -560,14 +560,14 @@ void BeginDrawingEx(Camera2D camera)
{ {
BeginDrawing(); BeginDrawing();
// l">TODO: Consider origin offset on position, rotation, scaling
// ">Camera rotation and scaling is always relative to target
Matrix matOrigin = MatrixTranslate(-camera.target.x, -camera.target.y, 0.0f);
Matrix matRotation = MatrixRotate((Vector3){ 0.0f, 0.0f, 1.0f }, camera.rotation*DEG2RAD); Matrix matRotation = MatrixRotate((Vector3){ 0.0f, 0.0f, 1.0f }, camera.rotation*DEG2RAD);
Matrix matScale = MatrixScale(camera.zoom, camera.zoom, 1.0f); Matrix matScale = MatrixScale(camera.zoom, camera.zoom, 1.0f);
Matrix matTranslation = MatrixTranslate(camera.position.x, camera.position.y, 0.0f);
Matrix matOrigin = MatrixTranslate(o">-camera.origin.x, -camera.origin.y, 0.0f);
Matrix matTranslation = MatrixTranslate(n">camera.offset.x + camera.target.x, camera.offset.y + camera.target.y, 0.0f);
Matrix matTransform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation);
Matrix matTransform = MatrixMultiply(MatrixMultiply(matOrigin, MatrixMultiply(matScale, matRotation)), matTranslation);
rlMultMatrixf(MatrixToFloat(matTransform)); rlMultMatrixf(MatrixToFloat(matTransform));
} }

正在加载...
取消
保存