|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 21.04.2006, 21:46 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 21.04.2006, 22:05 Titel: |
|
|
so langsam glaub ich auch du bist DaGeRe himself 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 |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 21.04.2006, 22:09 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 21.04.2006, 22:51 Titel: |
|
|
Was? Provider? Ich bin bei Arcor, das ist am billigsten. |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 21.04.2006, 23:10 Titel: |
|
|
Thread wegen erwiesener Sinnlosigkeit und Rumgefake³ schließen? _________________ Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft. |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 22.04.2006, 10:56 Titel: |
|
|
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 |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 22.04.2006, 23:44 Titel: |
|
|
Danke erstmal für deine Hilfe, Michael Frey.
Doch leider laggt es immer noch
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.
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.04.2006, 09:03 Titel: |
|
|
Jetzt will ich's wissen .
(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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 23.04.2006, 12:54 Titel: |
|
|
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?! Ich würd auch sagen: The master himself... |
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 |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 23.04.2006, 13:20 Titel: |
|
|
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.04.2006, 15:19 Titel: |
|
|
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 |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 29.04.2006, 12:52 Titel: |
|
|
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 |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 29.04.2006, 14:08 Titel: |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 29.04.2006, 15:22 Titel: |
|
|
ähm....
Farbangaben gehen im Hexadezimalformat, also statt 009900 musst du &H009900 schreiben, sonst ist das ne ganz andere farbe.
Michael |
|
Nach oben |
|
|
PeterHeins
Anmeldungsdatum: 17.04.2006 Beiträge: 14 Wohnort: Ruhrgebiet
|
Verfasst am: 30.04.2006, 15:54 Titel: |
|
|
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 |
|
|
|
|
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.
|
|