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:

Laggender Netzwerkcode
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 21.04.2006, 20:46    Titel: Antworten mit Zitat

Michael Frey hat Folgendes geschrieben:
Ich finde die das etwas eigenartig:
Zitat:
a) FreeBasic ist zu langsam
b) SDL ist zu langsam
c) winsock ist zu langsam

Es ist nicht fair über eine Sprache zu Urteilen die du nicht beherscht.
(Sie Anwendung der SDL und von Arrays)

Es ist auch nicht fair, über ein Statement zu urteilen, das man nicht gelesen hat.
Da stand nähmlich, es gibt(und das ist logisch) diese Möglichkeiten. Welche davon richtig ist, habe ich nicht gesagt

Zitat:

Übrigens:
Zitat:
Das eigentliche Problem: es laggt, und zwar richtig. Wenn ich 100 Mhz mit 133 Mhz oder auch mit einem schnelleren Computer teste, dann laggt es.

Zitat:
Ach ja, und das Spiel funktioniert ja auf 800 Mhz - 2.4 Ghz.

Pass auf, das deine Aussagen mit einander übereinstimmen.

Damit meinte ich 200 Mhz.

So....MisterD meint, es liegt am Netzwerk. FALSCH!

Code:
'$INCLUDE: "SDL/SDL.bi"
'$INCLUDE: "SDL/SDL_TTF.bi"

declare sub anz_bmp(x as integer,  y as integer,  bildanz as SDL_Surface PTR)
declare sub anz_txt(x as integer,  y as integer,  txt AS string)

type spielertyp
    x as integer
    y as integer
    punkte as integer
    schussx as integer
    schussy as integer
    schussex as integer
end type

if (SDL_Init(SDL_INIT_VIDEO)<>0) then
    print "fehler":sleep:end 1
end if

if (TTF_Init()<>0) then
    print "fehler":sleep:end 1
end if

dim shared bildschirm as SDL_Surface PTR
bildschirm=SDL_SetVideoMode(640,480,16,SDL_DOUBLEBUF)
if (bildschirm=NULL) then
    print "fehler": sleep:end 1
end if

dim shared schrift as TTF_Font PTR
schrift=TTF_OpenFont("Vera.ttf", 12)
if schrift=NULL then
    print "fehler":sleep:end
end if

dim spbild as SDL_Surface PTR
spbild=SDL_LoadBMP("01.bmp")
if (spbild=0) then
    print "fehler":sleep:end 1
end if
SDL_SetColorKey(spbild, SDL_SRCCOLORKEY, SDL_MapRGB(spbild->format, 0,0,255))

dim ereigniss as SDL_Event
dim ende as byte
dim tasten(12) as byte
dim spieler(2) as spielertyp
dim rechtecks AS SDL_Rect
dim zeit, zeit2, zeitdiff as integer

spieler(1).x=100
spieler(1).y=100
spieler(1).punkte=5

spieler(2).x=400
spieler(2).y=400
spieler(2).punkte=5

while ende=0
    while (SDL_PollEvent(@ereigniss))
        if (ereigniss.type=SDL_QUIT_) then end
        if (ereigniss.type=SDL_KEYDOWN) then
            if (ereigniss.key.keysym.sym=SDLK_ESCAPE) then end
            if (ereigniss.key.keysym.sym=SDLK_UP) then tasten(1)=1
            if (ereigniss.key.keysym.sym=SDLK_DOWN) then tasten(2)=1
            if (ereigniss.key.keysym.sym=SDLK_LEFT) then tasten(3)=1
            if (ereigniss.key.keysym.sym=SDLK_RIGHT) then tasten(4)=1
            if (ereigniss.key.keysym.sym=SDLK_SPACE) then tasten(5)=1
            if (ereigniss.key.keysym.sym=SDLK_W) then tasten(6)=1
            if (ereigniss.key.keysym.sym=SDLK_S) then tasten(7)=1
            if (ereigniss.key.keysym.sym=SDLK_A) then tasten(8)=1
            if (ereigniss.key.keysym.sym=SDLK_D) then tasten(9)=1
            if (ereigniss.key.keysym.sym=SDLK_F) then tasten(10)=1
        end if
        if (ereigniss.type=SDL_KEYUP) then
            if (ereigniss.key.keysym.sym=SDLK_ESCAPE) then end
            if (ereigniss.key.keysym.sym=SDLK_UP) then tasten(1)=0
            if (ereigniss.key.keysym.sym=SDLK_DOWN) then tasten(2)=0
            if (ereigniss.key.keysym.sym=SDLK_LEFT) then tasten(3)=0
            if (ereigniss.key.keysym.sym=SDLK_RIGHT) then tasten(4)=0
            if (ereigniss.key.keysym.sym=SDLK_SPACE) then tasten(5)=0
            if (ereigniss.key.keysym.sym=SDLK_W) then tasten(6)=0
            if (ereigniss.key.keysym.sym=SDLK_S) then tasten(7)=0
            if (ereigniss.key.keysym.sym=SDLK_A) then tasten(8)=0
            if (ereigniss.key.keysym.sym=SDLK_D) then tasten(9)=0
            if (ereigniss.key.keysym.sym=SDLK_F) then tasten(10)=0
        end if
    wend
   
    if (tasten(1)) then spieler(1).y-=6
    if (tasten(2)) then spieler(1).y+=6
    if (tasten(3)) then spieler(1).x-=6
    if (tasten(4)) then spieler(1).x+=6
    if (tasten(5)) then
        spieler(1).schussex=400
        spieler(1).schussx=spieler(1).x
        spieler(1).schussy=spieler(1).y
    end if
    if (tasten(6)) then spieler(2).y-=6
    if (tasten(7)) then spieler(2).y+=6
    if (tasten(8)) then spieler(2).x-=6
    if (tasten(9)) then spieler(2).x+=6
    if (tasten(10)) then
        spieler(2).schussex=400
        spieler(2).schussx=spieler(2).x
        spieler(2).schussy=spieler(2).y
    end if
   
    SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format, 0,0,255))
   
    anz_bmp(spieler(1).x, spieler(1).y, spbild)
    anz_txt(spieler(1).x+5, spieler(1).y+5, STR$(spieler(1).punkte))
    anz_bmp(spieler(2).x, spieler(2).y, spbild)
    anz_txt(spieler(2).x+5, spieler(2).y+5, STR$(spieler(2).punkte))
   
    if (spieler(1).schussex>0) then
        spieler(1).schussex-=1
        spieler(1).schussx+=10
        rechtecks.x=spieler(1).schussx
        rechtecks.y=spieler(1).schussy
        rechtecks.w=20
        rechtecks.h=5
        SDL_FillRect(bildschirm, @rechtecks, SDL_MapRGB(bildschirm->format, 100,100,0))
        if (abs(spieler(2).x-spieler(1).schussx)<20 and abs(spieler(2).y-spieler(1).schussy)<20) then
            spieler(1).schussex=0
            spieler(2).punkte-=1
        end if
    end if
   
    if (spieler(2).schussex>0) then
        spieler(2).schussex-=1
        spieler(2).schussx-=10
        rechtecks.x=spieler(2).schussx
        rechtecks.y=spieler(2).schussy
        rechtecks.w=20
        rechtecks.h=5
        SDL_FillRect(bildschirm, @rechtecks, SDL_MapRGB(bildschirm->format,0,100,100))
        if (abs(spieler(1).x-spieler(2).schussx)<20 and abs(spieler(1).y-spieler(2).schussy)<20) then
            spieler(2).schussex=0
            spieler(1).punkte-=1
        end if
    end if
   
    SDL_Flip(bildschirm)
   
    zeit=SDL_GetTicks()
   
    zeitdiff=zeit-zeit2
   
    if (30-zeitdiff>0 and 30-zeitdiff<30) then
        SDL_Delay(30-zeitdiff)
    end if
   
    zeit2=SDL_GetTicks()
   
wend

end

sub anz_txt(x as integer,  y as integer,  txt as string)
    dim rechteck as SDL_Rect
    dim tempsurf as SDL_Surface PTR
    dim farbe AS SDL_Color
   
    farbe.r=1
    farbe.g=1
    farbe.b=1
   
    tempsurf=TTF_RenderText_Blended(schrift, txt, farbe)
   
    rechteck.x=x
    rechteck.y=y
   
    SDL_BlitSurface(tempsurf, NULL, bildschirm, @rechteck)
   
    SDL_FreeSurface(tempsurf)
end sub

sub anz_bmp(x as integer,  y as integer,  bildanz as SDL_Surface PTR)
    dim rechteck AS SDL_Rect
   
    rechteck.x=x
    rechteck.y=y
   
    SDL_BlitSurface(bildanz, NULL, bildschirm, @rechteck)
end sub


Diesen Code habe ich geschrieben, und der hat überhaupt nichts mit Netzwerk! Und auch der laggt auf 100 Mhz.
Damit verbleiben folgende Möglichkeiten:
a) Freebasic ist zu langsam
b) SDL ist zu langsam
c) Es ist zu schlecht programmiert.

Sollte es an c) liegen, fände ich es nett, wenn ihr mir sagen könntet, wo da der Fehler liegt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.04.2006, 20:55    Titel: Antworten mit Zitat

[Offtopic]
Zitat:
Da stand nähmlich, es gibt(und das ist logisch)

Hach, ich lese es immer wieder gerne! lachen
[/Offtopic]
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 21.04.2006, 21:05    Titel: Antworten mit Zitat

so langsam glaub ich auch du bist DaGeRe himself peinlich wo hab ich bitte gesagt es liegt am Netzwerk? Ich hab gesagt bei dem schnellen PC lags wahrscheinlich am Netzwerk weil der dadurch auf den langsameren PC warten musste, sonst nichts. da brauchst du garnicht irgendwie hier falsch durch die landschaft zu brüllen.

Schlecht programmiert ists übrigens, aber nicht unbedingt sehr geschwindigkeitslastig, schau dir mal SELECT CASE in der referenz an und dann werd die 2000 IFs los. Ansonsten würd ich sagen Weder FB noch SDL ist zu langsam sondern für nen langsamen rechner einfach zu viel. Du kannst auch keinen Flugzeug mit nem Golf-Motor antreiben, trotzdem sind Flugzeuge verdammt schnell...
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 21.04.2006, 21:09    Titel: Antworten mit Zitat

Ich bin nicht dagere!

Meiner Meinung nach ist etwas zu langsam, wenn 2-Punkte schießen sich ab damit auf 100 Mhz nicht funktionieren, wenn doch komplette spiele darauf funktionieren. Man schaue sich nur das tolle Minesweeper an, das gar nicht lagt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.04.2006, 21:33    Titel: Antworten mit Zitat

Zufälle gibt's ja. Du nutzt zufällig genau denselben Provider wie dagere und eure IP-Bereiche überschneiden sich ab und an. Seltsam, gell?! cool Ich würd auch sagen: The master himself... durchgeknallt
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 21.04.2006, 21:51    Titel: Antworten mit Zitat

Was? Provider? Ich bin bei Arcor, das ist am billigsten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 21.04.2006, 22:10    Titel: Antworten mit Zitat



Thread wegen erwiesener Sinnlosigkeit und Rumgefake³ schließen?
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 22.04.2006, 09:56    Titel: Antworten mit Zitat

Wieso SDL?

Das Programm läuft bei mir übrigens trotz der DLL nicht an.
Code:
spbild=SDL_LoadBMP("01.bmp")

Achso. Man bracht ein Bild zum starten ...

Wenn das Programm schon zu lahm ist, dann Verbratte doch nicht noch unnötig speicher:
Code:
dim tasten(12) as byte

Du brauchst ja nur Index 1 bis 10 und nicht 0 bis 12 ...
Bei "Spieler" hat's ähnlichen Nonsens ...

Code:
if (ereigniss.key.keysym.sym=SDLK_UP) then tasten(1)=1
...
if (tasten(1)) then spieler(1).y-=6

Kann man das nicht mit Case elganter löschen?
Also anstelle von 2 Dicken If Auswertungen nur noch eine Case.

Wo genau der "Fehler" liegt kannich dir nicht sagen, ich kann solchen Code nicht lesen.

Google dein freund und helfer:
Zitat:
SDL_Delay pausiert den aktuellen Thread für die Anzahl der Milisekunden, die als Parameter übergeben werden soll. Diese Funktion sollte nicht zur Syncronisation von Threads verwendet werden, da nicht garantiert wird, dass die Anzahl der Milisekunden wirklich gewartet wird. So wird auf einigen Plattformen mindestens 10 Milisekunden gewartet, selbst wenn nur eine angegeben wurde.

http://wiki.delphigl.com/index.php/SDL_Delay
So wie ich den Code lese, sollte es bei dir genau sein.
(Nur ein Detail fehler, aber soclhe Dinger können sich summieren, bis der Code nicht mehr geht)
Interresant, wäre die Reaktion wenn SDL Delay einen Negativenwert bekommt. (Könnte z.B. auf deinem 100 MHz Rechner passieren)

Edit:
Hat "SDL_GetTicks" überhaupt auf einem 100MHz Rechner eine Zeitbasis, welche die nötige Präzision liefert?!
Quelle
Zitat:
SDL_GetTicks ist je nach OS mehr oder minder ungenau, lieber auf eine OS spezifische und dafuer eine Methode mit aussreichender Genauigkeit benutzen.


Dumme Idee:
Nimm bei deinem Code die ganze FPS beschränkung raus, wenn's nicht mehr ruckelt, lags an dieser Beschränkung.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 22.04.2006, 22:44    Titel: Antworten mit Zitat

Danke erstmal für deine Hilfe, Michael Frey.
Doch leider laggt es immer noch weinen

Deshalb habe ich nun, logisch, um die 3. Möglichkeit(es liegt an FB) aufzuprobieren, das ganze umgeschrieben:

Code:
type spielertyp
    x as integer
    y as integer
    punkte as integer
    schussx as integer
    schussy as integer
    schussex as integer
end type

screen 18,8

dim ende as byte
dim tasten(10) as byte
dim spieler(1 to 2) as spielertyp

spieler(1).x=100
spieler(1).y=100
spieler(1).punkte=5

spieler(2).x=400
spieler(2).y=400
spieler(2).punkte=5

while ende=0
    if multikey(01) then end
    if multikey(72) then spieler(1).y-=6
    if multikey(80) then spieler(1).y+=6
    if multikey(75) then spieler(1).x-=6
    if multikey(77) then spieler(1).x+=6
    if multikey(57) then
        spieler(1).schussex=400
        spieler(1).schussx=spieler(1).x
        spieler(1).schussy=spieler(1).y
    end if
    if multikey(17) then spieler(2).y-=6
    if multikey(31) then spieler(2).y+=6
    if multikey(30) then spieler(2).x-=6
    if multikey(32) then spieler(2).x+=6
    if multikey(33) then
        spieler(2).schussex=400
        spieler(2).schussx=spieler(2).x
        spieler(2).schussy=spieler(2).y
    end if
    dummy$=inkey$
   
    screenlock
   
    cls
    circle(spieler(1).x, spieler(1).y),10,3,,,,F
    circle(spieler(2).x, spieler(2).y),10,4,,,,F
   
    if (spieler(1).schussex>0) then
        spieler(1).schussex-=1
        spieler(1).schussx+=10
        line (spieler(1).schussx, spieler(1).schussy)-(spieler(1).schussx+5,spieler(1).schussy+5), 1, BF
        if (abs(spieler(2).x-spieler(1).schussx)<20 and abs(spieler(2).y-spieler(1).schussy)<20) then
            spieler(1).schussex=0
            spieler(2).punkte-=1
        end if
    end if
   
    if (spieler(2).schussex>0) then
        spieler(2).schussex-=1
        spieler(2).schussx-=10
        line (spieler(2).schussx, spieler(2).schussy)-(spieler(2).schussx+5,spieler(2).schussy+5), 1, BF
        if (abs(spieler(1).x-spieler(2).schussx)<20 and abs(spieler(1).y-spieler(2).schussy)<20) then
            spieler(2).schussex=0
            spieler(1).punkte-=1
        end if
    end if
   
    screenunlock
   
    sleep 5
wend

end



und das laggt auch. mit dem Kopf durch die Mauer wollen

Ich habe in der Schule letzes Jahr in den Projektwochen mal eine Woche C++ gelernt, ich versuche jetzt mal, das selbe mit C++ und SDL zu machen. Mal sehen, ich das schaffe, und mal sehen, ob es laggt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 23.04.2006, 08:03    Titel: Antworten mit Zitat

Jetzt will ich's wissen durchgeknallt.

(P133 Windows 95, Freebasic 0.15 for Windows)
Mit SLEEP 5 ruckelt's stark, ohne wird's etwas besser.

(ab hier ohne Sleep 5)
(P133 Windows 95, Freebasic 0.15 for Dos)
Schwarzes Bild
(MS Dos Modus)
no DPMI
(DPMI beifeügt, sonst gleiche Situation)
Schwarzes Bild

(P133 Windows 95, Freebasic 0.16 Testing for Dos)
Schwarzes Bild
(MS Dos Modus)
Schwarzes Bild
(Freebasic for Dos ist wohl verbuggt ...)

(P133 Windows 95, Freebasic 0.16 for Windows)
Ruckelt

Wobei es zu den Probleme mit Win95 eine Doku gibt:
Zitat:
==============================================================================
Appendix E: Internal drivers
==============================================================================

As previously stated, gfxlib features its own tiny drivers to work on various
systems. Here is the list of drivers:

Win32:
DirectX
This driver is based on DirectDraw and DirectInput; it'll work
on any system that has already at least DirectX 3.0 installed.
Windows 98 is the minimum OS requirement; if you have
Windows
95 this is not guaranteed to work.
The required DirectX DLLs are loaded at execution time, so
your EXE will not depend on them, being able to also run on
systems where DX is not installed (this driver will fail to
initialize there).
Supports windowed and fullscreen modes.
GDI
Basic Windows GDI driver; slower than DirectX, yet guaranteed
to always work. This is a fallback driver for when DX is not
installed.

Supports windowed mode only.
OpenGL
OpenGL driver; likely to be hardware accelerated on every system,
it always works.
Supports windowed and fullscreen modes.
[...]
gfxlib will always choose the best driver for your system when a new video
mode is set via SCREEN.
To override driver selection, you can set the FBGFX
environmental variable to the name of the driver you want to be tried first:
on Win32 for example you could do:

Die Probleme mit alten System sind also bekannt.
Welches Betriebssystem hast du?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 23.04.2006, 11:54    Titel: Antworten mit Zitat

Sebastian hat Folgendes geschrieben:
Zufälle gibt's ja. Du nutzt zufällig genau denselben Provider wie dagere und eure IP-Bereiche überschneiden sich ab und an. Seltsam, gell?! cool Ich würd auch sagen: The master himself... durchgeknallt


Und wieso soll der IP bereich von Leipzig und vom Ruhrgebiet gleich sein?
Meiner Meinung nach ist das nicht logisch.

@Michael Frey:

Das ist mal eine gute Idee, denn daran wirds wahrscheinlich liegen.
Ich denke mal, er hat WIndows 95 und dann wird als FB Gfx Treiber "GDI" genommen, was ja langsamer ist als DX.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 23.04.2006, 12:20    Titel: Antworten mit Zitat

Hallo.

Meine IP ist 88.73.229.226. Wie kommt ihr drauf, die wäre nicht aus dem Ruhrgebiet?

Nein, es ist Windows 98 SE installiert, und DirectX 7. Und es laggt.

So, ich hab das selbe mal, wie angekündigt, mit C++ gemacht(erstaunlich, wie schnell das geht, wenn man schon mit Iosream gearbeitet hat):

Code:
#include <stdlib.h> 
#include <SDL.h> 
#include <SDL_Net.h>
using namespace std;

SDL_Surface *bildschirm;
SDL_Surface *schussbild;
int tasten[12];

int abs(int wert)
{if (wert<0){wert=0-wert;}
 return wert;}

class schussklasse
{
      public:
             int x, y, ex;
             schussklasse(int xkoord, int ykoord, int ex);
             ~schussklasse();
             void anzeige();
             void posberechnen();
      private:
              SDL_Surface *bild;                     
};

      schussklasse::schussklasse(int xkoord, int ykoord, int ex)
      {bild=schussbild;
       x=xkoord;
       y=ykoord;
       ex=1;
       }
       
       
       void schussklasse::posberechnen()
       {x+=(ex*8);
        if (x<0){ex=0;}
        if (x>640){ex=0;}}
       
       void schussklasse::anzeige()
       {SDL_Rect *rechteck;
        rechteck->x=x;
        rechteck->y=y;
        rechteck->h=10;
        rechteck->w=20;
       
        SDL_BlitSurface(bild, NULL, bildschirm, rechteck);}
       
       schussklasse::~schussklasse()
       {SDL_FreeSurface(bild);}
       
class spielerklasse
{
      public:
             spielerklasse();
             ~spielerklasse();   
             void posberechnen();
             void anzeige();   
             void setkoord(int xkoord, int ykoord);
             int xbesch, ybesch, x, y;;
      private:
             
              SDL_Surface *bild;
      };
     

      void spielerklasse::setkoord(int xkoord, int ykoord)
      {x=xkoord;
       y=ykoord;}
     
      void spielerklasse::posberechnen()
      {
       x+=xbesch;
       if (x<0){x=0;}
       if (x>630){x=630;}
       y+=ybesch;
       if (y<0){y=0;}
       if (y>630){y=630;}}
       
      void spielerklasse::anzeige()
      {
           SDL_Rect *rechteck1;
           rechteck1=new SDL_Rect;
           rechteck1->x=x;
           rechteck1->y=y;
           rechteck1->h=bild->h;
           rechteck1->w=bild->w;
           
           SDL_BlitSurface(bild, NULL, bildschirm, rechteck1);
           delete rechteck1;
           }
       
      spielerklasse::spielerklasse()
      {bild=SDL_LoadBMP("01.bmp");
       xbesch=0; ybesch=0;}
     
      spielerklasse::~spielerklasse()
      {SDL_FreeSurface(bild);} 
           
     
int main( int argc, char* argv[] )

IPaddress ip;
SDLNet_ResolveHost(&ip, NULL, 5678);
if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER )!=0){exit(1);}; 
bildschirm=SDL_SetVideoMode(640,480,16,SDL_DOUBLEBUF);
atexit(SDL_Quit);
if (NULL==bildschirm){exit(1);}
SDL_WM_SetCaption("SuperSpiel", NULL);
spielerklasse *spieler[2];
spieler[0]=new spielerklasse;
spieler[0]->setkoord(10,10);
spieler[1]=new spielerklasse;
spieler[1]->setkoord(500,400);
schussbild=SDL_LoadBMP("02.bmp");
schussklasse *schuss[2];
schuss[0]=new schussklasse(0,0,0);
schuss[1]=new schussklasse(0,0,0);
bool ende;
SDL_Event ereigniss;
ende=false;
while (false==ende)
{     
      while (SDL_PollEvent(&ereigniss))
      {
            if (ereigniss.type==SDL_QUIT){exit(0);}     
            if (ereigniss.type==SDL_KEYDOWN){
                     switch (ereigniss.key.keysym.sym)
                     {
                            case SDLK_ESCAPE :exit(0);break;
                            case SDLK_DOWN :tasten[1]=1;break;
                            case SDLK_UP   :tasten[2]=1;break;
                            case SDLK_LEFT :tasten[3]=1;break;
                            case SDLK_RIGHT:tasten[4]=1;break;
                            case SDLK_SPACE:tasten[5]=1;break;
                            case SDLK_w: tasten[7]=1;break;
                            case SDLK_s: tasten[8]=1;break;
                            case SDLK_a: tasten[9]=1;break;
                            case SDLK_d: tasten[10]=1;break;
                            case SDLK_f: tasten[11]=1;break;
                       }
                     }
            if (ereigniss.type==SDL_KEYUP){
                     switch (ereigniss.key.keysym.sym)
                     {
                            case SDLK_DOWN :tasten[1]=0;break;
                            case SDLK_UP   :tasten[2]=0;break;
                            case SDLK_LEFT :tasten[3]=0;break;
                            case SDLK_RIGHT:tasten[4]=0;break;
                            case SDLK_SPACE:tasten[5]=0;break;
                            case SDLK_w: tasten[7]=0;break;
                            case SDLK_s: tasten[8]=0;break;
                            case SDLK_a: tasten[9]=0;break;
                            case SDLK_d: tasten[10]=0;break;
                            case SDLK_f: tasten[11]=0;break;
                       }
            }
      }
      SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format, 1,1,255));                 
           
      if (1==tasten[1] and spieler[0]->ybesch<10){spieler[0]->ybesch+=1;}     
      if (1==tasten[2] and spieler[0]->ybesch>-10){spieler[0]->ybesch-=1;} 
      if (1==tasten[3] and spieler[0]->xbesch>-10){spieler[0]->xbesch-=1;}     
      if (1==tasten[4] and spieler[0]->xbesch<10){spieler[0]->xbesch+=1;}   
      if (1==tasten[5])
      {
                 schuss[0]->ex=1;
                 schuss[0]->x=spieler[0]->x;
                 schuss[0]->y=spieler[0]->y;
                }
                       
       
      if (1==tasten[7] and spieler[0]->ybesch>-10) {spieler[1]->ybesch-=1;}     
      if (1==tasten[8] and spieler[0]->ybesch<10) {spieler[1]->ybesch+=1;} 
      if (1==tasten[9] and spieler[0]->xbesch>-10) {spieler[1]->xbesch-=1;}     
      if (1==tasten[10] and spieler[0]->xbesch<10){spieler[1]->xbesch+=1;} 
      if (1==tasten[11])
      {
                 schuss[1]->ex=-1;
                 schuss[1]->x=spieler[1]->x;
                 schuss[1]->y=spieler[1]->y;
               
                }
     
     
      spieler[0]->posberechnen();
      spieler[1]->posberechnen();
     
      spieler[0]->anzeige();
      spieler[1]->anzeige();
     
      if (0!=schuss[0]->ex){
                            schuss[0]->anzeige();schuss[0]->posberechnen();
                            if (abs(schuss[0]->x-spieler[1]->x)<20 and abs(schuss[0]->y-spieler[1]->y)<20)
                            {schuss[0]->ex=0;}
                            }
      if (0!=schuss[1]->ex){
                            schuss[1]->anzeige();schuss[1]->posberechnen();
                            if (abs(schuss[1]->x-spieler[0]->x)<20 and abs(schuss[1]->y-spieler[0]->y)<20)
                            {schuss[1]->ex=0;}
                            }
     
      SDL_Flip(bildschirm);
      SDL_Delay(20);
      }

SDL_Quit( );
}


Ergebniss: Lag.

Ich weiß zwar nicht, woran es liegt, aber jetzt laggt alles, was ich programmiert habe. Ich glaube, ich setze mich jetzt mit QB ran, irgendwas muss ja gehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 23.04.2006, 14:19    Titel: Antworten mit Zitat

Kann es sein, das SDL jünger ist als die Pentium Prozessoren?
Wikipedia hat Folgendes geschrieben:
SDL wurde von Sam Lantinga während seiner Zeit als leitender Programmierer (1999 bis 2001) bei Loki Software entwickelt.

Daraus schliesse ich, das SDL nicht auf Rechner mit Pentium Rechnern optimiert ist.
(Ehrlich gesagt auch Freebasic nicht)

Vielleicht ist QBasic oder besser QuickBasic doch die bessere Lösung?
Vorallem wenn man es im Dos Modus ausführt, kann der Vorteil riesieg sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 29.04.2006, 11:52    Titel: Antworten mit Zitat

Hm...ich bin mir net ganz sicher, ob QB besser ist, deshalb hab ich mal YAGL ausprobiert.

Ergebniss:
Code:
#include "yaglwrapper.bi"

TYPE spielertyp
    x AS integer
    y AS integer
    s_x AS integer
    s_y AS integer
    s_ex AS integer
    punkte AS integer
END TYPE

OPTION EXPLICIT

YaglGfxDevice_setScreenMode( 640, 480, 16, 0 )

DIM ende AS byte
DIM spieler(2) AS spielertyp

spieler(1).x=10
spieler(1).y=10
spieler(1).punkte=4

spieler(2).x=300
spieler(2).y=300
spieler(2).punkte=4

WHILE (ende=0)
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_ESCAPE )) THEN ende=1
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_LEFT )) THEN spieler(1).x-=1
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_RIGHT )) THEN spieler(1).x+=1
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_UP )) THEN spieler(1).y-=1
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_DOWN )) THEN spieler(1).y+=1
   IF (YaglKeyboard_isKeyPressed( YAGL_KEY_SPACE)) THEN
       spieler(1).s_ex=200
       spieler(1).s_x=spieler(1).x
       spieler(1).s_y=spieler(1).y
   END IF
   IF (YaglKeyboard_isKeyPressed( 65 )) THEN spieler(2).x-=1
   IF (YaglKeyboard_isKeyPressed( 100 )) THEN spieler(2).x+=1
   IF (YaglKeyboard_isKeyPressed( 119 )) THEN spieler(2).y-=1
   IF (YaglKeyboard_isKeyPressed( 115 )) THEN spieler(2).y+=1
   IF (YaglKeyboard_isKeyPressed( 102)) THEN
       spieler(2).s_ex=200
       spieler(2).s_x=spieler(2).x
       spieler(2).s_y=spieler(2).y
   END IF
   YaglGfxDevice_clear( 009900 )
   
   WITH spieler(1)
       IF (.s_ex>0) THEN
           YaglGfxDevice_SolidBox(.s_x,.s_y,.s_x+20,.s_y+5,000000,1.0)
           .s_x-=2
           IF ABS(.s_x-spieler(2).x)<20 AND ABS(.s_y-spieler(2).y)<20 THEN
               .s_ex=0
           END IF
       ELSE
           .s_ex-=1
       END IF
       YaglGfxDevice_SolidBox(.x, .y, .x+10, .y+20,990000,1.0)
   END WITH
   
   WITH spieler(2)
       IF (.s_ex>0) THEN
           YaglGfxDevice_SolidBox(.s_x,.s_y,.s_x+20,.s_y+5,000000,1.0)
           .s_x+=2
           IF ABS(.s_x-spieler(1).x)<20 AND ABS(.s_y-spieler(1).y)<20 THEN
               .s_ex=0
           END IF
       ELSE
           .s_ex-=1
       END IF
       YaglGfxDevice_SolidBox(.x, .y, .x+10, .y+20,000099,1.0)
   END WITH
   
   YaglGfxDevice_swapBuffers()
   'SLEEP 5
WEND


Sieht da irgendjemand etwas grob ressourcen verschwendendes? Auch wenns da mit ner nicht ganz so langsamen Geschwindigkeit läuft(ich schätze mal 10 FPS statt wie bei SDL 1 FPS...) gibts da nen anderes großes Problem: Der Hintergrund ist schwarz, das Viereck besteht seltsamerweise auf 10 weißen Punkten, die großzügig über die Fläche des 1. Vierecks verstreut wurden, das Zweite Viereck sieht man nicht.

Also wahrscheinlich auch hier Fehlanzeige...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 29.04.2006, 13:08    Titel: Antworten mit Zitat

Dein Computer ist zu alt für solche sachen.
(also moderne Bibleotheken)

YAGL ist OpenGL basiert:
freebasic.net hat Folgendes geschrieben:
YAGL An OpenGL based 2D game programming library.

OpenGL ist als Standard noch nicht so alt wie dein Computer.
Zudem ist YAGL selbst sehr jung (man kann nicht für mehrer Rechner Generationen gleichzeitig optimieren).

Vielleicht ist (entgegen eine meine frühren Aussagen) Dos doch eine Lösung.
Wenn es dann noch immer nicht klappt, kannst du es mit reinem Dos (oder auch Dos Boot Disk) versuchen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 29.04.2006, 14:22    Titel: Antworten mit Zitat

ähm....

Farbangaben gehen im Hexadezimalformat, also statt 009900 musst du &H009900 schreiben, sonst ist das ne ganz andere farbe.


Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeterHeins



Anmeldungsdatum: 17.04.2006
Beiträge: 14
Wohnort: Ruhrgebiet

BeitragVerfasst am: 30.04.2006, 14:54    Titel: Antworten mit Zitat

Hm..schade, dann kann ich YAGL wohl nicht verwenden.

Dann hab ich jetzt mal konsequent weiter gemacht, und laut dem, was auf qbasic.de stand, ist UGL die beste Library für so was.

Mit UGL hab ich jetzt diesen Code geschrieben:

Code:
'$INCLUDE: 'inc/ugl.bi'
'$INCLUDE: 'inc/font.bi'
'$INCLUDE: 'inc/kbd.bi'

TYPE spielertyp
 x AS INTEGER
 y AS INTEGER
 punkte AS INTEGER
 sx AS INTEGER
 sy AS INTEGER
 sex AS INTEGER'Schuss existiert
END TYPE

IF NOT uglInit THEN
    PRINT "Fehler! Konnte UGL nicht initiallisieren"
    END
END IF

DIM video AS LONG
DIM schriftart AS LONG

video = uglSetVideoDC(UGL.8BIT, 640, 480, 2)
IF video = 0 THEN
     PRINT "Fehler! Konnte bildschirmmodus nicht setzen"
     END
END IF

schriftart = fontNew("tnr.uvf")

DIM tasten AS TKBD
DIM spieler(2) AS spielertyp

spieler(1).x = 10
spieler(1).y = 10
spieler(1).punkte = 5
spieler(2).x = 200
spieler(2).y = 200
spieler(2).punkte = 5

colors& = uglColors(UGL.8BIT)
vispag = 1
workpag = 0

kbdinit tasten
fontsetsize 18
DO
 
  SWAP workpag, vispag
  uglSetVisPage (workpag)
  uglSetWrkPage (vispag)
  uglClear video, 20
  uglCircleF video, spieler(1).x, spieler(1).y, 10, 10
  fonttextout video, spieler(1).x - 5, spieler(1).y - 5, -1, schriftart, STR$(spieler(1).punkte)

  uglCircleF video, spieler(2).x, spieler(2).y, 10, 5
  fonttextout video, spieler(2).x - 5, spieler(2).y - 5, -1, schriftart, STR$(spieler(2).punkte)

  IF spieler(1).sex > 0 THEN
    spieler(1).sex = spieler(1).sex - 1
    spieler(1).sx = spieler(1).sx - 5
    uglRectF video, spieler(1).sx, spieler(1).sy, spieler(1).sx + 5, spieler(1).sy + 2, 10
    IF ABS(spieler(1).sx - spieler(2).x) < 20 AND ABS(spieler(1).sy - spieler(2).y) < 20 THEN
       spieler(1).sex = 0
       spieler(2).punkte = spieler(2).punkte - 1
    END IF
 
  END IF

  IF spieler(2).sex > 0 THEN
    spieler(2).sex = spieler(2).sex - 1
    spieler(2).sx = spieler(2).sx + 5
    uglRectF video, spieler(2).sx, spieler(2).sy, spieler(2).sx + 5, spieler(2).sy + 2, 5
    IF ABS(spieler(2).sx - spieler(1).x) < 20 AND ABS(spieler(2).sy - spieler(1).y) < 20 THEN
       spieler(2).sex = 0
       spieler(1).punkte = spieler(1).punkte - 1
    END IF
  END IF

  IF (tasten.l) THEN spieler(1).x = spieler(1).x + 1
  IF (tasten.j) THEN spieler(1).x = spieler(1).x - 1
  IF (tasten.i) THEN spieler(1).y = spieler(1).y - 1
  IF (tasten.k) THEN spieler(1).y = spieler(1).y + 1
  IF (tasten.p) THEN
    spieler(1).sex = 300
    spieler(1).sx = spieler(1).x
    spieler(1).sy = spieler(1).y
  END IF
  IF (tasten.D) THEN spieler(2).x = spieler(2).x + 1
  IF (tasten.A) THEN spieler(2).x = spieler(2).x - 1
  IF (tasten.W) THEN spieler(2).y = spieler(2).y - 1
  IF (tasten.s) THEN spieler(2).y = spieler(2).y + 1
  IF (tasten.f) THEN
    spieler(2).sex = 300
    spieler(2).sx = spieler(2).x
    spieler(2).sy = spieler(2).y
  END IF

LOOP UNTIL (tasten.esc)

fontDel schriftart
kbdend
uglRestore
uglEnd
PRINT "Druecken sie eine taste"
END


Dabei habe ich 3 Probleme:

1. Ich kann es nicht richtig kompilieren(nicht als Exe, nur wenn ich Brun45 verwende, und das möchte ich nicht), steht irgendwas von Fatal error und segmenten

2. Obwohl es schon besser als ohne pageflipping ist, flimmern die kreise ab und zu schon ein bisschen. Wie kann ich das beheben?

3. Auf dem langsamen Computer steht nun "Konnte Bildschirmmodus nicht setzen", wenn ich die Exe für Brun45 ausführe....

Außerdem habe ich mal DirectQB runtergeladen und die "Abschiedsrede" gelesen, und drunter stand: "Assembly Tutorial - A modified version of the famous asm tutorial published on QB:tm sometimes ago."
Kann mir jemand sagen, woher ich dieses Tutorial bekomme?
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 -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 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