Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 21, 2025 13:36

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Grafik lässt sich nicht anueigen
BeitragVerfasst: Do Jun 21, 2012 21:20 
Offline
DGL Member

Registriert: Fr Dez 11, 2009 19:15
Beiträge: 2
Hallo Gemeinde,

habe ein Skript abgeändert.
Wie kann ich aber nun eine Texture einbinden, ohne das mir Delphi oder die App abstürzt? (var Texture)

Gruß
der paule

Code:
  1. unit SpielFeldUnit;
  2. interface
  3. uses classes,opengl,Controls,Pathfinding8,
  4.   sdl,dglOpenGL, glBitmap;
  5.  
  6. var
  7.   Texture: TglBitmap2D;
  8.  
  9. type
  10.  TEinheit=class;
  11.  TBefehlsTyp=(BT_STAND,BT_MOVE);
  12.  TEinheitenTyp=Word;
  13.  TPlayer=(plnone,pl1,pl2,plNeutral);
  14.  
  15.  TFeld= object
  16.  public
  17.    Owner:TPlayer;
  18.  end;
  19.  TSpielFeld=class(TPersistent)
  20.  private
  21.    FWidth:Word;
  22.    FHeight:Word;
  23.    procedure ZeichneSpielFeld;
  24.    procedure ZeichneEinheiten;
  25.  public
  26.    Feld: array of array of TFeld;
  27.    Einheit:array of TEinheit;
  28.    SelectedUnitIndex:Integer;
  29.    Constructor Create;
  30.    destructor Destroy; override;
  31.    function ErstelleEinheit(const EinheitenTyp:TEinheitenTyp;const NewOwner:TPlayer;const XPos,YPos:Word):Boolean;
  32.    procedure Draw;
  33.    procedure SetSize(NewWidth,NewHeight:Word);
  34.    procedure Update;
  35.    procedure FloodFill(Player:TPlayer);
  36.    procedure OnSelection(Selected: Integer;Button: TMouseButton);
  37.  
  38.  published
  39.    property Width:Word read FWidth ;
  40.    property Height:Word read FHeight;
  41.  end;
  42.  
  43.  //TAnimationType=(ANI_BIRTH,ANI_STAND,ANI_MOVE_LEFT,ANI_MOVE_RIGHT,ANI_MOVE_UP,ANI_MOVE_DOWN);
  44.  
  45.  
  46.  TAnimation=record
  47.    Pos:Word;
  48.    Length:Word;
  49.    Typ:TAnimationType;
  50.  end;
  51.  
  52.  
  53.  TBefehl=record
  54.    Case Typ:TBefehlsTyp of
  55.     BT_STAND:();
  56.     BT_MOVE:(X,Y:Word);
  57.    end;
  58.  
  59.  
  60.  TEinheit=class
  61.  public
  62.    Ani:TAnimation;
  63.    Befehl:TBefehl;
  64.    X,Y:Word;
  65.    Owner:TPlayer;
  66.    Typ:TEinheitenTyp;
  67.    constructor Create(VomTyp:TEinheitenTyp;NewOwner:TPlayer;XPos,YPos:Word);overload;
  68.    Constructor Create;overload;
  69.    procedure Draw;
  70.    procedure Update;
  71.    function GetRealX:Double;
  72.    function GetRealY:Double;
  73.  end;
  74.  
  75.  
  76.  
  77. const
  78.  FarbevonSpieler:array [TPlayer,0..2]of Double=((0.5,0.5,0.5), //plnone
  79.                                                 (0,1,0),       //pl1
  80.                                                 (0,0,1),       //pl2
  81.                                                 (1,0,0));      //plneutral
  82.  
  83.  LangsamkeitsFaktor:Byte=3;//Muss größer als 1 sein
  84.  
  85.  
  86.  
  87. var SpielFeld:TSpielFeld;
  88.     GitteristSichtbar:Boolean=false;
  89. implementation
  90.  
  91.  
  92. procedure ErstelleKreis(Radius:Real;PunkteAnzahl:Word);
  93. var
  94.   PunktNummer: integer;
  95. begin
  96.   glbegin(gl_Line_Loop);
  97.     for PunktNummer := 0 to PunkteAnzahl do
  98.     glvertex3f( (Radius *sin(Punktnummer/(PunkteAnzahl/(2*pi)))),(Radius *cos(Punktnummer/(PunkteAnzahl/(2*pi)))),0);
  99.   glend;
  100.  
  101.   glEnable(GL_TEXTURE_2D);
  102. end;
  103.  
  104. procedure TEinheit.Draw;
  105. begin
  106.  glcolor3f(FarbevonSpieler[Owner,0],FarbevonSpieler[Owner,1],FarbevonSpieler[Owner,2]);
  107.  gltranslatef(GetRealX,GetRealY,0);
  108.  
  109.  case Typ of
  110.  0:
  111.  begin
  112.    ErstelleKreis(0.35,20);
  113.      Texture.Bind;
  114.   glbegin(GL_QUADS);
  115.     glTexCoord2i(1, 1);
  116.     glVertex2i(Texture.Width, Texture.Height);
  117.   glend;
  118.   Texture.unBind;
  119.    end;
  120.  end;
  121. // gltranslatef(-GetRealX,-GetRealY,0);
  122. end;
  123. constructor TEinheit.Create(VomTyp:TEinheitenTyp;NewOwner:TPlayer;XPos,YPos:Word);
  124. begin
  125.  inherited Create;
  126.  Typ := VomTyp;
  127.  Owner:= NewOwner;
  128.  X:= XPos;
  129.  Y:= YPos;
  130.  Ani.Length := 100;
  131. end;
  132. constructor TEinheit.Create;
  133. begin
  134. inherited;
  135. end;
  136.  
  137. procedure TEinheit.Update;
  138. begin
  139.  Inc(Ani.Pos);
  140.  if not((Ani.Pos >= Ani.Length) or (Ani.Typ = ANI_STAND))then exit;
  141.  
  142.  
  143.  {Neue Animation bestimmen}
  144.  case Befehl.Typ of
  145.   BT_STAND:
  146.   begin
  147.    if (Ani.Pos >= Ani.Length) then Ani.Pos := 0;
  148.    Ani.Typ := ANI_STAND;
  149.    Ani.Length := 1000;
  150.   end;
  151.   BT_MOVE:
  152.   begin
  153.    if (X = Befehl.x) and (Y = Befehl.Y) then
  154.    begin //Ziel erreicht
  155.     Befehl.typ := BT_STAND ;
  156.     Ani.Pos := 0;
  157.     Ani.Typ := ANI_STAND;
  158.     Ani.length := 1000;
  159.     exit;
  160.    end;
  161.    Ani.Pos := 0;
  162.    Ani.Typ :=FindPath(Befehl.X,Befehl.Y,self);   ;//Hier muss der variante Teil hin
  163.    Ani.Length := 10;
  164.    case Ani.Typ of
  165.     ANI_MOVE_LEFT :  X := X-1;
  166.     ANI_MOVE_Right:  X := X+1;
  167.     ANI_MOVE_UP   :  Y := Y+1;
  168.     ANI_MOVE_DOWN :  Y := Y-1;
  169.  
  170.     ANI_MOVE_LEFTDOWN: begin X:= X-1; Y:= Y-1  end;
  171.     ANI_MOVE_RIGHTDOWN: begin X:= X+1; Y:= Y-1  end;
  172.     ANI_MOVE_LEFTUP: begin X:= X-1; Y:= Y+1  end;
  173.     ANI_MOVE_RIGHTUP: begin X:= X+1; Y:= Y+1  end;
  174.    end;
  175.    if SpielFeld.Feld[X,Y].Owner <> Owner then Ani.Length := Ani.Length*LangsamkeitsFaktor;
  176.   end;
  177.  end;
  178. end;
  179. function TEinheit.GetRealX:Double;
  180. begin
  181.  case Ani.Typ of
  182.   ANI_MOVE_RIGHT,
  183.   ANI_MOVE_RIGHTUP,
  184.   ANI_MOVE_RIGHTDOWN: result:= X -1 +Ani.Pos / Ani.Length +0.5;
  185.  
  186.   ANI_MOVE_LEFT,
  187.   ANI_MOVE_LEFTUP,
  188.   ANI_MOVE_LEFTDOWN:result:= X +1 -Ani.Pos / Ani.Length +0.5;
  189.   else
  190.    result := X +0.5;
  191.  end;
  192. end;
  193. function TEinheit.GetRealY:Double;
  194. begin
  195.  case Ani.Typ of
  196.   ANI_MOVE_UP,
  197.   ANI_MOVE_RIGHTUP,
  198.   ANI_MOVE_LEFTUP: result:= Y -1 +Ani.Pos / Ani.Length +0.5;
  199.  
  200.   ANI_MOVE_DOWN,
  201.   ANI_MOVE_LEFTDOWN,
  202.   ANI_MOVE_RIGHTDOWN: result:= Y +1 -Ani.Pos / Ani.Length +0.5;
  203.  else
  204.   result := Y +0.5;
  205.  end;
  206. end;
  207.  
  208.  
  209. procedure TSpielFeld.Update;
  210. var i:Integer;
  211. begin
  212.  for I:= 0 to High(Einheit) do
  213.  Einheit[I].Update;
  214.  
  215. end;
  216.  
  217. function TSpielFeld.ErstelleEinheit(const EinheitenTyp:TEinheitenTyp;const NewOwner:TPlayer;const XPos,YPos:Word):Boolean;
  218. begin
  219.  if (XPos > FWidth) or (YPos > FHeight) or (Feld[XPos,YPos].Owner = plneutral)  then
  220.  begin
  221.   result := false;
  222.   exit;
  223.  end;
  224.  
  225.  SetLength(Einheit,Length(Einheit)+1);
  226.  Einheit[High(Einheit)] := TEinheit.Create(EinheitenTyp,NewOwner,XPos,YPos);
  227.  //Feld[XPos,YPos].Owner := NewOwner;
  228.  result := true;
  229. end;
  230.  
  231. procedure TSpielFeld.Draw;
  232. begin
  233.  glinitnames;
  234.  glpushname(0);
  235.  
  236.  glrotatef(-20,-0,8,-45);
  237.  gltranslatef(-0.9,-0.3,-1.7);
  238.  
  239.  glScalef(1/FWidth,1/FWidth,1/FWidth);
  240.  
  241.  {Zeichnen}
  242.  ZeichneSpielFeld;
  243.  ZeichneEinheiten;
  244. end;
  245.  
  246. procedure TSpielFeld.ZeichneEinheiten;
  247. var I,BelegteNamen:Integer;
  248. begin
  249.  BelegteNamen :=  Fwidth*Fheight +1 ;
  250.  for I :=  0 to High(Einheit) do
  251.  begin
  252.   glloadname(I + BelegteNamen);
  253.   Einheit[I].Draw;
  254.  end;
  255.  //Selektions-Ring erstellen
  256.  if (high(Einheit) >= SelectedUnitIndex) and (SelectedUnitIndex >= 0) then
  257.  begin
  258.  gltranslatef(Einheit[SelectedUnitIndex].GetRealX,Einheit[SelectedUnitIndex].GetRealY,0.1) ;
  259.  glcolor3f(1,0.4,0);
  260.  ErstelleKreis(0.45,20);
  261.  gltranslatef(-Einheit[SelectedUnitIndex].GetRealX,-Einheit[SelectedUnitIndex].GetRealY,-0.1);
  262.  end;
  263. end;
  264.  
  265.  
  266. procedure TSpielFeld.ZeichneSpielFeld;
  267. var I,X,Y:Integer ;
  268. begin
  269.  for Y := 0 to  FHeight-1 do
  270.  for X := 0 to  FWidth-1 do
  271.  begin
  272.   I:= (Y*FWidth +X+1);
  273.   glloadname(I);
  274.   glcolor3f(FarbevonSpieler[Feld[X,Y].Owner,0]*0.5,FarbevonSpieler[Feld[X,Y].Owner,1]*0.5,FarbevonSpieler[Feld[X,Y].Owner,2]*0.5);
  275.   glbegin(GL_QUADS) ;
  276.    glTexCoord2f(0,1); glvertex3f(x,y+1,0);
  277.    glTexCoord2f(1,1); glvertex3f(x+1,y+1,0);
  278.    glTexCoord2f(1,0);glvertex3f(x +1,y,0);
  279.    glTexCoord2f(0,0);glvertex3f(x,y,0);
  280.   glend();
  281.  end;
  282.  
  283.  if GitteristSichtbar then
  284.  for Y := 0 to  FHeight-1 do
  285.  for X := 0 to  FWidth-1 do
  286.  begin
  287.   glcolor3f(1,1,0);
  288.   glbegin(GL_LINE_LOOP) ;
  289.    glTexCoord2f(0,1); glvertex3f(x,y+1,0.001);
  290.    glTexCoord2f(1,1); glvertex3f(x+1,y+1,0.001);
  291.    glTexCoord2f(1,0);glvertex3f(x +1,y,0.001);
  292.    glTexCoord2f(0,0);glvertex3f(x,y,0.001);
  293.   glend();
  294.  end;
  295.  
  296.  
  297. end;
  298.  
  299. procedure TSpielFeld.OnSelection(Selected: Integer;Button: TMouseButton);
  300. begin
  301.  case Button of
  302.  mbleft: if (Selected >= FWidth*FHeight) and ( Selected-FWidth*FHeight-1 <= High(Einheit) )
  303.         then  SelectedUnitIndex:= (Selected-FWidth*FHeight-1);
  304.  mbRight:if (Selected <= FWidth*FHeight) and (Selected > 0) then
  305.          if (high(Einheit) >= SelectedUnitIndex) and (SelectedUnitIndex >= 0) then
  306.          begin
  307.           Einheit[SelectedUnitIndex].Befehl.Typ := BT_MOVE;
  308.           Einheit[SelectedUnitIndex].Befehl.X := ((Selected-1) mod FWidth);
  309.           Einheit[SelectedUnitIndex].Befehl.Y := ((Selected-1) div FWidth);
  310.          end;
  311.  
  312.  end;
  313. end;
  314.  
  315. procedure TSpielFeld.SetSize(NewWidth,NewHeight:Word);
  316. var I:Integer;
  317. begin
  318.  for I := 0 to High(Einheit) do Einheit[I].free;
  319.  SetLength(Einheit,0);
  320.  FWidth  := NewWidth;
  321.  FHeight := NewHeight;
  322.  SetLength(Feld,NewWidth,NewHeight);
  323. end;
  324.  
  325. procedure TSpielFeld.FloodFill(Player:TPlayer);
  326. var X,Y:Integer;
  327. begin
  328.  for X:= 0 to FWidth-1 do
  329.  for Y := 0 to FHeight-1 do
  330.  Feld[X,Y].Owner := Player;
  331. end;
  332. Constructor TSpielFeld.Create;
  333. begin
  334.  inherited;
  335.  SetSize(10,10);
  336. end;
  337. destructor TSpielFeld.Destroy;
  338. var I:Integer;
  339. begin
  340.  for I := 0 to High(Einheit) do Einheit[I].free;
  341.  SetLength(Einheit,0);
  342.  SetSize(0,0);
  343. end;
  344.  
  345. initialization
  346.  SpielFeld := TSpielFeld.create;
  347.  
  348.  Texture := TglBitmap2D.Create('unbenannt.bmp');
  349.  Texture.FreeDataAfterGenTexture := False;
  350.  Texture.GenTexture;
  351.  
  352.  
  353.  //Beispiel1
  354.  SpielFeld.SetSize(7,6);
  355.  SpielFeld.floodfill(pl1);
  356.  SpielFeld.ErstelleEinheit(0,pl1,5,0);
  357.  
  358.  SpielFeld.Feld[3,1].Owner := plneutral;
  359.  SpielFeld.Feld[3,2].Owner := plneutral;
  360.  SpielFeld.Feld[3,0].Owner := plneutral;
  361.  SpielFeld.Feld[2,2].Owner := plneutral;
  362.  SpielFeld.Feld[4,2].Owner := plneutral;
  363.  SpielFeld.Feld[1,2].Owner := plneutral;
  364.  SpielFeld.Feld[5,2].Owner := plneutral;
  365.  
  366.  (*
  367.  //Beispiel3
  368.  SpielFeld.SetSize(7,7);
  369.  SpielFeld.floodfill(pl1);
  370.  SpielFeld.ErstelleEinheit(0,pl2,0,6);
  371.  
  372.  SpielFeld.Feld[2,2].Owner := plneutral;
  373.  SpielFeld.Feld[2,1].Owner := plneutral;
  374.  SpielFeld.Feld[0,1].Owner := plneutral;
  375.  SpielFeld.Feld[0,0].Owner := plneutral;
  376.  SpielFeld.Feld[3,3].Owner := plneutral;
  377.  SpielFeld.Feld[2,3].Owner := plneutral;
  378.  SpielFeld.Feld[3,4].Owner := plneutral;
  379.  SpielFeld.Feld[3,6].Owner := plneutral;
  380.  SpielFeld.Feld[5,6].Owner := pl2;
  381.  SpielFeld.Feld[4,6].Owner := pl2;
  382.  SpielFeld.Feld[5,5].Owner := pl2;
  383.  SpielFeld.Feld[6,5].Owner := pl2;
  384.  SpielFeld.Feld[6,6].Owner := pl2;
  385.  SpielFeld.Feld[4,5].Owner := pl2;
  386.  SpielFeld.Feld[4,4].Owner := pl2;
  387.  SpielFeld.Feld[3,5].Owner := pl2;
  388.  SpielFeld.Feld[4,5].Owner := pl2;
  389.  SpielFeld.Feld[5,4].Owner := pl2;
  390.  SpielFeld.Feld[6,4].Owner := pl2;
  391.  SpielFeld.Feld[6,3].Owner := plneutral;
  392.  SpielFeld.Feld[6,2].Owner := plneutral;
  393.  SpielFeld.Feld[5,3].Owner := plneutral;
  394.  SpielFeld.Feld[4,0].Owner := plneutral;
  395.  SpielFeld.Feld[4,1].Owner := plneutral;
  396.  SpielFeld.Feld[6,1].Owner := plneutral;
  397.  *)
  398.  
  399.  
  400.  
  401.  (*
  402.  SpielFeld.SetSize(8,7);
  403.  SpielFeld.floodfill(pl1);
  404.  SpielFeld.ErstelleEinheit(0,pl1,1,3);
  405.  
  406.  SpielFeld.Feld[6,2].Owner := plneutral;
  407.  SpielFeld.Feld[2,1].Owner := plneutral;
  408.  SpielFeld.Feld[3,1].Owner := plneutral;
  409.  SpielFeld.Feld[3,2].Owner := plneutral;
  410.  SpielFeld.Feld[3,3].Owner := plneutral;
  411.  SpielFeld.Feld[3,4].Owner := plneutral;
  412.  SpielFeld.Feld[3,6].Owner := plneutral;
  413.  SpielFeld.Feld[4,4].Owner := plneutral;
  414.  SpielFeld.Feld[5,4].Owner := plneutral;
  415.  SpielFeld.Feld[5,5].Owner := plneutral;
  416.  SpielFeld.Feld[5,0].Owner := plneutral;
  417.  SpielFeld.Feld[5,1].Owner := plneutral;
  418.  SpielFeld.Feld[5,2].Owner := plneutral;
  419.  *)
  420.  
  421.  
  422.  
  423. finalization
  424.  SpielFeld.free;
  425.  
  426. end.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 21, 2012 23:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
paule, bitte sag doch woher du das Skript hast und was für Änderungen du genau gemacht hast.
Das macht es leichter dir zu helfen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 15:14 
Offline
DGL Member

Registriert: Fr Dez 11, 2009 19:15
Beiträge: 2
gukst du hier: http://wiki.delphigl.com/index.php/Tutorial_pathfinding


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 23, 2012 08:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Welcher Fehler kommt denn genau? Du sagst dass die Anwendung oder Delphi abstürzt, aber das ist sehr wage. Bekommst du eine Zugriffsverletzung oder wird nichts angezeigt? Gehts ohne Textur problemlos?

Du erstellst die Textur zudem im Initialization-Teil der Unit, ist zu diesem Zeitpunkt OpenGL bereits initialisiert und ein Renderkontext aktiv? Wenn du das nicht in einer vorher geladenen Unit im Initialization-Teil machst, dann ist zum Zeitpunkt zu dem du hier die Textur erstellst ja noch garkein gültiger Renderkontext vorhanden, weshalb es dann beim Laden der Textur knallt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]