Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Anfängerfragen zum PingPong
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 03.07.2008, 22:12    Titel: Anfängerfragen zum PingPong Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.07.2008, 14:05    Titel: Antworten mit Zitat

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 lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 04.07.2008, 14:59    Titel: Antworten mit Zitat

Danke, die Idee hatte ich auch schon lächeln. Dachte nur es gäbe vielleicht einen anderen Weg lächeln.
Dann werd ich halt einfach drüber malen. Mit Buffer kenn ich mich noch nich so aus zwinkern.
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.07.2008, 15:11    Titel: Antworten mit Zitat

Buffer sind eine klasse erfindung zwinkern .. solltest du dich wirklich mal mit beschäftigen!

Stell dir vor du möchtest eine Bitmap als hintergrundbild für dein pingpong-spiel anzeigen. Wenn du dann den bewegten bereich nur schwarz ausmalst, siehst man das sofort an den spuren auf dem bitmap.

Schau dir mal den GET-Befehl an:
http://www.freebasic-portal.de/index.php?s=reftopic&id=287
und den PUT-Befehl:
http://www.freebasic-portal.de/index.php?s=reftopic&id=497
Damit kannst du buffer einlesen und ausgeben.

Seit Freebasic gibt es im unterschied zu QBasic auch noch IMAGECREATE:

http://www.freebasic-portal.de/index.php?s=reftopic&id=307


Wenn du das beherrschst, kommst du wesentlich weiter als nur mit linien und bereiche malen lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 04.07.2008, 15:20    Titel: Antworten mit Zitat

Ok. Danke sehr, werd ich mir mal anschaun lächeln.
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.07.2008, 15:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.07.2008, 17:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 04.07.2008, 19:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 04.07.2008, 19:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 04.07.2008, 21:06    Titel: Antworten mit Zitat

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 happy
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.07.2008, 23:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 05.07.2008, 10:28    Titel: Antworten mit Zitat

Habs jetz nochmal probiert mit GET und PUT, weil ich ne kleinigkeit vergessen hatte, und nun geht wieder nix mehr traurig. 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 traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 08.07.2008, 21:32    Titel: Antworten mit Zitat

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 traurig
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.07.2008, 22:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 08.07.2008, 23:26    Titel: Antworten mit Zitat

Danke lächeln
Das hat zumindest schonmal dazu verholfen, dass es nicht immer bei get abstürzt lächeln. 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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 09.07.2008, 11:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 09.07.2008, 11:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 09.07.2008, 21:23    Titel: Antworten mit Zitat

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 missbilligen
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 09.07.2008, 21:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kirodema



Anmeldungsdatum: 03.07.2008
Beiträge: 12

BeitragVerfasst am: 10.07.2008, 22:03    Titel: Antworten mit Zitat

Meinst du damit, dass Paddel 2x mit put und xor als Aktionswort an der selben Stelle zeichnen?
_________________
Mit freundlichen Grüssen
Kirodema
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz