前言

乱弹

常见的游戏开发有c/c++(Unreal), C#(Unity)等, Pascal语言的也有(https://wiki.freepascal.org/G...
关于pascal的优势,网上都说时易于教学,可以培养良好的程序习惯云云,我只是听之而已。
如果说最后需要c++,为什么一开始就面对呢,非要用pascal绕一圈,得不偿失的。
以上仅是个人观点

为什么有这系列文章

在Pascal基础系列文章第一篇我曾写到闲的无聊,学习一下pascal, 目前也是如此。
如果为了学习游戏开发,快速上手自然要用Unreal或者Unity。 从基础做起,估计要学习图形学之类的知识。
但是我是闲情偶记(记录的记)

本系列关注于2D Code,不关注游戏性(关卡设计等)以及游戏相关资源(字体,美术,音乐音效等)的创建

环境

图形库选择

Pascal是跨平台的,如果要写的程序也要跨平台,可能需要使用OpenGL(相比Vulkan可以支持更多的旧设备)好一些。
但是为了偷懒,决定使用SDL2。优点如下

  • 使用广泛, 资料众多
  • 上手简单,跨平台

编辑器: lazarus 平台: ubuntu18.04

  • 安装sdl2

sudo apt install libsdl2-dev libsdl2-gfx-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev

  • 安装lazarus

sudo apt install lazarus make

  • sdl2的pascal语言绑定

https://github.com/ev1313/Pascal-SDL-2-Headers下载后直接包含到项目中即可

概览

开始之前需要了解游戏的大体的运行机制

graph TD
A(初始化) --> B[获取输入]-->C[物理计算]-->D[渲染]-->E(结束)
D --> B

部分平台的markdown不支持flowchart...........

这就是游戏的基本框架,看起来很简单.

第一个示例

创建一个窗口,5秒后会自动关闭

Program test01;
{$mode objfpc}{$H+}

Uses SysUtils,sdl2;

Var 
  pw : PSDL_Window;
  pr  : PSDL_Renderer;
Begin
  // init
  SDL_Init(SDL_INIT_VIDEO);
  If SDL_WasInit(SDL_INIT_VIDEO)<>0 Then writeln('video init');
  pw := SDL_CreateWindow('Hello',SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,450,
        SDL_WINDOW_SHOWN);
  pr := SDL_CreateRenderer(pw,-1,0);
  // render
  SDL_SetRenderDrawColor(pr,0,0,0,255);
  SDL_RenderClear(pr);
  SDL_RenderPresent(pr);
  SDL_Delay(5000);
  // clean
  SDL_DestroyWindow(pw);
  SDL_DestroyRenderer(pr);
  SDL_Quit();
End.

接下来加入输入部分(暂时忽略物理计算)


  isRunning := true;
  While isRunning Do
    Begin
      // handle input
      If SDL_PollEvent(@e)=1 Then
        Begin
          Case e.Type_ Of 
            SDL_QUITEV:      isRunning := false;
          End;
        End;
      // TODO: do physics and then update

      // render
      SDL_SetRenderDrawColor(pr,0,0,0,255);
      SDL_RenderClear(pr);
      SDL_RenderPresent(pr);

    End;

使用OOP来整理一下

Type TGame = Class
  Private 
    pw : PSDL_Window;
    pr  : PSDL_Renderer;

  Public 
    isRunning: boolean;
    Procedure Init(title : String;x,y,h,w,flags:integer );
    Procedure Render();
    Procedure Update();
    Procedure HandleEvents();
    Procedure Clean();
End;
Var 
  g : TGame;
Begin
  g := TGame.Create;
  g.Init('Hello',SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,600,400,SDL_WINDOW_SHOWN);
  While g.isRunning Do
    Begin
      g.HandleEvents;
      g.Update;
      g.Render;
    End;
  g.Clean;
  g.Free;
End.

makefile

main:main.pas
    fpc -gh -Fusdl2 -Fl. main.pas

代码参考
https://gitee.com/tom-cat/sdl-hello/tree/v1.0/


yitree
228 声望1 粉丝

引用和评论

0 条评论