Autor |
Beitrag |
*Jenny*
Hält's aus hier
Beiträge: 9
|
Verfasst: So 03.01.10 13:48
Hallo Leute!
Ich bin hier neu und wollte euch mal um Hilfe bitten! Wir müssen in Informatik ein Spiel programmieren und dabei ein paar Vorgaben beachten. Leider habe ich das Blatt erst jetzt bekommen und muss nun mein Spiel noch umwandeln.
Ich hatte ein Pong Spiel gewählt jedoch steht in den Angaben es muss etwas eingesammelt werden in einer bestimmten Zeit......ich bin noch am überlegen wie ich mein spiel noch umgestalten kann damit ich nicht alles umsonst gemacht habe.
Jedenfalls müssen wir eine Zeit verstreichen lassen in der etwas eingesammelt wird und ich wollte euch fragen wie ich dies erfüllen kann und diese sichtbar anzeigen und jetzt brauch ich euch =) Vllt habt ihr ja auch eine Idee zu meinem Problem das Pong spiel so zu programmieren das zusätzlich irgendwas eingessammelt werden muss...
Danke im Voraus
Ganz liebe Grüße
Jenny
|
|
jaenicke
      
Beiträge: 19321
Erhaltene Danke: 1748
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 03.01.10 13:53
Hallo und  hier im Forum!
Unter dem Stichwort Countdown z.B. findest du bestimmt auch einiges über die Suche.
Was du machen kannst: - Startzeit merken
- In einem Timer die Differenz zwischen aktueller Zeit und Startzeit nehmen
- Jetzt weißt du wieviel Zeit vergangen ist und kannst dies anzeigen
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 03.01.10 13:59
Hi, und  im Delphi-Forum!
Was hast du denn bisher geschrieben? Ich nehme mal an der Pong-Ball ist ein Objekt mit Radius, Geschwindigkeit/Tempo, x- und y-Position, und er bewegt sich über einen Tisch, der mehrere Wände hat?
Wie hast du denn die Bewegung des Balls bisher gelöst, die muss ja auch zeitgesteuert sein
Prallt der Ball an den Wänden ab? Dann hast du ja wahrscheinlich schon eine Kollisionsabfrage und brauchst nun eine Zweite für irgendwelche Gegenstände, die der Ball streifen könnte. Am einfachsten wären wohl Upgrades/etc(die den Ball schneller/langsamer machen oder Punkte geben könnten), die eingesammelt werden wenn der Ball sie streift. Die machst du dann ähnlich wie den Ball und entfernst sie, wenn ihre Position innerhalb des Ballkreises liegt.
Zeit sichtbar verstreichen lassen? Kein Problem, erhöhe einfach jedes Mal, wenn der Ball sich bewegt eine Variable um eins und male unten entsprechend viele Kreise oder so hin.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
*Jenny* 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 03.01.10 14:33
Danke erstmal für die hilfreichen Antworten ich werde mal versuchen auf die Fragen einzugehen, muss allerdings dazu sagen das ich Delphi erst seit 3 Monaten haben aber ich werds versuchen.
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: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; Timer1: TTimer; Button1: TButton; Spieler: TPanel; Ball: TPanel; CPU: TPanel; stand: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Label4: TLabel; Label5: TLabel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char); private public end;
var Form1: TForm1; var CPU_top,Spieler_top : integer; var ball_top,ball_left, ball_x, ball_y : integer; var limit_oben,limit_unten,limit_links,limit_rechts : integer; var geschwindigkeit, differenz, schwierigkeit : integer; var b, bMehrspieler : boolean; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin b:=false; if not (checkbox1.Checked=true) then b:=true; if checkbox2.Checked=true then bMehrspieler:=true; if checkbox2.Checked=false then bMehrspieler:=false; geschwindigkeit:=StrToInt(edit1.text); ball_x:=StrToInt(edit1.text); ball_y:=StrToInt(edit1.text); Stand.Caption:='0:0'; sleep(500); Timer1.Enabled:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if ball_top < 8 then begin ball_top:=8; ball_y:= - ball_y; end; if ball_top > 568 then begin ball_top:=568; ball_y:= - ball_y; end; ball_top:=ball_top + ball_y; ball.Top:=ball_top; if ((ball_left < 49) and (ball_top>CPU_top-1) and (ball_top<CPU_top+153)) then begin geschwindigkeit:=geschwindigkeit+1; ball_y:=ball_y+1; ball_x:=ball_x+1; b:=true; end; if (ball_left > 975) and (ball_top>Spieler_top-1) and (ball_top<Spieler_top+153) then begin geschwindigkeit:=geschwindigkeit+1; ball_y:=ball_y+1; ball_x:=ball_x+1; b:=false; end; if (ball_left>1020) or (ball_left<4) then begin if ball_left > 1020 then stand.caption:=IntToStr(StrToInt(copy(stand.Caption, 0, pos(':', stand.Caption)-1)) + 1) + copy(stand.Caption, pos(':', stand.Caption), MaxInt); if ball_left < 4 then stand.caption:=copy(stand.Caption, 0, pos(':', stand.Caption)) + IntToStr(StrToInt(copy(stand.Caption, pos(':', stand.Caption)+1, MaxInt)) + 1); ball.top:=240; ball.Left:=512; CPU.Top:=200; Spieler.Top:=200; CPU_top:=200; Spieler_Top:=200; ball_top:=240; ball_left:=512; geschwindigkeit:=StrToInt(edit1.text); ball_x:=StrToInt(edit1.text); ball_y:=StrToInt(edit1.text); differenz:=0; b:=false; if not (checkbox1.Checked=true) then b:=true; timer1.Enabled:=false; if (copy(stand.Caption, pos(':', stand.Caption)+1, MaxInt)=edit2.text) then begin showmessage('Spiel zuende du hast gewonnen'); exit; end; if (copy(stand.Caption, 0, pos(':', stand.Caption)-1)=edit2.text) then begin showmessage('Spiel zuende du hast verloren'); exit;
end; sleep(500); timer1.Enabled:=true; exit; end; if b=false then ball_left:=ball_left - ball_x; if b=true then ball_left:=ball_left + ball_x; ball.left:=ball_left; if bMehrspieler=false then begin if(ball_left < 350) then begin differenz := CPU_top+76 - ball_top; if(differenz < 0) then CPU_top := CPU_top + geschwindigkeit else CPU_top := CPU_top - geschwindigkeit; if (CPU_top < 8) then CPU_top := 8; if (CPU_top > 440) then CPU_top := 440; CPU.Top := CPU_top; end; end; if GetAsyncKeystate(VK_UP) < 0 then begin Spieler_top := Spieler_top - geschwindigkeit; if (Spieler_top < 8) then Spieler_top := 8; if (Spieler_top > 440) then Spieler_top := 440; Spieler.Top := Spieler_top; end; if GetAsyncKeystate(VK_DOWN) < 0 then begin Spieler_top := Spieler_top + geschwindigkeit; if (Spieler_top < 8) then Spieler_top := 8; if (Spieler_top > 440) then Spieler_top := 440; Spieler.Top := Spieler_top; end; if bMehrspieler=true then begin if GetAsyncKeystate(VK_CAPITAL) < 0 then begin CPU_top := CPU_top - geschwindigkeit; if (CPU_top < 8) then CPU_top := 8; if (CPU_top > 440) then CPU_top := 440; CPU.Top := CPU_top; end; if GetAsyncKeystate(VK_SHIFT) < 0 then begin CPU_top := CPU_top + geschwindigkeit; if (CPU_top < 8) then CPU_top := 8; if (CPU_top > 440) then CPU_top := 440; CPU.Top := CPU_top; end; end; end;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; b:=false; DoubleBuffered := true; CPU_top:=200; Spieler_Top:=200; ball_top:=240; ball_left:=512; ball_x:=5; ball_y:=5; geschwindigkeit:=5; differenz:=0; end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [#48..#57, #8, #44, #13, #46]) then key := #0; end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if not (key in [#48..#57, #8, #44, #13, #46]) then key := #0; end;
end. |
Das ist jetzt das ganz normale pong welches ich mal programmiert habe....hatte mir schon bereits gute vorschläge von euch zum Thema Pong durchgelesen und muss sagen es war sehr hilfreich =)
Vllt hilft der Quelltext....
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
DelphiProgrammer97
      
Beiträge: 62
|
Verfasst: So 03.01.10 15:28
mit der zeit die runterlauft das könntest du machen indem du
1. in die var eine variable reinschreibst:
zeit1 : Integer;
2.dann nimmst du dir noch einen timer und 2 Labels
3. den timer stellst du bei Enabled auf False, damit er nicht gleich zu beginn läuft
4. In das eine Label screibst du hinein "Zeit übrig:" oder so, das andere lässt du frei(also Label2)
5. dann schreibst du in den button, mit dem das spiel startet hinein:
Timer1.Enabled:=True;(also das der timer mit klick auf den button startet)
zeit1:=0
6. in die procedur im timer1 schreibst du dann:
zeit1:=zeit1+1;
Label2.Caption:=IntToStr (zeit1);
so müsste das funktionieren mit zeit runterzählen
|
|
jaenicke
      
Beiträge: 19321
Erhaltene Danke: 1748
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 03.01.10 15:32
|
|
*Jenny* 
Hält's aus hier
Beiträge: 9
|
Verfasst: So 03.01.10 15:45
Okay danke für die infos! ich werd es mal versuchen  Eine frage Hidden hat mich gefragt: Prallt der Ball an den Wänden ab? Dann hast du ja wahrscheinlich schon eine Kollisionsabfrage und brauchst nun eine Zweite für irgendwelche Gegenstände, die der Ball streifen könnte. Am einfachsten wären wohl Upgrades/etc(die den Ball schneller/langsamer machen oder Punkte geben könnten), die eingesammelt werden wenn der Ball sie streift. Die machst du dann ähnlich wie den Ball und entfernst sie, wenn ihre Position innerhalb des Ballkreises liegt.
Weil ich ja noch etwas zum einsammeln muss.....wie genau kann ich das umsetzen? Ihr kennt euch so gut aus und fragen kostet ja nichts 
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 03.01.10 15:57
Hi *Jenny* =),
Für drei Monate sieht das glaube ich schon erstaunlich gut aus(wenn ich so an meine Mitschüler denke, ich bin nämlich selbst noch für ein Vierteljahr Schüler  )
Ein Paar Tipps hätte ich aber doch noch(das macht euer Lehrer vielleicht auch falsch, stammt also nicht notwendigerweise von dir/euch): - Alle Variablen außer Form1: TForm sollten dem Formular gehören(Im Abschnitt "private"). Mit Globalen Variablen kann man sich besonders bei größeren Projekten viel Ärger einhandeln.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TForm1 = class(TForm) private FCPU_top, FSpieler_top: Integer; FBall_top, FBall_left, FBall_x, FBall_y: Integer; FLimit_oben, FLimit_unten, FLimit_links, FLimit_rechts: Integer; FTempo, FDfferenz, FSchwierigkeit: Integer; Fb, FbMehrspieler: Boolean; private public end; |
- Was ist 'b'? Vars sollten nach ihrer Bedeutung benannt werden, nicht nach ihrem Typ.
- Vergleiche auf true/false sind generell unnötig, werden aber trotzdem immer wieder gerne gemacht. So ist if not (checkbox1.Checked=true) then b:=true; äquivalent zu if not checkbox1.Checked then b:=true;. Das geht, weil '=' im Prinzip auch nur true/false zurückgibt. Was Passiert denn, wenn b den Wert true annimmt? Dann ist 'true = true' = 'true'. Ist b 'false', so ist 'true = false' = 'false'. Ein solcher Vergleich b = true/false nimmt also immer den Wert b/not b der Variable(oder dessen Negation) an.
Je nachdem, was b für eine Bedeutung hat, geht wahrscheinlich auch b := not Checkbox1.Checked;.
- Eine Unit erhält sehr viel Übersicht, wenn man mit mehr Prozeduren arbeitet. Statt mehr doer weniger alles in eine zu quetschen, würde ich weitere hinzufügen(auch unter 'private', und dann unten deklarieren:
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:
| type TForm1 = class(TForm) proceduire Button1Click(); private private procedure AnBandeAbprallenLassen; function SpielEnde: Boolean; function SpielerEinPunkte: Integer; end;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(); begin AnBandeAbprallenLassen; if SpielEnde then Exit; BewegeBall; end;
procedure AnBandeAbprallenLassen; begin end;
function SpielEnde: Boolean; begin result := true/false; end;
function SpielerEinPunkte: Integer; begin reusult := 42; end; |
- ((Statt Geschwindigkeit nehme ich immer Tempo, unschlagbar kürzer^^))
Mit dem Timer ist glaube ich alles gesgt, das wiederhole ich jetzt nich nochmal^^
E: Bezüglich der Kollionsabfrage. Der Ball braucht eine Größe, nicht nur eine Position. Entweder stellst du ihn als Kreis dar, oder als Rechteck. Dann bestimmst du in jedem Timerstep für die Positionen der Boni, ob der Bonus sich "im Ball" befindet.
Für ein Rechteck geht das am leichtesten, nämlich exakt so wie du geprüft hast, ob der ball über eine der Tischkanten geht kannst du prüfen, ob der Boni innerhalb der Ballkanten geht.
Für einen Kreis ginge das mit Pythagoras: Im Ball <=> (x-xBall)*(x-xBall) + (y-yBall)*(y-yBall) <= 25, für einen Ball mit Radius 5.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|