LINUX.ORG.RU

Скриншот pre-alpha версии инди FPS шутера

 , ,


0

1

В общем, то, что вы видите — это, так сказать, проба пера. Грубая, почти «квадратная» модель MP5 с прицелом, огромный «плэйн» с размытой текстурой и то ли домик, то ли ангар с «экструдированной» дверью. Не Crysis, конечно, (в разработке еще много всяких вещей), но если выйдет хотя бы бета, да еще и с интересным сюжетом, может кому-нибудь понравится :)

>>> Просмотр (1024x600, 97 Kb)



Проверено: JB ()
Последнее исправление: JB (всего исправлений: 2)

Не показывай дураку недоделанную работу.

sid350 ★★★★★
()
Ответ на: комментарий от Google-ch

Тот еще говнокод ), один из импорт из PLY файлов с кучей не удаляемых векторов чего стоит. Надо будет почистить.

puding
() автор топика

примерно на такой стадии разработки и выходят все современные игры (разве что текстуры покрасить), так что это не пре альфа а полноценный релиз, так сказать 1.0!

Xegai ★★
()
Ответ на: комментарий от Google-ch

А кто сказал, что это Open Source ) Сырцы будут попозже.

puding
() автор топика
Ответ на: комментарий от Google-ch

Но выглядит как не очень мало сделанной работы

Лет 10 назад изучал OpenGL, для примера за день накорябал гоночку, так там была трасса, травка, физика, отличающаяся на этих поверхностях, редактор трасс, две модельки машинок, всё с текстурами. В архиве занимает мегабайт 5 (из-за текстур), около 800 строк кода всего (28Кб все исходники). А сабж тянет на полчаса работы максимум.

redgremlin ★★★★★
()

А чем существующие движки не устроили? Я думал как раз их-то завались.

morse ★★★★★
()

Смысл показывать настолько сырую работу?
То, что вы сделали, способен повторить любой школьник по книжка. Зачем это тут?

trex6 ★★★★★
()

Если это не толстый троллинг и не детство в одном месте, то скажи, зачем это здесь показывать? Писал бы уж сразу про новую ось, чего мелочиться?

another ★★★★★
()
Ответ на: комментарий от redgremlin

800 строк кода

Это без пустых строк и комментариев?

И все равно

гоночку, так там была трасса, травка, физика, отличающаяся на этих поверхностях, редактор трасс, две модельки машинок, всё с текстурами

верится слабо, даже если текстуры не рисовать.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

даже если текстуры не рисовать

Их никто и не рисовал.

давай архив

Нихачу, там быдлокод :) Типа такого (для справки - race_draw - 306 строк, race_physics - 285):

unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AppEvnts, OpenGL, Math, race_physics, race_draw;


type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    glrc: HGLRC;
    Textures: array [0..2] of GLubyte;
    Track: TTrack;
    Auto: TAuto;
    Draw: TDrawer;
    Closed: Boolean;
  public
    procedure SetPixFmt(DC: HDC);
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetPixFmt(DC: HDC);
var
  pfd: TPixelFormatDescriptor;
  i: Integer;
begin
  FillChar(pfd, SizeOf(pfd), 0);
  pfd.dwFlags:=PFD_DOUBLEBUFFER or PFD_SUPPORT_OPENGL;
  i:=ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, i, @pfd);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Draw.Prepare(0, 0, ClientWidth, ClientHeight);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetPixFmt(Canvas.Handle);
  glrc:=wglCreateContext(Canvas.Handle);
  wglMakeCurrent(Canvas.Handle, glrc);

  Track:=TTrack.Create;
  Track.LoadFromFile('Tracks\Track0');
  
  Auto:=TAuto.Create(
    ControlOptions(10.0, 3.0, 3.0, 50.0, 1.0, 0.1, 0.04, 0.3, 0.4, 0.15),
    Track, TrackPoint(0, 1.0, 0), TrackPoint(AutoLength, 1.0, 0)
  );

  Draw:=TDrawer.Create(Track, Auto);
end;

function MTimeToStr(ATime: Cardinal): string;
var
  h, m, s, ms: Cardinal;
begin
  ms:=ATime mod 1000;
  s:=(ATime mod 60000 - ms) div 60;
  m:=(ATime mod 3600000 - s*60000 - ms) div 3600;
  h:=ATime div 60;
  Result:=Format('%2.2d:%2.2d:%2.2d.%3.3d', [h, m, s, ms]);
end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;  var Done: Boolean);
var
  i: Integer;
  frametime, oldframetime, laptime, besttime, curtime, oldlaptime: Cardinal;
  Laps, TotalTime: Cardinal;
begin
  Closed:=False;
  frametime:=GetTickCount;
  oldframetime:=frametime;
  laptime:=GetTickCount;
  besttime:=100000;
  curtime:=0;
  i:=0;
  Laps:=10;
  TotalTime:=0;
while True do begin
  Application.ProcessMessages;
  if Closed then begin
    Track.Free;
    Auto.Free;
    glDeleteLists(Textures[0], 2);
    Exit;
  end;
  Auto.DoTick;
  FormPaint(nil);
  Inc(i);
  if i=10 then begin
    oldframetime:=frametime;
    frametime:=GetTickCount;
    i:=0;
  end;
  Canvas.TextOut(10, 40, FloatToStrF(10000/(frametime-oldframetime), ffFixed, 3, 1));
  if ((Auto.FrontPoint.Y-1)<1) and ((Auto.FrontPoint.X)<0.001) then begin
    oldlaptime:=laptime;
    laptime:=GetTickCount;
    if (laptime-oldlaptime)>1000 then begin
      if (laptime-oldlaptime)<besttime then
        besttime:=laptime-oldlaptime;
      curtime:=laptime-oldlaptime;
      Dec(Laps);
      Inc(TotalTime, CurTime);
    end;
  end;
  Canvas.TextOut(300, 40, FloatToStr((curtime)/1000));
  Canvas.TextOut(300, 60, FloatToStr(besttime/1000));
  Canvas.TextOut(200, 80, 'Laps '+IntToStr(Laps));
  Canvas.TextOut(400, 80, 'Time: '+MTimeToStr(TotalTime));
end end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Closed:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(glrc);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Draw.Draw;
  SwapBuffers(Canvas.Handle);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_LEFT: Auto.DoTurn(tsLeft);
    VK_RIGHT: Auto.DoTurn(tsRight);
    VK_UP: Auto.DoAccelerate;
    VK_DOWN: Auto.DoBrake;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_LEFT: Auto.StopTurning;
    VK_RIGHT: Auto.StopTurning;
    VK_UP: Auto.StopAccelerate;
    VK_DOWN: Auto.StopBrake;
  end;
end;

end.

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 2)
Ответ на: комментарий от trex6

Да так, чтобы потом сравнить с несырой работой и поржать.

puding
() автор топика
Ответ на: комментарий от redgremlin

За 10 лет быдлокод становится терпким вином.
Так что не стесняйся.

Если готов показать его не публично: trex6 jabber.ru

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Вам точно хочется такое читать (комментариев нет и у меня тоже, UniIO и ExtObjs - мои отдельные велосипеды, которые в данной проге используются эпизодически, являясь при том весьма жирными):

unit race_physics;

interface
uses SysUtils, OpenGL, Math, UniIO, ExtObjs, Windows;

type
  TTrackPoint = record
    X, Y, Z: GLfloat;
  end;

  TTrackLine = record
    X1, Y1, Z1: GLfloat;
    X2, Y2, Z2: GLfloat;
  end;

  TTrack = class (TObject)
  private
    FTrack: array of TTrackLIne;
    FLB: array of TTrackLine;
    FRB: array of TTrackLine;
    FTrackCount: Integer;
    FLBCount: Integer;
    FRBCount: Integer;
    function GetLB(Index: Integer): TTrackLine;
    function GetRB(Index: Integer): TTrackLine;
    function GetTrack(Index: Integer): TTrackLine;
  public
    constructor Create;

    procedure LoadFromFile(const FileName: string);
    property Track[Index: Integer]: TTrackLine read GetTrack;
    property LeftBorder[Index: Integer]: TTrackLine read GetLB;
    property RightBorder[Index: Integer]: TTrackLine read GetRB;
    property TrackLinesCount: Integer read FTrackCount;
    property LeftBorderLinesCount: Integer read FLBCount;
    property RightBorderLinesCount: Integer read FRBCount;
  end;

  TControlOptions = record
    MaxSpeed: GLfloat;
    Acceleration: GLfloat;
    Brake: GLfloat;
    Ac: GLfloat;
    dAc: GLfloat;
    DecSpeed: GLfloat;
    DecSpeedMin: GLfloat;
    MaxTurn: GLfloat;
    DecTurn: GLfloat;
    AddTurn: GLfloat;
  end;
  TTurnSide = (tsLeft, tsRight);

  TAuto = class (TObject)
  private
    FTrack: TTrack;
    FOptions: TControlOptions;
    FSpeed: GLfloat;
    FAngle: GLfloat;
    FTurnAngle: GLfloat;
    FTurning: Boolean;
    FTurnSide: TTurnSide;
    FAccelerating: Boolean;
    FBraking: Boolean;
    FRearPos: TTrackPoint;
    FFrontPos: TTrackPoint;
    FLastTick: Cardinal;
    //optimization
    l: GLfloat;
    procedure SetTrack(const Value: TTrack);
  public
    constructor Create(Options: TControlOptions; ATrack: TTrack; RearPos, FrontPos: TTrackPoint);

    procedure DoTick;
    procedure DoTurn(TurnSide: TTurnSide);
    procedure DoAccelerate;
    procedure DoBrake;
    procedure StopTurning;
    procedure StopAccelerate;
    procedure StopBrake;

    property Speed: GLfloat read FSpeed;
    property IsBraking: Boolean read FBraking;
    property IsAccelerating: Boolean read FAccelerating;
    property IsTurning: Boolean read FTurning;
    property RearPoint: TTrackPoint read FRearPos;
    property FrontPoint: TTrackPoint read FFrontPos;
    property Track: TTrack read FTrack write SetTrack;
  end;

function TrackPoint(const X,Y,Z: GLfloat): TTrackPoint;
function ControlOptions(const MaxSpeed, Acceleration, Brake, Ac, dAc, DecSpeed, DecSpeedMin, MaxTurn, DecTurn, AddTurn: GLfloat): TControlOptions;

implementation

{ TTrack }

constructor TTrack.Create;
begin
  inherited;

  FLBCount:=0;
  FRBCount:=0;
  FTrackCount:=0;
end;

function TTrack.GetLB(Index: Integer): TTrackLine;
begin
  Result:=FLB[Index mod FLBCount];
end;

function TTrack.GetRB(Index: Integer): TTrackLine;
begin
  Result:=FRB[Index mod FRBCount];
end;

function TTrack.GetTrack(Index: Integer): TTrackLine;
begin
  Result:=FTrack[Index mod FTrackCount];
end;

procedure TTrack.LoadFromFile(const FileName: string);
var
  inf: TStreamIniFile;
  inf_ios, sub_ios: TIOStream;
  sub_trk, sub_lb, sub_rb: string;
  i: Integer;
begin
  inf_ios:=TIOStream.Create(FileName+'\track.info', fmOpenRead);
  inf:=TStreamIniFile.Create(inf_ios);

  FTrackCount:=inf.ReadInteger('Layout', 'TrackLinesCount', 0);
  FLBCount:=inf.ReadInteger('Layout', 'LeftBorderLinesCount', 0);
  FRBCount:=inf.ReadInteger('Layout', 'RightBorderLinesCount', 0);
  sub_trk:=inf.ReadString('Layout', 'TrackLayoutFile', '');
  sub_lb:=inf.ReadString('Layout', 'LeftBorderLayoutFile', '');
  sub_rb:=inf.ReadString('Layout', 'RightBorderLayoutFile', '');

  sub_ios:=TIOStream.Create(FileName+'\'+sub_trk, fmOpenRead);
    SetLength(FTrack, FTrackCount);
    for i:=0 to FTrackCount-1 do
      sub_ios.Read(FTrack[i], SizeOf(TTrackLine));
  sub_ios.Free;
  sub_ios:=TIOStream.Create(FileName+'\'+sub_lb, fmOpenRead);
    SetLength(FLB, FLBCount);
    for i:=0 to FLBCount-1 do
      sub_ios.Read(FLB[i], SizeOf(TTrackLine));
  sub_ios.Free;
  sub_ios:=TIOStream.Create(FileName+'\'+sub_rb, fmOpenRead);
    SetLength(FRB, FRBCount);
    for i:=0 to FRBCount-1 do
      sub_ios.Read(FRB[i], SizeOf(TTrackLine));
  sub_ios.Free;

  inf.Free;
  inf_ios.Free;
end;

{ TAuto }

constructor TAuto.Create(Options: TControlOptions; ATrack: TTrack; RearPos, FrontPos: TTrackPoint);
begin
  FOptions:=Options;
  FTrack:=ATrack;
  FSpeed:=0;
  FAngle:=0;
  FTurnAngle:=0;
  FTurning:=False;
  FAccelerating:=False;
  FBraking:=False;
  FRearPos:=RearPos;
  FFrontPos:=FrontPos;
  FLastTick:=0;
end;

procedure TAuto.DoAccelerate;
begin
  FAccelerating:=True;
end;

procedure TAuto.DoBrake;
begin
  FBraking:=True;
end;

procedure TAuto.DoTick;
var
  dt: GLfloat;
  dl, dx, dy, decsp: GLfloat;
  fi: GLfloat;
  AMaxTurn: GLfloat;
begin
  if FLastTick=0 then begin
    l:=Sqrt(Sqr(FRearPos.X-FFrontPos.X)+Sqr(FRearPos.Y-FFrontPos.Y));
    FLastTick:=GetTickCount;
    Exit;
  end;
  dt:=(GetTickCount-FLastTick)/1000;
  if dt<0.001 then
    Exit;

  dl:=FSpeed*dt;

  dx:=(FFrontPos.X-FRearPos.X)*dl/l;
  dy:=(FFrontPos.Y-FRearPos.Y)*dl/l;
  with FRearPos do begin
    X:=X+dx;
    Y:=Y+dy;
  end;
  with FFrontPos do begin
    X:=X+dx;
    Y:=Y+dy;
  end;
  if FTurnAngle<>0 then with FFrontPos do begin
    fi:=FTurnAngle-ArcSin((l-dl)/l*sin(FTurnAngle));
    dy:=(X-FRearPos.X)*sin(fi)+(Y-FRearPos.Y)*cos(fi);
    dx:=(X-FRearPos.X)*cos(fi)-(Y-FRearPos.Y)*sin(fi);
    X:=FRearPos.X+dx;
    Y:=FRearPos.Y+dy;
  end;

  AMaxTurn:=Min(FOptions.MaxTurn, dt*(FOptions.Ac+FOptions.dAc*FSpeed)/FSpeed);

  decsp:=Max(FOptions.DecSpeed*FSpeed*dt, FOptions.DecSpeedMin*dt);
  if FAccelerating then
    FSpeed:=FSpeed+FOptions.Acceleration*dt
  else if FBraking then
    FSpeed:=FSpeed-FOptions.Brake*dt
  else if FSpeed>decsp then
    FSpeed:=FSpeed-decsp
  else
    FSpeed:=0;
  if FSpeed<0 then
    FSpeed:=0;
  if FSpeed>FOptions.MaxSpeed then
    FSpeed:=FOptions.MaxSpeed;

  if FTurning then
    if FTurnSide=tsLeft then
      if FTurnAngle>-AMaxTurn then
        FTurnAngle:=FTurnAngle-FOptions.AddTurn*dt
      else
        FTurnAngle:=-AMaxTurn
    else
      if FTurnAngle<AMaxTurn then
        FTurnAngle:=FTurnAngle+FOptions.AddTurn*dt
      else
        FTurnAngle:=AMaxTurn
  else
    if FTurnAngle>FOptions.DecTurn*dt then
      FTurnAngle:=FTurnAngle-FOptions.DecTurn*dt
    else if FTurnAngle<(-FOptions.DecTurn*dt) then
      FTurnAngle:=FTurnAngle+FOptions.DecTurn*dt
    else
      FTurnAngle:=0;
  FLastTick:=GetTickCount;
end;

procedure TAuto.DoTurn(TurnSide: TTurnSide);
begin
  FTurning:=True;
  FTurnSide:=TurnSide;
end;

procedure TAuto.SetTrack(const Value: TTrack);
begin
  FTrack := Value;
end;

function TrackPoint(const X,Y,Z: GLfloat): TTrackPoint;
begin
  Result.X:=X;
  Result.Y:=Y;
  Result.Z:=Z;
end;

function ControlOptions(const MaxSpeed, Acceleration, Brake, Ac, dAc, DecSpeed, DecSpeedMin, MaxTurn, DecTurn, AddTurn: GLfloat): TControlOptions;
begin
  Result.MaxSpeed:=MaxSpeed;
  Result.Acceleration:=Acceleration;
  Result.Brake:=Brake;
  Result.Ac:=Ac;
  Result.dAc:=dAc;
  Result.DecSpeed:=DecSpeed;
  Result.DecSpeedMin:=DecSpeedMin;
  Result.MaxTurn:=MaxTurn;
  Result.DecTurn:=DecTurn;
  Result.AddTurn:=AddTurn;
end;

procedure TAuto.StopAccelerate;
begin
  FAccelerating:=False;
end;

procedure TAuto.StopBrake;
begin
  FBraking:=False;
end;

procedure TAuto.StopTurning;
begin
  FTurning:=False;
end;

end.

redgremlin ★★★★★
()
Ответ на: комментарий от Rosko

Дело в том, что показывать то пока, собственно, и нечего.

puding
() автор топика

ради бога, сделай классический шутанчик с аптечками, как квейк2. и вообще, выложи на гитхаб, я готов контрибьютить.

x0r ★★★★★
()

но если выйдет хотя бы бета, да еще и с интересным сюжетом, может кому-нибудь понравится :)

У меня для тебя плохие новости...

Перед тем как писать свой велосипед ты смотрел как работают большие дяди и таки как делаются современные игры?

Ты даже не представляешь насколько это объемный кусок работы за который ты взялся.

Hint: посмотри для начала на UDK, а в нем на такие вещи как Kismet, Matinee.

anonymous_
()
Ответ на: комментарий от anonymous_

для собственных поделок можно либо делать игру без движка, либо движок без игры, работы и так завались будет. тянуть и то и то практически не реально. можно запилить движок, а потом пилить игру, но это будет 2 последовательные задачи.

x0r ★★★★★
()
Ответ на: комментарий от x0r

Да, я так и хочу, старый добрый шутер с аптечками. Только вот сюжетец бы подкинуть, да название потом придумать.

puding
() автор топика
Ответ на: комментарий от anonymous_

Где-то я читал, что писать нужно не движок, а игру. И вообще, я считаю, что движок - это и есть игра, только без контента. Его нужно только вычленить на последних стадиях (и, если есть тулзы, смешать с ними и получить SDK).

И вообще, эту тему надо закрывать. Посмотрим на v0.1 pre-alpha 2 через месяц.

puding
() автор топика
Ответ на: комментарий от redgremlin

Показательно, что игры пишут те кто не знает как но очень хочет, а те кто умеет - могут написать в два раза лучше за меньшее время но не хотят т.к. знают как.

Deleted
()
Ответ на: комментарий от X10Dead

Да не клепаю я движок, я говорю, если кому-то он будет нужен, то можно его из игры вынести в отдельный проект.

puding
() автор топика

А почему бы не взять какой-нибудь DarkPlaces, напилить на нём игру, а патчи к движку вернуть в апстрим? Всем же хорошо будет, в этом и есть сила опенсорца, разве нет?

OldWiseCat ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.