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
Antwort Antwort
Red six

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

Probleme bei Leveleditor (Grid in Array speichern)

  Alt 16. Aug 2005, 22: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
CLRS530

Registriert seit: 27. Jun 2005
Ort: Hamburg
39 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 11:45
Hab es jetzt nur mal gerade überflogen.
Ich kenne solche Fehler, grenz das doch mal ein bisschen ein.
d.h. gucke einmal beim neuzeichnen ob das array richtig gefüllt ist, so kannst du dann mit Gewissheit sagen, das es beim zeichnen passiert, ansonsten kannst du eben feststellen das das adden in das array nicht funktioniert
  Mit Zitat antworten Zitat
Red six

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

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 12:21
Gut und woher kommen diese ganzen Pointer Errors?

Muss ja auch irgentwo am Array liegen
  Mit Zitat antworten Zitat
CLRS530

Registriert seit: 27. Jun 2005
Ort: Hamburg
39 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 12:41
Was soll denn daran liegen, gehe doch erst einmal dme Fehler mit den verschwindenden Bildern nach, du scheinst da ja irgendwas falsch zu machen.
Dann löst sich vielleicht auch das andere Problem.

Bei so grossen Sachen wo irgendwer einen Fehler findne soll, wirst du nicht viele Antworten erhalten, man muss sich ja auch erst einmal reindenken was du da machst.
  Mit Zitat antworten Zitat
Red six

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

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 12:58
Ja aber ich hab überhaupt keinen durchblick mehr

Das überprüfen funktioniert auch nicht (Hab in ner Listbox einfach immer [i] = 1 oder 0, Filled oder nicht Filled) aber das geht auch nicht... Voll doof
  Mit Zitat antworten Zitat
CLRS530

Registriert seit: 27. Jun 2005
Ort: Hamburg
39 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 19:16
Achso das Ding verstehe ich jetzt, aber das ist doch doof, wieso machst du das.
Der Eintrag ist doch überflüssig und gerade wenn man mehrere Elemente in den Speicher läd sollte man darauf achten das zu vermeiden.
Gehe doch am Anfang dein ganzes Array durch und setze es auf 0 bzw ""
Dann kannst du doch sehen ob es gefüllt ist oder nicht.

Ich würde es sowieso an dieser Stelle eher mit einer verketteten Liste machen Anstatt mit einem Array.
Vorteil davon, 1. du kannst das Feld, falls du das einmal möchtest vergrössern, das ginge zwar mit Dynamischen Arrays auch, die haben aber einige Nachteile.
2. verbraucht es sehr viel weniger Speicher, da du ja nur für die Felder einen Eintrag erzeugen musst, in denen auch etwas gespeichert wurde und das Speichermanagement für solch eine Liste ist auch besser, da die Daten nicht wie bei einem Array zusammenhängend gespeichert werden.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Probleme bei Leveleditor (Grid in Array speichern)

  Alt 17. Aug 2005, 19:30
Zitat von Red six:
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...
Du machst einen grundsätzlichen Fehler mit der Paintbox.
Auf die Paintbox soll nur aus dem Event OnPaint gezeichnet werden; nicht von ausserhalb.
(die wenigen Ausnahmen lassen wir mal ausser acht)
Der Klick ändert also zuerst den Inhalt in deinem Array.
Danach rufst du. Paintbox.Paint auf.
Die VCL ruft dann das Event OnPaint auf und innerhalb dieses Events liest du das Array aus und zeichnest.

Wenn nun ein "böses" Fenster sich über deine Paintbox legt und es wieder aufdeckt, bleibt keine graue oder schwarze Fläche sichtbar, sondern es wird neu gezeichnet.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:20 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