Autor Beitrag
benne85
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 16.11.03 14:47 
hallo leute habe mal eine frage:

ich bin grad dabei ein spielchen zu programmieren. dabei werden von einem "timer" alle drei sekunden auf einem "panel", "images" erzeugt. ein anderer "timer" befördert diese dann nach unten. am unteren ende des "panels" sitzt ein weiteres "image" das sich mit den pfeiltasten nach links und rechts bewegen lässt. nun möchte ich das, wenn die runterfallenden "images" das untere bewgliche "image" sozusagen treffen (habe gesagt wenn sie die gleiche ".top-Position" haben, geht das auch geschickter??) soll das jeweilige runterfallende image "zerstört werden.

sprich: ImgBallnachunten.Destroy;

allerdings geht das nicht es kommt immer ein fehlermeldung.

wäre nett wenn mir das jmd erklären könnte.

hier och der quelltext:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
unit uSpiel;

interface

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

type
  TfrmGame = class(TForm)
    pnlGame: TPanel;
    MainMenu: TMainMenu;
    Datei1: TMenuItem;
    Hilfe1: TMenuItem;
    btnStart: TButton;
    btnPause: TButton;
    gbControl: TGroupBox;
    TmrNewPoints: TTimer;
    TmrDown: TTimer;
    ImgFaenger: TImage;
    lblScore: TLabel;
    gbDisplay: TGroupBox;
    lblLives: TLabel;
    lblDeadline: TLabel;
    lblLevel: TLabel;
    TmrDeadline: TTimer;
    TmrCheckPoints: TTimer;
    procedure btnStartClick(Sender: TObject);
    procedure TmrNewPointsTimer(Sender: TObject);
    procedure TmrDownTimer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure TmrDeadlineTimer(Sender: TObject);
    procedure TmrCheckPointsTimer(Sender: TObject);
  private
    procedure CheckPoints();
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmGame: TfrmGame;
  ten_points: array[0..400] of TImage;
  i, score, lives, level: integer;

implementation

{$R *.dfm}

procedure TfrmGame.btnStartClick(Sender: TObject);
begin
  TmrNewPoints.Enabled := True;
  i := -1;
  lives := 3;
  score := 0;
  level := 1;
end;

procedure TfrmGame.TmrNewPointsTimer(Sender: TObject);
var ausrichtung: integer;
begin
  i := i+1;
  ten_points[i] := TImage.Create(pnlGame);
  ten_points[i].Parent := pnlGame;
  ten_points[i].Picture.LoadFromFile('bild_10punkte.bmp');
  repeat ausrichtung := Random(pnlGame.Width);
  until (ausrichtung mod 20) = 0;
  ten_points[i].SetBounds(ausrichtung,25,20,20);
end;

procedure TfrmGame.TmrDownTimer(Sender: TObject);
var k:integer;
begin
for k:=0 to i do
begin
  ten_points[k].Top := ten_points[k].Top +5;    //Punkte fallen nach unten
end; //for

end;

procedure TfrmGame.CheckPoints();
var l: integer;
begin
for l:=0 to i do
begin
  if ten_points[l] = nil
    then continue;
  if (ten_points[l].Left = ImgFaenger.Left) AND (ten_points[l].Top+20 = ImgFaenger.Top)
    then
    begin
      score := score+10;
      lblScore.Caption := 'Punktestand: '+IntToStr(score);
      ten_points[l].Destroy;  //das ist der fehler, mit image.visible =false und enabled = false würde alles klappen. nur das destroyen geht nicht, aber warum??
      break;
    end
  else if (ten_points[l].Left <> ImgFaenger.Left) AND (ten_points[l].Top+20 = pnlGame.Height)
    then
    begin
      lives := lives-1;
      lblLives.Caption := 'Leben: '+IntToStr(lives);
      ten_points[l].visible := false;
      ten_points[l].Enabled := false;
    end;

end; //for
end;


procedure TfrmGame.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = VK_RIGHT
    then
    begin
      if frmGame.ImgFaenger.Left = 280
        then frmGame.ImgFaenger.Left := 280
          else frmGame.ImgFaenger.Left := frmGame.ImgFaenger.Left+20;
    end
  else if key = VK_LEFT
    then
    begin
      if frmGame.ImgFaenger.Left = 0
        then frmGame.ImgFaenger.Left := 0
          else frmGame.ImgFaenger.Left := frmGame.ImgFaenger.Left-20;
    end
  else if key = VK_SPACE
    then
    begin
      if deadline > 0
        then  CheckDeadline(true)
          else CheckDeadline(false);
    end;
end;

procedure TfrmGame.TmrCheckPointsTimer(Sender: TObject);
begin
  CheckPoints();
end;

end.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 17.11.03 11:22 
benne85 hat folgendes geschrieben:
allerdings geht das nicht es kommt immer ein fehlermeldung.

Und wie lautet die Fehlermeldung?

Versuch mal:
ausblenden Delphi-Quelltext
1:
ImgBallnachunten.Free;					

Destroy sollte man nicht direkt aufrufen. Siehe Hilfe!

Gruß
Tino
benne85 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 17.11.03 19:20 
hey tino!
erstmal danke für deine antwort.

das mit ImgBallnachunten.Free; geht nicht da kommt die selbe Fehlermeldung.

Nun die Fehlermeldung:
Diese hier kommt wenn ich das erste image "fange":
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt pSpiel.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: 'Format '%p' ungültig oder nicht kompatibel mit Argument'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------


Diese kommt wenn ich irgendein darauffolgendes "fange":

Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt pSpiel.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00402043 in Modul 'pSpiel.exe'. Schreiben von Adresse 0118C758'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------


wäre nett wenn mir einer helfen könnte, verzweifel noch...
danke

gruß
benne85 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 20.11.03 16:33 
Titel: hat sich erledigt.
thema hat sich erledigt...