前言
乱弹
常见的游戏开发有 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/