AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Probleme bei Leveleditor (Grid in Array speichern)
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme bei Leveleditor (Grid in Array speichern)

Offene Frage von "Red six"
Ein Thema von Red six · begonnen am 16. Aug 2005 · letzter Beitrag vom 17. Aug 2005
 
Red six

Registriert seit: 3. Aug 2005
23 Beiträge
 
#1

Probleme bei Leveleditor (Grid in Array speichern)

  Alt 16. Aug 2005, 21:20
Tag leute!


Ich bin grade dabei einen Leveleditor für mein 2D Spiel zu bauen. Ich hab eine ScrollBoxEx (Die ich in diesem Forum gefunden habe, Danke an dieser Stelle) in der eine PaintBox ist auf welche ein Raster gezeichnet wird. Auf klick wird ermittelt in welchem Kästchen die Maus ist (hab ich villeicht etwas kompliziert gemacht aber es geht), dann soll auf Knopfdruck ein Bild in das entsprechende kästchen gezeichnet werden. Dieses wird auch in einem Array gespeichert damit es nicht verschwindet wenn das Raster neu gezeichnet wird. Nun hab ich aber das Problem dass wenn ich mehrere Bilder einfüge manche von ihnen wieder verschwinden... Da muss irgentwo ein Fehler im Array sein! Außerdem bekomme ich beim Beenden den Fehler "Ungültige Zeigeroperation"... Wäre super wenn sich jemand kurz zeitnehmen würde und das ganze mal anschauen würde


Ich stell einfach den ganzen source rein!

Delphi-Quellcode:

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, ScrollBoxEx, StdCtrls, ImgList;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Neu1: TMenuItem;
    ffnen1: TMenuItem;
    Speichern1: TMenuItem;
    Speicherunter1: TMenuItem;
    LevelScroller: TScrollBoxEx;
    Grid: TPaintBox;
    MenuPanel: TPanel;
    _xypos: TLabel;
    Label1: TLabel;
    ObjectList: TImageList;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure GridMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure LevelScrollerVScroll(Sender: TObject; Position: Integer);
    procedure LevelScrollerHScroll(Sender: TObject; Position: Integer);
    procedure FormActivate(Sender: TObject);
    procedure DrawGrid;
    function CheckX(X: Integer): Integer;
    function CheckY(Y: Integer): Integer;
    procedure DrawImage(X, Y, ImageIndex: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type ObjectRec = Record
  X, Y: Integer;
  Filled: Boolean;
  ImageIndex: Integer;
end;


var
  MainForm: TMainForm;
  xPos, yPos: Integer;
  ObjectArray: Array of ObjectRec;

implementation

{$R *.dfm}

procedure TMainForm.DrawGrid;
var
  x, y, i, pixX, pixY: Integer;
  Clear: TRect;
begin
  //GRID

  Grid.Refresh;

  i := 0;

  Clear.Left := 0;
  Clear.Top := 0;
  Clear.Right := Grid.Width;
  Clear.Bottom := Grid.Height;

  Grid.Canvas.Rectangle(Clear);
  Grid.Canvas.Brush.Color := clAppWorkSpace;
  Grid.Canvas.FillRect(Clear);

  for x := 0 to Grid.Width do
  begin
    Grid.Canvas.MoveTo(i, 0);
    Grid.Canvas.LineTo(i, Grid.Height);
    inc(i, 20);
  end;

  i := 0;

  for y := 0 to Grid.Height do
  begin
    Grid.Canvas.MoveTo(0, i);
    Grid.Canvas.LineTo(Grid.Width, i);
    inc(i, 20);
  end;


  //GRID

  //ADD IMAGES

  for i := 0 to (Grid.Width div 20 * Grid.Height div 20) do
  begin
    if ObjectArray[i].Filled = True then
      DrawImage(ObjectArray[i].X, ObjectArray[i].Y, ObjectArray[i].ImageIndex);
  end;

  //ADD IMAGES


  // HIGHLIGHT

  Grid.Canvas.Pen.Color := clYellow;

  pixX := xPos * 20;
  pixY := yPos * 20;

  Grid.Canvas.MoveTo(pixX, pixY);
  Grid.Canvas.LineTo(pixX, pixY+20);
  Grid.Canvas.LineTo(pixX+20, pixY+20);
  Grid.Canvas.LineTo(pixX+20, pixY);
  Grid.Canvas.LineTo(pixX, pixY);
  
  Grid.Canvas.Pen.Color := clBlack;

  //HIGHLIGHT
end;

procedure TMainForm.FormActivate(Sender: TObject);
begin
  DrawGrid;
end;

procedure TMainForm.LevelScrollerHScroll(Sender: TObject; Position: Integer);
begin
  DrawGrid;
end;

procedure TMainForm.LevelScrollerVScroll(Sender: TObject; Position: Integer);
begin
  DrawGrid;
end;

function TMainForm.CheckX(X: Integer): Integer;
var a, b, i, counter: Integer;
begin
  a := 0;
  b := 20;
  Counter := 0;
  
  for i := 0 to Grid.Width do
  begin
    if (X > a) and (X < b) then
      Result := Counter;
    inc(Counter, 1);
    inc(a, 20);
    inc(b, 20);
  end;
end;

function TMainForm.CheckY(Y: Integer): Integer;
var a, b, i, Counter: Integer;
begin
  a := 0;
  b := 20;
  Counter := 0;

  for i := 0 to Grid.Height do
  begin
    if (Y > a) and (Y < b) then
      Result := Counter;
    inc(Counter, 1);
    inc(a, 20);
    inc(b, 20);
  end;
end;

procedure TMainForm.GridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  _xypos.Caption := 'X: ' + IntToStr(CheckX(X)) + ' Y: ' + IntToStr(CheckY(Y));
  xPos := CheckX(X);
  yPos := CheckY(Y);
  DrawGrid;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ObjectList.Draw(Grid.Canvas, xPos*20, yPos*20, 0);
  ObjectArray[xPos*yPos].Filled := True;
  ObjectArray[xPos*yPos].X := xPos;
  ObjectArray[xPos*yPos].Y := yPos;
  ObjectArray[xPos*yPos].ImageIndex := 0;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  SetLength(ObjectArray, (Grid.Width div 20 * Grid.Height div 20));
  
  for i := 0 to (Grid.Width div 20 * Grid.Height div 20) do
  begin
    ObjectArray[i].X := 0;
    ObjectArray[i].Y := 0;
    ObjectArray[i].Filled := False;
    ObjectArray[i].ImageIndex := 0;
  end;
  
end;


procedure TMainForm.DrawImage(X, Y, ImageIndex: Integer);
begin
  ObjectList.Draw(Grid.Canvas, X*20, Y*20, ImageIndex);
end;

end.
Danke
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz