GLBasic forum

Other languages => GLBasic - de => Topic started by: Worebu on 2014-Nov-07

Title: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-07
Hallo Leute  ...  es hört nicht auf.
Da ich schon ewig nichts mehr mit Basic gemacht habe, und wenn dann mit "Schmutzig Basic" wie SchranzOr es mal nannte, steig ich hier noch nicht ganz durch.

Wenn ich einen Sprite in einer Schleife Rotieren lasse (ROTOSPRITE) zeigt er mir die einzelnen Phasen an und wenn der Sprite am Zielort ist wird er gelöscht und es kommt der nächste.
Warum zeigt er mir die Phasen nicht an und den Sprite der seine Position erreicht hat? Vorallem sehe ich nicht jede Phase einzeln sondern alle auf einmal. Kann mir jemand mal genau erklären wie, wo, warum ich den SHOWSCREEN oder den USEASBMP setzten muss. Das ist im Augenblick bei mir immer noch ein ratespiel. Vielen Dank.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-07
USEASBMP ?
Boah du hupfst echt immer auf den Outdated Befehlen rum :)

Und ja, GOTO ist Schmutzig :P ( wenn es das war... keinen Plan mehr ^^ )


Ich habe SHOWSCREEN immer da:

Code (glbasic) Select
WHILE TRUE
    //Input
    //alles zeichnen
    //updaten
SHOWSCREEN
WEND
END



EDIT:

SHOWSCREEN macht nix anderes als den Backbuffer in den du immer zeichnest in den Frontbuffer (was du siehst) zu schieben um den Backbuffer wieder löschen zu können. Frame für Frame...
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-07
Also ich sach mal so, die Befehle kannte ich vor GLBasic nicht, woher soll ich wissen was Outdated ist und was nicht  ::). ich hab mal 2 Vids angehängt, und so wollte ich es nicht. Wenn die Karten unten sind sollen sie liegen bleiben (wie in Variante 2) und keine Spur (Variante1) hinter sich herziehen.
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-08
Naja, "liegen bleiben" heißt doch, dass du es jedes Frame wieder zeichnen musst, sonst wird es durch Showscreen "gelöscht". Also wenn die Karte unten angekommen ist, sie trotzdem jedes Showscreen wieder zeichnen.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-08
So sieht es aus:

Code (glbasic) Select

WHILE TRUE
MOUSESTATE MX, MY, MB1, MB2


IF i < 190 AND r < 6

ROTOSPRITE 12, 10 + x, -10 + y, i*20

INC x,4
INC y,20
INC i,5
ELSE

i = 0
x = x + 210
y = 0
INC r,1

ENDIF
SHOWSCREEN
WEND



Ist natürlich nur schnell hingemacht. Da ist doch alles drin oder?

Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-10
Quote from: kanonet on 2014-Nov-08
Naja, "liegen bleiben" heißt doch, dass du es jedes Frame wieder zeichnen musst, sonst wird es durch Showscreen "gelöscht". Also wenn die Karte unten angekommen ist, sie trotzdem jedes Showscreen wieder zeichnen.

Das heisst in meinem Beispiel ich muss erst die Schleife die gewünschten male durchlaufen lassen und dann erst den SHOWSCREEN setzten?
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-10
Nee, SHOWSCREEN wechselt die Buffer, ist also der Befehl, der alles anzeigt. Rufst du SHOWSCREEN nicht auf, dann ist gar nichts zu sehen, bzw bleibt das letzte Bild stehen. Ich würde es etwa so strukturieren:

Code (glbasic) Select
//lade alles
WHILE TRUE
IF (karten noch nicht unten)
  // zeichne fallende, drehende karten
ELSE // karten sind unten
  // zeichne das letzte Frame (=unten liegende karten)
ENDIF
SHOWSCREEN
WEND
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-11
Macht das die Sache nicht unnötig kompliziert?. Ich habe zb. 5 Karten (Poker), ich habe die rotierung "Ausgelagert" in eine andere Datei. Ich bekomme das nicht richtig angesprochen. Entweder werden die Fenster sofort geschlossen, oder ich seh garnichts oder alles, jedenfalls nicht das was ich mir wünsche. Ich muss dazu sagen ich habe gerade erst angefangen mit dem Auslagern in eine andere Datei.
Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-11
Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe...

Aber die Struktur eines jeden GLBasic Programms sollte erstmal folgende aussehen:
Code (glbasic) Select

//Hauptdatei
WHILE TRUE //Die Hauptschleife, die gültig ist, bis das Programm beendet wird

//Hier kannst du soviele Funktionen von hier oder aus anderen Dateien aufrufen, wie du möchtest

SHOWSCREEN //wird EINMAL am Ende der Programmschleife aufgerufen um den Backbuffer nach vorne zu holen und auf dem Bildschirm zu zeichnen... Ist grundsätzlich in jedem Framework so
WEND //Und wieder zum Anfang
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-11
Hallo, das ist richtig. Aber wenn der SHOWSCREEN ausgeführt wird ist der inhalt den ich einer FUNCTION "gezeichnet" doch wieder weg  :S .

Code (glbasic) Select



WHILE TRUE

         Karte(25)

SHOWSCREEN
WEND



FUNCTION Karte: AW


IF R < 60
ROTOSPRITE AW, (1920 - 100) / 2, R*10, R*10
INC R, 1
ELSE

DRAWSPRITE AW, (1920 - 100) / 2, R*10
INC KZ
ENDIF

ENDFUNCTION



Sobald die Karte unten ist wird sie durch den SHOWSCREEN gelöscht. Ich kann natürlich die Karte am Zielort neu Zeichnen, was ist aber wenn ich 573 Objekte habe?
Und das geht von der Logig nicht in meine Schädel. Vorallem wenn ich alles probiere und nichts ist so wie ich es will.
Title: Re: Wann den SHOWSCREEN
Post by: spacefractal on 2014-Nov-11
im german translated it to read it....

you need to draw anything before a SHOWSCREEN.

etc im uses something like this for my games:

Code (glbasic) Select

SUB GLB_ON_LOOP:
update()
paint()

SHOWSCREEN
IF KEY(1)
END
ENDIF
ENDSUB


GLB_ON_LOOP is called automatic in each frame. So you should move ROTOSPRITE after the logic have been updated.
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-11
Quote from: Worebu on 2014-Nov-11Hallo, das ist richtig. Aber wenn der SHOWSCREEN ausgeführt wird ist der inhalt den ich einer FUNCTION "gezeichnet" doch wieder weg  :S .
[...]
Sobald die Karte unten ist wird sie durch den SHOWSCREEN gelöscht. Ich kann natürlich die Karte am Zielort neu Zeichnen, was ist aber wenn ich 573 Objekte habe?
Dann zeichnest du eben 573 Objekte. Das ist überhaupt kein Problem und die übliche Vorgehensweise. Erst wenn es irgendwann so viele (viele tausende) Sprites sind, dass es zu Performanceproblemen kommt, dann kann man über andere Möglichkeiten nachdenken (USESCREEN, GRABSCREEN oder CLEARSCREEN -1), aber für dein kleines Kartenspiel sollte das nicht nötig sein und da du ja noch am lernen bist würde ich auch empfehlen es so zu tun, wie es üblicher Standard ist: jedes Frame alles an der gerade aktuellen (egal ob neu oder alt) Position neu zeichnen.
Title: Re: Wann den SHOWSCREEN
Post by: erico on 2014-Nov-12
I will give a try at this too, since looking at the videos I think I understand what you are looking for.

But first, if you can´t do english, try to write a standard German(Deutsch?), for example, in perfect grammar and no slang words, that way, google translator will do a better job in case a dumb Brazilian user like myself  try to help out.  ;)

First, in your loop, you need SHOWSCREEN at the end within the loop, so all fine so far.

Now for your rotating cards to fall rotating and land in a normal straight position, I would do as follow:

.Create a state condition for the cards, like CARDSTATE
.If CARDSTATE=0 then it falls down rotating
.If at the bottom, then CARDSTATE=1
.If CARDSTATE=1 then just keep it rotating untill it is shown on the rest position, straight position, at which point CARDSTATE=2
.If CARDSTATE=2 then it is just there showing it self still and not rotating

So here, not all transformations on the card happens all the time within the loop but just those that the CARDSTATE dictates.
Keep in mind you have to keep drawing your card through every state otherwise SHOWSCREEN will delete the last one displayed.

If this idea rings a bell, I can write some pseudo code to help further.
Of course this is just one approach to the problem.

Cheers.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-12
Ich seh schon... ich glaube ich fange mal eine Tutorial-Series an...

Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-12
Jede Funktion gilt nur für einen Frame - bis zum SCHOWSCREEN.
Du musst alles, was dauerhaft passieren soll - also z.B. Zeichnen einer Karte - auch dauerhaft für jeden Frame neu aufrufen.

Und du kannst hunderte, gar tausende Objekte gleichzeitig zeichnen.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-12
Hatte glaub schon 30.000 Sprites auf 60 FPS, bin mir nicht mehr genau sicher. für nen Kartenspiel reichts :D

Was ist besser, Video- oder Texttutorials?
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-12
Ich sagte "kompliziert" und nicht "Ausführgeschwindigkeit", wenn ich zb. 573 Objekte neu zeichnen soll wo sie am Ende liegen sollen.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-12
Ist es nicht :),  mit TYPES die du in einer Schleife durchratterst !
Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-13
Ehrlich, daran ist nichts kompliziert.
Hab nichts getestet, aber so ähnlich wäre es z.B. möglich.

Code (glbasic) Select

TYPE Sprite
spriteId%
x
y

FUNCTION Load: filename$, x, y
self.spriteId = LOADSPRITE filename$
self.x = x
self.y = y
ENDFUNCTION

FUNCTION Draw:
DRAWSPRITE self.spriteId, self.x, self.y
ENDTYPE

mySprite AS Sprite

mySprite.Load("MeinDateipfad.png", 100, 100)

WHILE TRUE
mySprite.Draw()

SHOWSCREEN
WEND
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-13
Gut, kann ich nichts zu sagen. Funktioniert nicht, bekomme immer GPC0001 Syntax Error. Aber wieso benutzt du SELF, vorallem, wenn das notwendig ist, wo steht was darüber?
Title: Re: Wann den SHOWSCREEN
Post by: D2O on 2014-Nov-13
Code (glbasic) Select
FUNCTION Draw:
DRAWSPRITE self.spriteId, self.x, self.y
ENDTYPE


hier fehlt das
Code (glbasic) Select
ENDFUNCTION

Code (glbasic) Select
FUNCTION Draw:
DRAWSPRITE self.spriteId, self.x, self.y
ENDFUNCTION
ENDTYPE


Wenn man hier inerhalb des Typs kein Self benutzen würdest, wäre z.B. die Variable x in einer Funktion
eine eigenständige Lokale Variable, Du hast aber ja am anfang beim Type schon diese Variable erstellt und kannst so mit self
auf diese im Type erstellte Variable zugreifen.
Ich hoffe das ist verständlich ( muss erst noch richtig wach werden , Nachtschicht)
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-13
Also das mit dem self habe ich aber auch zum ersten Mal gehört, muss ich zugestehen!
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-13
Also verändere ich im Prinzip die Variable im ganzen Programm (GLOBAL) statt  nur in der FUNCTION (LOCAL)?. Das das ENDFUNCTION fehlte habe ich gesehen, ich bekomme den Fehler aber hier: self.spriteId = LOADSPRITE filename$.  :S

@S.O.P.M: Ein Glück, dann bin ich nicht allein. Aber wie soll man auf sowas kommen wenns nirgends steht?
Title: Re: Wann den SHOWSCREEN
Post by: Fabbio on 2014-Nov-14
Bin gerade bei der Arbeit,
Aber der fehler wird am loadsprite liegen.
Das gibt keine id zurück!
Du musst der Variable spriteid mit z. B. Gensprite ()  ein id zu weisen.
Dann wird loadsprite filenam $, spriteid
Das file geladen.
Wenn ich Feierabend habe, schreibe ich dir ein beispiel.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-14
Steht sehr wohl in der Hilfe ( F1 - Taste ).
Ich will dir jetzt auch nicht zu nahe treten Worebu, aber ein wenig eigenes "versuchen und verstehen" deinerseits sollte auch gegeben sein.
Hilft dir persönlich nix wenn du alles vorgekaut bekommst. Meiner Meinung nach fehlt es dir schon an den Basics der Programmierung.

Habe dir/euch vorgeschlagen eine Tutorialreihe zu starten, vom "Einfachen Aufbau" bis hin zur komplexeren Modularbauweise ( "Code-Reusing" ).
Ist hier im Thread aber keiner drauf eingegangen...
Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-14
@Worebu: Es war zwar keine Absicht, aber eingebaute Fehler selbst zu finden ist schon gut zur Übung.
Und wenn da Syntax-Fehler steht, ist das doch ziemlich eindeutig... Irgendwas an der Syntax ist falsch, sprich es fehlt was oder wurde falsch geschrieben.

Zudem änderst du durch "self.xxx" nicht GLOBAL im Programm etwas.

Ein TYPE ist eine Typen-Vorlage, z.B. ein Mensch, ein Auto, ein Irgendwas mit individuellen Eigenschaften.
Beim Auto z.B. PS.

So brauchst du nämlich NICHT GLOBALE Variablen erstellen, sondern einfach fünf Autos, welche alle die individuelle Eigenschaft PS haben.

Hast du also einen TYPE mit der Eigenschaft PS kannst du nun fünf Autos erstellen:
Code (glbasic) Select

//Vorlage für den TYP(E) Auto
TYPE Auto
PS
ENDTYPE

//Fünf individuelle Autos definieren
Auto1 AS Auto
Auto2 AS Auto
Auto3 AS Auto
Auto4 AS Auto
Auto5 AS Auto

//Jedem Auto eine andere PS-Anzahl geben
Auto1.PS = 75
Auto2.PS = 100
Auto3.PS = 29
Auto4.PS = 450
Auto5.PS = 250

//Nun kannst du aber dem Auto auch eine eigene Funktion geben, die die PS festsetzt
TYPE Auto
PS

FUNCTION Init: ps
self.PS = ps
ENDFUNCTION
ENDTYPE

Auto1 AS Auto
Auto1.Init(120)


Du solltest dir vielleicht mal die allernötigsten Grundlagen zur objektorientierten Programmierung nahebringen.
Dann verstehst du schon was ich meine.

Aber wie Schranz0r schon sagt, du zeigst leider sehr wenig Eigeninitiative.
Klar hat jeder mal klein angefangen, aber man sollte schon etwas länger probieren, wenn etwas nicht geht.
Nicht nur Snippets kopieren und erwarten, dass es gleich alles funktioniert. :)

P.S. nun rate mal, wieso sich der Code da oben nicht einfach kompilieren lässt, gute Aufgabe. :)
Title: Re: Wann den SHOWSCREEN
Post by: D2O on 2014-Nov-14
Huch, bin ja fast zu langsam, musste erst noch schnell die Kids in die Schule fahren.

@Worebu, möchte Dich jetz nicht ganz hängen lassen ;)
daher hier mal eine Code beispiel.
Du musst nur die eigene Grafik angeben.

Code (glbasic) Select
// --------------------------------- //
// Project: Worebu
// Start: Friday, November 14, 2014
// IDE Version: 12.312


SETCURRENTDIR("Media") // go to media files

// Systemmaus anzeigen
SYSTEMPOINTER TRUE

// Erstellen eines Type
// Vorteil, einmal einen Typ und variablen anlegen und sie
//für viele Grafiken nutzen, spart Tiparbeit!
TYPE Tsprite
// Variablen für die Position
posx%
posy%
// Variable für die Sprite ID
id%

// Function/member für das laden eines Sprites

FUNCTION myloadsprite: filename$  // filename ist eine Lokale Variable auf die nicht zugreifen kannst,
// hier aber zu übergabe benötigt wird
// zugriff auf auf die Internen Typevariablen mit SELF.
self.id% = GENSPRITE() // Mit Gensprite automatisch eine ID zuweisen

// Nun die eigendliche funktion zu laden einer grafik
// die datei wird nun in den Speicher geladen auf die Du dann mit der ID zugreifen kannst
LOADSPRITE filename$,self.id%

ENDFUNCTION

// Einfache Function zum zeichnen des Sprite

FUNCTION mysimpledraw:

DRAWSPRITE self.id%,self.posx%,self.posy%

ENDFUNCTION

// finde ich persönlich besser
FUNCTION mydraw: x%,y%  // Lokale Variablen!
// übergeben der lokalen Variablen
self.posx% = x%
self.posy% = y%

DRAWSPRITE self.id%,self.posx%,self.posy%
ENDFUNCTION


ENDTYPE
// Globale Variable vom Type Tsprite erstellen

GLOBAL bild1 AS Tsprite
//  GLOBAL bild2 AS Tsprite  ... usw.

// Variablen für die Maus
GLOBAL mx%,my%,bt1%,bt2%

// Bilder laden

bild1.myloadsprite("testbild.png")


// Mainloop

WHILE TRUE

MOUSESTATE mx%,my%,bt1%,bt2%
// Bild zeichnen
// Version1
// Positionen angeben
bild1.posx = 10
bild1.posy = 10
// dann zeichnen
bild1.mysimpledraw()
// und hier  die Typevariable auch ausgeben
PRINT bild1.id%, 10,50
PRINT bild1.posx%, 10,80
PRINT bild1.posy%, 10,110

//Version2
// Bild zeichnen und direkt die Position angeben
bild1.mydraw(100,100)

// und hier  die Typevariable auch ausgeben
PRINT bild1.id%, 100,150
PRINT bild1.posx%, 100,180
PRINT bild1.posy%, 100,210

// Version3
// Bild an der Mausposition zeichen
bild1.mydraw(mx%,my%)

// und hier  die Typevariable auch ausgeben
PRINT bild1.id%, mx%,my%+50 // etwa unterhalb des Bildes anzeigen,
//daher my+
PRINT bild1.posx%, mx%,my%+80
PRINT bild1.posy%, mx%,my%+110

SHOWSCREEN  // Gezeichnetes anzeigen
WEND


@backslider, Du kleine Sau  :good:
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-14
Hey ihr geilen Schnitten :D

Wieder geht keiner auf meinen Vorschlag ein...  :S
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-14
Entschuldigung, dass ich mich hier auch nochmal einmischen muss. Jedoch gibt es hier durchaus Unstimmigkeiten, die auch ich als Neuling oder jemand, der noch Verständnisprobleme hat, so nicht akzeptieren könnte.

Quote from: backsliderSo brauchst du nämlich NICHT GLOBALE Variablen erstellen, sondern einfach fünf Autos, welche alle die individuelle Eigenschaft PS haben.
Diese Aussage ist schon ein wenig irreführend und nur wahr, wenn man sie entsprechend interpretiert. Ich habe den Code selbst ausprobiert und weiß, warum er sich nicht compilieren lässt. Es ist jedoch nicht mal nur 1 grundsätzlicher Fehler drin, so viel schon vorweg.

Die Möglichkeit, eine Funktion innerhalb eines Types zu platzieren habe ich selbst noch nie genutzt. Tatsächlich färbt GLBasic das nicht offizielle Schlüsselwort "self" ein und zeigt in der Statusleiste "self.aufruf(self.x,self.y)...". Für jemand, der eine Basic-Sprache neu lernt, ist das nicht nachvollziehbar.
Zumal Fakt ist, dass die integrierte Hilfe keinen Hinweis auf diese Funktionalität enthält! Jede gegenteilige Aussage ist nicht fair.

So, wie auch ich mittlerweile mitbekommen habe, bietet GLBasic ansatzweise Funkionalitäten der objektorientierten Programmierung, obwohl das in einer klassisch strukturierten Basic-Sprache weder zu erwarten ist, noch solche Grundkenntnisse vorausgesetzt werden können.

Ich selbst bin zwar zufrieden mit GLBasic, weil ich die Dinge, die ich damit machen will, meistens früher oder später hinkriege (wenn auch oft nur mit viel Geduld, Probiererei und Befragung des Forums) - allerdings gibt es durchaus erwähnenswerte Mankos. Für Neueinsteiger, die mit der Erwartung herkommen, sich GLBasic aneignen zu können, ohne erst das halbe Forum durchwühlen und Informationen zusammenzusuchen zu müssen, die die Dokumentation nicht, nur indirekt oder unzureichend erklärt, ist das durchaus unerfreulich und frustrierend.
Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-14
Quote from: Schranz0r on 2014-Nov-14
Hey ihr geilen Schnitten :D

Wieder geht keiner auf meinen Vorschlag ein...  :S

Ich denke es ist ein super Vorschlag, wenn du dich dafür bereiterklärst und ein paar Tutorials bastelst.
Auch glaube ich das Videos auf Youtube GLBasic generell helfen könnten, weil soviele habe ich da noch nicht gesehen. :)
Title: Re: Wann den SHOWSCREEN
Post by: D2O on 2014-Nov-14
Quote from: Schranz0r on 2014-Nov-14
Hey ihr geilen Schnitten :D

Wieder geht keiner auf meinen Vorschlag ein...  :S
Nö, ist bald Weihnachten  :D  :booze:

Edit://
@S.O.P.M.,
hmmm, Du hast eigendlich recht.
Die Hilfe ist nicht unbeding die beste und ja, vieleicht muten wir Worebu etwas zuviel mit den Types, bzw. SELF zu.

@Worebu,
nimms uns nicht übel, im Grunde meinen wir es nur gut mit Dir.
Also gib nicht auf, GLB ist ansich nicht so schwer, man kann sich da schon "Durchkämpfen", es gibt durchaus schwierigere
Sprachen.
Ich selber bin auch nicht der beste, habe hier immer wieder pausen von 6 bis 9 Monaten drin und muss dann auch immer wieder mal nachfragen, bzw. vieles nachlesen/auffrischen.

Wenns Probleme mit Deinem Code gibt, grenze das ganze ein, schreibe kleine theoretisch Lauffähige Code's
und poste sie, so können wir relativ schnell nachvollziehen was nicht funktioniert.
Aber nicht unter dem Motto "Copy & Paste" und den rest machen die schon.
Ok?
Title: Re: Wann den SHOWSCREEN
Post by: backslider on 2014-Nov-14
QuoteDiese Aussage ist schon ein wenig irreführend und nur wahr, wenn man sie entsprechend interpretiert. Ich habe den Code selbst ausprobiert und weiß, warum er sich nicht compilieren lässt. Es ist jedoch nicht mal nur 1 grundsätzlicher Fehler drin, so viel schon vorweg.

Die Aussage ist immer wahr, eventuell wurde meine Aussage missverstanden.
Wenn du ein Objekt vom Typen Auto hast mit der Eigenschaft PS, dann ist diese niemals, egal wie man interpretiert, GLOBAL.

Sie ist über das Objekt vom Typen Auto aufrufbar, ja. Aber eine globale Variable ist was anderes.

Aber zum Rest deiner Aussagen gebe ich dir Recht S.O.P.M.! :)
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-14
Functions in Types und self ist ein geeignetes Mittel um manche Dinge einfacher oder angenehmer zu gestalten - es ist aber nicht zwingend nötig und eigentlich auch nicht klassisch Basic. Gernot hat es auch nur wegen starker Nachfrage im Forum implementiert, aber eben nicht wirklich dokumentiert. Implementierung und Beispiel gibt es hier (http://www.glbasic.com/forum/index.php?topic=4486.msg33545#msg33545).

Generell ist es gut, dass wir es haben - grundsätzlich kann aber auch alles was mit OOP geschrieben wird, auch ohne geschrieben werden. Warum das jetzt hier in die Diskussion eingeführt werden musste, verstehe ich nicht, Worebu ist definitiv noch am Anfang des Lernprozesses und hat noch einiges vor sich, es war daher sicher keine so übermäßig gute Idee ihm auch gleich noch mit einem schlecht dokumentierten Feature wie OOP zu kommen.

@Worebu: von der Diskussion um self mal abgesehen, ist dein ursprüngliches Problem jetzt soweit gelöst?
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-14
@S.O.P.M - Danke das auch mal eine die Lanze für einen Newbie bricht.

Ich habe die Hilfe in ein Word Doc konvertiert um richtig suchen zu können und Word hat das Wort SELF nicht gefunden. Soviel zu "keiner" Eigeninitiative. Ein anderes Problem ist auch, allerdings nicht von GLBasic, das jeder anders programmiert oder seinen Code sauberhält. Ich habe mit Tuts über z.B. Blitzbasic angeschaut und ausprobiert und kann nur sagen ... oh mein Gott. Der Editor ist ein Witz und von lesbar keine Spur. Man kann nicht mal die Fontgrösse ändern .... mann hatte ich Kopfschmerzen. Aber der Vorschlag von SchranzOr wird von mir natürlich gerne angenommen. Und was die Outdated Befehle angeht gibs da was drüber, damit einer wie ich die gleich weglässt und nicht benutzt ?
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-14
Auch in der Hilfe als chm sollte man problemlos suchen können, aber als word gehts sicher auch.
Als outdated fallen mir spontan ein: LET und BLACKSCREEN, eventuell auch noch LOADBMP/USEASBPM, wobei ich nicht ganz weiß, warum Schranz0r die dazu zählt.
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-14
Quote from: backsliderDie Aussage ist immer wahr, eventuell wurde meine Aussage missverstanden.
Wenn du ein Objekt vom Typen Auto hast mit der Eigenschaft PS, dann ist diese niemals, egal wie man interpretiert, GLOBAL.
Sie ist über das Objekt vom Typen Auto aufrufbar, ja. Aber eine globale Variable ist was anderes.
Alles klar. Es war, wie ich vermutet habe, eine reine Verständnissache. Richtig verstanden, ist die Aussage demnach immer wahr. Für mich ist eine globale Variable eine Variable, deren Wert von jeder Stelle im Programm aus gelesen werden kann. In deinem nicht ausführbaren Codebeispiel ist noch gar nicht festgelegt, ob die Typinstanzen global oder lokal sind.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-14
Erstmal Dank an alle.

@SchranzOr für ein TUT wäre ich wohl zuhaben, apropo geile Schnitten, kennen wir uns ;-)

@D20: Von Cut and Paste kann bei meiner Frage nicht Rede sein.

@kanonet: Da muss ich erstmal alles ausprobieren, TYPES oder FUNCTION oder nicht.

In diesem Sinne, ersmal Gute Nacht.



Title: Re: Wann den SHOWSCREEN
Post by: Marmor on 2014-Nov-14



@ Worebu 
bleib dran , ich glaub wenn du erstmal das grundprinzip verinnerlichst hast merkst du das es fetzt.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-16
Ich wieder. Um euch zu beruhigen. Es hat sich nichts geändert. Ich habe immer noch das selbe Problem. Ich habe den ganzen Samstag damit verbracht habe es zu lösen. Ich weiss immer noch nicht wo der SHOWSCREEN hinkommt. Code posten hat ja keinen Sinn (wegen Cut & Paste). Ich wills ja begreifen. GLBasc macht was es will.

Mein Aufbau:

Daten laden (grafik)

While

   For Next Schleife mit Aufruf der Funktion

Showscreen
Wend

Ich Zeichne den Hintergrund, Rotate heist ich drehe die erste Karte. Eine Schleife von X grad. Ist die Karte unten zeichne ich sie neu (wie empfohlen). Da ich aber 5 Karten habe kommt die nächste und alles wird wieder gelöscht. Kann mir einer Erkären wo das Ding hinkommt damit ich auch mal was sehe? Vom technische funktioniert alles bekomme keine Fehlermeldung. Wäre Dankbar wenn mir mal jemand den Knoten aus meinem Kopf machen könnte. 
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-16
Also solange du nur eine Karte hast, funktioniert es wie es soll, aber dir fehlt noch der Schritt von einer zu mehreren Karten?
Quote from: Worebu on 2014-Nov-16Ich Zeichne den Hintergrund, Rotate heist ich drehe die erste Karte. Eine Schleife von X grad. Ist die Karte unten zeichne ich sie neu (wie empfohlen). Da ich aber 5 Karten habe kommt die nächste und alles wird wieder gelöscht. Kann mir einer Erkären wo das Ding hinkommt damit ich auch mal was sehe?
Naja du musst jedes SHOWSCREEN alles neu zeichnen, sonst ist es weg. D.h. ist die erste Karte unten angekommen und kommt die zweite, dann musst du jedes SHOWSCREEN nicht nur die zweite Karte zeichnen, sondern eben auch noch die erste, und den Hintergrund. Zeichnest du nur die zweite Karte, dann ist eben auch nur die zweite Karte zu sehen. Klingt doch logisch oder?

Wenn du das jetzt für jede Karte einzeln schreibst, dann funktioniert das zwar, aber ist natürlich ein Riesenaufwand, der mit jeder weiteren Karte weiter steigt. Du solltest dir also (sobald es mir zwei Karten klappt) überlegen, wie du den Code generalisieren kannst, so dass es egal ist, ob die 1 Karte zeichnest, oder 52. Stichwort wären hier Arrays, eventuell Plus Types.

Quote from: Worebu on 2014-Nov-16GLBasc macht was es will.
Das ist so nicht korrekt: GLBasic macht was du ihm sagst. Und zwar exakt so wie du es ihm sagst. Aber das heißt eben, dass du ihm jeden noch so kleinen Schritt haarklein vorkauen musst. :nana:
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-16
Idealerweise läuft jedes GLBasic Programm in einer großen Hauptschleife ab. SHOWSCREEN muss in dieser Schleife ganz ans Ende bzw. dann auftauchen, nachdem alle Grafiken gezeichnet wurden. Du hast es schon an die richtige Stelle gesetzt, Worebu. Das Verständnisproblem liegt nach meiner Auffassung immer noch darin, bei jedem Frame, also jedem Schleifendurchlauf, stets alles zeichnen zu müssen, was auch angezeigt werden soll. Das war ja damals bei den alten Basicsprachen nicht so - wie z.B. bei QBasic, welches ich intensiv genutzt hatte. Du musst deinen Code so organisieren, dass zu jedem Zeitpunkt alles gezeichnet wird, was sichtbar sein soll. Dies hinzubekommen bedarf wahrscheinlich weiterer Hilfestellung. Arrays sind da der richtige Weg, wie schon erwähnt wurde.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-16
Guten Morgen,  da ich die Rotation in einer FOR NEXT Schleife habe muss SHOWSCREEN da auch mit rein?, nach jedem PRINT Befehl ein SHOWSCREEN? Also reicht eigentlich ein SHOWSCREEN nicht.

@kanonet: zb.: Ich habe auf dem Screen eine Überschrift mit PRINT, sobald ich anfange die Karte zu drehen wird PRINT gelöscht, ist die Karte unten zeichne ich sie an die letzten koordinaten, jetzt kommt die zweite Karte (habe ja 5) wird die erste karte gelöscht.  Zum Schluss habe ich die letzte, fünfte Karte unten an der Zielposition liegen und das Programm ist durch. Ich habe das in einer FUNCTION in einer anderen Datei geschrieben (TYPE). Wie gesagt keine Fehlermeldung.
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-16
Nein, in eine "For-Schleife" kommt NIEMALS ein SHOWSCREEN, zumindest ist mir kein Einsatz dafür bekannt...

SHOWSCREEN ist im Normalfall IMMER über WEND.

Dein Code ist mit Sicherheit einfach nur falsch!
Du drehst bestimmt komplett(360°) bis du überhaupt das Showscreen wieder triffst...
Wenn ja, dann falsch!

Du musst Rotationen pro Frame ausführen, sonst wird das nix.
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-16
QuoteGuten Morgen,  da ich die Rotation in einer FOR NEXT Schleife habe muss SHOWSCREEN da auch mit rein?, nach jedem PRINT Befehl ein SHOWSCREEN? Also reicht eigentlich ein SHOWSCREEN nicht.
Genau da scheint das Problem zu liegen. Du rufst SHOWSCREEN dann doch an der falschen Stelle auf. Andere Formulierung, um es vielleicht besser zu verdeutlichen, was passiert. Folgender Satz ist absolut entscheidend für das grundlegende Verständnis mit SHOWSCREEN: Du siehst auf dem Bildschirm immer genau das - und nur das - was seit dem letzten Aufruf von SHOWSCREEN bis zum erneuten Aufruf von SHOWSCREEN gezeichnet wurde. Würdest du nach jedem PRINT einen SHOWSCREEN aufrufen, dann würde dir auch immer nur der Text des einen PRINT angezeigt werden. Möchtest du mehrere PRINT's angezeigt bekommen, musst du sie alle nacheinander, ohne SHOWSCREEN dazwischen, aufrufen. Möchtest du zu diesem Text oder mehreren Texten weitere Grafikausgaben, müssen die ebenfalls alle noch aufgerufen werden, bevor das nächste SHOWSCREEN kommt. Ist das verständlicher?
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-16
Quick and Dirty:

Code (glbasic) Select

TYPE TKarte
rotation%
spr_id%
ENDTYPE


LOCAL Karte1 AS TKarte
LOCAL Karte2 AS TKarte


CREATESCREEN 1, 1, 50, 100
USESCREEN 1
DRAWRECT 0,0, 50, 100,  RGB(0xff, 0x00, 0x00)
USESCREEN -1

Karte1.spr_id = 1
Karte2.spr_id = 1


WHILE TRUE

INC Karte1.rotation
IF Karte1.rotation >= 359 THEN Karte1.rotation = 0

DEC Karte2.rotation
IF Karte2.rotation <= -359 THEN Karte2.rotation = 0

ROTOSPRITE Karte1.spr_id, 100,100, Karte1.rotation

ROTOSPRITE Karte2.spr_id, 300,100, Karte2.rotation

PRINT Karte1.rotation, 10 ,10
PRINT Karte2.rotation, 10 ,30

SHOWSCREEN
WEND
END


Evtl. wirds dir so klar?!
Title: Re: Wann den SHOWSCREEN
Post by: D2O on 2014-Nov-16
Guten morgen,

das ganze vielleicht so?
Alles mit Array und seperaten Variablen,
3 Bilder/Karten,
2 davon in einem For Next zeichnen,
1 ausserhalb,
Berechnungen ausserhalb der For Next,

schaut dann so aus,
https://www.dropbox.com/sc/l51qapxixsbz9fx/AAAQg5PXp7tyGnrGs6Tx3Ymua (https://www.dropbox.com/sc/l51qapxixsbz9fx/AAAQg5PXp7tyGnrGs6Tx3Ymua)

Code (glbasic) Select
// --------------------------------- //
// Project: Worebu
// Start: Friday, November 14, 2014
// IDE Version: 12.312

// 640 * 480 bei 60 FPS Standart GLB einstellung
SETCURRENTDIR("Media") // go to media files

// Systemmaus anzeigen
SYSTEMPOINTER TRUE


GLOBAL i% // for next counter
GLOBAL bild%[] // für die ID's
DIM bild%[3] // 0-2 = 3 Felder

GLOBAL winkel%,winkel2%  //Für die drehung
GLOBAL mx%,my%,bt1%,bt2% // Mousedaten

GLOBAL karte_y% // für die y position
GLOBAL rotocontrol = TRUE // soll gedreht werden dann TRUE





FOR i = 0 TO 2
bild%[i] = GENSPRITE()
LOADSPRITE i+".png",bild%[i] // Bilder haben den Namen 0.png,1.png...
NEXT

WHILE TRUE
// Berechnungen
MOUSESTATE mx%,my%,bt1%,bt2%

// Berechnungen für Zeichnen 1 und 2
INC winkel,1 // Pro schleifen durchgang (hier bei 60 FPS) winkel um 1" erhöhen
// Sicherheitsabfrage, da es nur 360° gibt, soll der zähler bei 359° wieder auf
// 0° zurückgestellt werden
IF winkel > 359 THEN winkel = 0

//Berechnungen für Zeichnen 3
IF karte_y < 350 // Ist die position kleiner 350, weiter y bewegen
INC karte_y,1
ELSE // ansonsten keine bewegung und keine drehung
rotocontrol = FALSE
winkel2 = 0
ENDIF
IF rotocontrol = TRUE // solange TRUE, drehen
DEC winkel2,1
IF winkel2 < 0 THEN winkel2 = 359
ENDIF




// 2 unterschiedliche Bilder in einer Forschleife zeichen
FOR i = 0 TO 1
// Zeichnen
//1
ROTOSPRITE bild[0],50,50,winkel% // Bild wird auf der position 50,50 gedreht,
//2 // bei einer framerate vom 60 FPS
ROTOSPRITE bild[1],mx,my,winkel% // hier hängt die Grafik an de Mouseposition
//3
NEXT

// ein Bild einzeln zeichnen
ROTOSPRITE bild[2],200,karte_y,winkel2% // Grafik bewegt sich nach unten





SHOWSCREEN  // Gezeichnetes anzeigen
WEND


Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-16
Danke für die Hilfe. ich glaube ich habe es. In "alten" Basic Dialekten hat man die Grafik irgendwo hingeschmissen und da lag sie, und man konnte in der Tatsturabrage eine "Warteschleife" einbauen (bis was einegeben wurde). Bei GLBasic MUSS ich immer Zeichnen oder Abfragen oder was immer, also in einer Schleife alles am laufen halten. Ich habe ja Beispiele und verschieden Lösungen bekommen, werde die mal anschauen und sehen welche besser passt.

Vielen Dank.
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-16
QuoteIn "alten" Basic Dialekten hat man die Grafik irgendwo hingeschmissen und da lag sie, und man konnte in der Tatsturabrage eine "Warteschleife" einbauen (bis was einegeben wurde).
Genau das war meine Rede. Man hat die Grafik einmal gezeichnet und sie blieb, hier muss sie immer wieder gezeichnet werden. Man kann bei GLBasic zwar auch mit z. B. KEYWAIT dafür sorgen, dass das Programm anhält, doch das hätte dein Problem nicht gelöst. Ist dir auch der entscheidende Vorteil dieser Methode bewusst? ;)
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-16
Das der Screen immer Aktuell ist oder das Schneller auf änderungen reagiert wird.
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-16
Wie es in der Hilfe so herrlich formuliert ist: "GLBasic benutzt versteckte Bildschirmseiten für flackerfreien Grafikaufbau." Diese Phrase gefällt mir bis heute saumäßig gut :good:
Durch diese Methode hat man einen sauberen Bildaufbau. Grafiken, die bspw. verschoben werden sollen, müssen vorher nicht mit der Farbe des Hindergrundes übermalt werden. Dadurch kann ein Flackern entstehen - jeder kennt das von früher. Die auf die versteckte Bildschirmseite gezeichneten Grafiken werden praktisch auf einen Schlag in den Vordergrund gebracht.

Eventuell könnte für dich der Befehl CLEARSCREEN -1 interessant sein. Damit werden Grafiken zwar auch nicht unmittelbar auf den sichtbaren Bereich gerendert, jedoch bleiben sie bei jedem Aufruf von SHOWSCREEN auch ohne erneutes Zeichnen erhalten. Das zumindest interpretiere ich selbst aus der Beschreibung. Allerdings solltest du diese Variante nicht verwenden, sondern dir die gebräuchliche Methode aneignen. Schließlich machst du es, wie es dir am liebsten ist.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-17
Wobei ich jetzt aber nicht sagen könnte

for i = 1 to 360
  rotosprite 1, 300,300, i
next

weil ich ja keinen Showscreen einbauen darf (soll). Dann müsste ich solche Sachen immer ohne Schleife machen, und einen Zähler mitlaufen lassen.

So nachdem Motto:

if i < 360
  rotosprite 1, 300,300, i
   inc i
endif

so mal als beispiel, ist das richtig?
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-17
Exakt, eine FOR-Schleife wäre für soetwas falsch, die könntest du höchstens gebrauchen, wenn du durch ein Array mehrerer Elemente gehst und sie alle zeichnest - aber nicht, um ein einzelnes Element zu zeichnen.
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-17
Aber wenn ich jetzt 5 karten habe, muss ich 5 mal Drawsprite einbauen wenn die karten zeichen will die unten sind unten sind?
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-18
Selbstverständlich! Für jede darzustellende Kartengrafik ein DRAWSPRITE.
Title: Re: Wann den SHOWSCREEN
Post by: kanonet on 2014-Nov-18
Wenn du alle Karten in einem Array hast und durch dieses mit FOR oder FOREACH läufst, dann musst du nur ein DRAWSPRITE schreien (natürlich werden trotzdem 5 Aufgerufen), das ist, was ich meinte damit den Code so zu gestallten, dass es egal ist, wie viele Karten du tatsächlich hast.
Title: Re: Wann den SHOWSCREEN
Post by: S.O.P.M. on 2014-Nov-18
Ja natürlich meinte ich auch mehrere Aufrufe von DRAWSPRITE, nicht, dass der Befehl wegen mehrerer Karten auch mehrfach im Code steht ;)
Title: Re: Wann den SHOWSCREEN
Post by: Schranz0r on 2014-Nov-18
Sag ja, Basics...
Evtl. komm ich morgen dazu die ersten Tutorials zu machen
Title: Re: Wann den SHOWSCREEN
Post by: Worebu on 2014-Nov-18
da freuh ick mir jetzt schon.