前言

乱弹

常见的游戏开发有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 TDA(初始化) --> 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/