Wann den SHOWSCREEN

Previous topic - Next topic

Worebu

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.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Schranz0r

#1
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...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Worebu

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.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

kanonet

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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Worebu

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?

Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Worebu

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?
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

kanonet

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
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Worebu

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.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

backslider

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

Worebu

#9
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.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

spacefractal

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.
Genius.Greedy Mouse - Karma Miwa - Spot Race - CatchOut - PowerUp Elevation - The beagle Jam - Cave Heroes 2023 - https://spacefractal.itch.io/

kanonet

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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

erico

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.

Schranz0r

Ich seh schon... ich glaube ich fange mal eine Tutorial-Series an...

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

backslider

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.