Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 03.07.2008, 22:12 Titel: Anfängerfragen zum PingPong |
|
|
Guten Tag.
Hab vor 2 Tagen angefangen FreeBASIC zu lernen und dachte mir mal ich fang mit nem einfachen Pingpong spiel an. Hab ein Paddel, dass sich beim bewegen halt jedesmal neu zeichnet. Hab nur ein kleines Problem mit dem Befehl cls, weil ja jedesmal der gesamte Screen gesäubert wird, verschwindet das andere Paddel (was zur Zeit einfach nur da steht und sich nicht bewegen kann).
Der Code schaut zur Zeit so aus:
Pingpong
Danke im vorhinein. _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.07.2008, 14:05 Titel: |
|
|
Echt interessant, dass jemand der schon einige Basic-Befehle kennt, nicht auf die Idee kommt den Bereich vor der Bewegung einfach schwarz auszumalen... Mit dem gleichen Befehl wie er den Balken bereits malt nur in Farbe schwarz... irgendwie lollig, aber respekt das du dir mühe gibst WEITER SO!!!
Die elegantere Art wäre natürlich einen Grafikbuffer zu erstellen der sich den hintergrund des paddels merkt und ihn einfach neu zeichnet bevor er sich bewegt. Und auf den screenrefresh sollte man natürlich auch noch warten weils sonst ein wildes geblinke wird... |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 04.07.2008, 14:59 Titel: |
|
|
Danke, die Idee hatte ich auch schon . Dachte nur es gäbe vielleicht einen anderen Weg .
Dann werd ich halt einfach drüber malen. Mit Buffer kenn ich mich noch nich so aus . _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 04.07.2008, 15:20 Titel: |
|
|
Ok. Danke sehr, werd ich mir mal anschaun . _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.07.2008, 15:42 Titel: |
|
|
besser als GET/PUT ist das sogenannte Doublebuffering. Siehe hierzu SCREENCOPY und SCREENSET _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 04.07.2008, 17:43 Titel: |
|
|
Jojo, ich glaube das was du meinst ist eher das Absichern des Bildschirminhaltes.
Damit das aber reibungslos geht braucht man wieder Masken oder Transparenz, und so kompliziert braucht man es auch wieder nicht machen für ein allererstes PingPong Spiel.
Denn Doublebuffering wäre hier nicht nur überflüssig, da die fbGFXlib das schon von sich aus macht, und zum anderen, weil Triplebuffering nicht wirklich sinnvoll ist (nur in einigen Spezialfällen, bsp. Egoshooter, ein Anzeigebuffer, Scenebuffer, HUD/UI Buffer)
Ich denke, mit GET/PUT und evtl. BSAVE/BLOAD (für Screenshots und Bilder) ist Kirodema schon sehr gut bedient... |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 04.07.2008, 19:36 Titel: |
|
|
Hab es jetz mal mit Buffer probiert, nur irgendwie zeichnet er jetz keine Paddel mehr und wenn ich irgendeine Taste drücke, beendet er es Progi.
Code: | type Paddel
public:
declare constructor()
declare sub drawPaddel(xpos as integer, ypos as integer)
declare sub movePaddel(richtung as string)
Declare Sub destroyImg()
private:
as integer xgr, ygr, xpos, ypos
As Byte Ptr inb, outb
end type
constructor Paddel()
this.xgr = 15
this.ygr = 75
inb = ImageCreate (xgr, ygr)
outb = ImageCreate (xgr, ygr)
end constructor
sub Paddel.movePaddel(richtung as string)
if richtung = "rauf" then
Get (xpos, ypos) - (xgr, ygr), inb
ypos -= 5
if ypos < 100 then ypos = 100
? "" &ypos
drawPaddel(xpos, ypos)
exit sub
end if
if richtung = "runter" Then
Get (xpos, ypos) - (xgr, ygr), inb
ypos += 5
if (ypos + ygr) > sh then ypos = sh - ygr
? "" &ypos
drawPaddel(xpos, ypos)
exit sub
end if
?"Ungueltige Richtung"
end sub
sub Paddel.drawPaddel(xpos as integer, ypos as integer)
this.xpos = xpos
this.ypos = ypos
line inb, (xpos, ypos) - (xpos + xgr, ypos + ygr),,BF
Put (xpos, ypos), inb, PSet
end Sub
Sub Paddel.destroyImg()
ImageDestroy inb
ImageDestroy outb
End Sub |
Kann mir vllt bitte wer das ganze GET und PUT mal anhand dieses Beispiels erklären?
Danke im vorhinein _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.07.2008, 19:50 Titel: |
|
|
Zum Thema allgemein: Ein ganz einfaches Pong-Spiel (QB) in meiner Sammlung findet sich unter
http://www.dreael.ch/Deutsch/Download/Pong.html
Verbesserungstipp für eine FreeBasic-Version: Dort mit Vorteil von MULTIKEY Gebrauch machen, wo sich das Niederdrücken und Loslassen der Steuerungstasten gegenüber INKEY$ viel besser abfragen lässt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 04.07.2008, 21:06 Titel: |
|
|
Ok ... Fehler erkannt und behoben. Kann mir wer erklären, was OneCypher mit "auf den screenrefresh warten" meint? Weil bei mir blinkt das grad ziemlich irre  _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 04.07.2008, 23:24 Titel: |
|
|
Also, so mit einer Schleife tut das Programm soviel wie es nur kann - Zuviel eben, denn z.B. 500 FPS sind ziemlich sinnlos, da der Monitor nur 60 darstellt, und das Auge eh nur 24 Wahrnimmt.
Deswegen solltest du am Ende der Schleife ein ScreenSync einfügen.
Dies veranlasst die fbGFXlib dein Programm solange zu pausieren, bis der zuständige Grafiktreiber (GDI, X Treiber, DirectX oder openGL) ein neues Bild erwartet.
Das nennt man btw. auch VSync, da der Aufbau des Bildes auf dem Monitor abgewartet wird. Oder kurz: Dein Programm läuft gleichschnell, die Schleife wird mit normalerweise 60 oder 75 Hz abgearbeitet (= 60 oder 75 mal pro Sekunde durchlaufen) |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 05.07.2008, 10:28 Titel: |
|
|
Habs jetz nochmal probiert mit GET und PUT, weil ich ne kleinigkeit vergessen hatte, und nun geht wieder nix mehr . Entweder ich bin zu dumm für die ganze Buffer-Geschichte oder ich weiss nicht was.
Hier mal den Code
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=609
Hab alles so gemacht, wies in der Befehlsreferenz steht und wie ich es dann halt interpretiert habe.
Edit:
Hab herrausgefunden, dass das GET in Paddel.movePaddel(...) den Absturz des Programms verursacht. Nur weiss ich leider nicht wieso
Edit2:
Hab mir den Fehler weiter angeschaut und herrausgefunden, dass ihm anscheinend der Buffer, wo ich was reinschreiben will zu klein ist. Könnte mir bitte wer mal das GET schön deppensicher erklären? Mag das nämlich irgendwann abschliessen können das Thema. _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 08.07.2008, 21:32 Titel: |
|
|
First of all: sry4 doublepost
Wollt nur mal, ob ich ne antwort krieg? Weil es ärgert mich irgendwie, dass das nich funktioniert, obwohl ichs so gemacht hab wies in der Befehlsreferenz steht  _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.07.2008, 22:06 Titel: |
|
|
Ich weiß jetzt zwar nicht, ob das der Grund des Problems ist (habe keine Zeit mich einzulesen), aber achte darauf, das z. B.
Code: | GET (100, 100)-(150, 150), puffer |
nicht 50x50 Pixel belegt, sondern 51x51 Pixel. Dasselbe gilt für
Code: | GET (100, 100)-STEP(50, 50), puffer |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 08.07.2008, 23:26 Titel: |
|
|
Danke
Das hat zumindest schonmal dazu verholfen, dass es nicht immer bei get abstürzt . Nun schein ich aber nen Logikfehler zu haben, weil wenn man das Paddel bewegt, zieht es nen weissen Strifen hinterher (also es wird nicht schwarz dahinter). Weiss aber irgendwie nicht wieso?
Hier der Code
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=615 _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 09.07.2008, 11:16 Titel: |
|
|
Fürs gröbste reicht auch ein "SCREENLOCK" vor deinen Grafikanweisungen und ein "SCREENUNLOCK" nach deinen Grafikanweisungen.
Damit werden alle deine "gemalten" sachen erst beim "SCREENUNLOCK" auf einmal ausgegeben.
Wenn ich mich nicht irre gibt die gfx-"engine" die Grafik erst bei der nächsten Frame aus, was einem warten auf ein screenrefresh sehr nahe kommt...
Mit doublebuffering per Screencopy bzw screenset find ich eher unnötig und auf spatzen geschossen... |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 09.07.2008, 11:48 Titel: |
|
|
First of all:
Zitat: | Mit doublebuffering per Screencopy bzw screenset find ich eher unnötig und auf spatzen geschossen... |
28938 hat Folgendes geschrieben: |
Jojo, ich glaube das was du meinst ist eher das Absichern des Bildschirminhaltes.
Damit das aber reibungslos geht braucht man wieder Masken oder Transparenz, und so kompliziert braucht man es auch wieder nicht machen für ein allererstes PingPong Spiel.
Denn Doublebuffering wäre hier nicht nur überflüssig, da die fbGFXlib das schon von sich aus macht, und zum anderen, weil Triplebuffering nicht wirklich sinnvoll ist (nur in einigen Spezialfällen, bsp. Egoshooter, ein Anzeigebuffer, Scenebuffer, HUD/UI Buffer) |
Zitat: | Damit werden alle deine "gemalten" sachen erst beim "SCREENUNLOCK" auf einmal ausgegeben.
Wenn ich mich nicht irre gibt die gfx-"engine" die Grafik erst bei der nächsten Frame aus, was einem warten auf ein screenrefresh sehr nahe kommt... |
Nein, für das Beschriebene gibt es ScreenSync... |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 09.07.2008, 21:23 Titel: |
|
|
Mag euch ja nur ungern bei eurer Diskussion stören von wegen Doublepuffer or not, aber könntet ihr mir bitte kurz helfen mit meinem Problem  _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 09.07.2008, 21:27 Titel: |
|
|
Ich mache um meine Grafiken meistens einen kleinen Rand in der Hintergrundfarbe - wenn ich die Grafik dann um 1 Pixel versetzt neu zeichne, dann wird der Rand des alten Bildes komplett überschrieben.
Alternativ (und an sich besser) ist ein Zeichnen mit XOR - einmal zum Hinzeichnen, ein zweites Mal (an derselben Stelle) zum wieder löschen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Kirodema
Anmeldungsdatum: 03.07.2008 Beiträge: 12
|
Verfasst am: 10.07.2008, 22:03 Titel: |
|
|
Meinst du damit, dass Paddel 2x mit put und xor als Aktionswort an der selben Stelle zeichnen? _________________ Mit freundlichen Grüssen
Kirodema |
|
Nach oben |
|
 |
|