Wann den SHOWSCREEN

Previous topic - Next topic

Schranz0r

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?
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

Ich sagte "kompliziert" und nicht "Ausführgeschwindigkeit", wenn ich zb. 573 Objekte neu zeichnen soll wo sie am Ende liegen sollen.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Schranz0r

Ist es nicht :),  mit TYPES die du in einer Schleife durchratterst !
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

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

Worebu

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

D2O

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)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

S.O.P.M.

Also das mit dem self habe ich aber auch zum ersten Mal gehört, muss ich zugestehen!
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Worebu

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

Fabbio

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.

Schranz0r

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...
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

#25
@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. :)

D2O

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:
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Hey ihr geilen Schnitten :D

Wieder geht keiner auf meinen Vorschlag ein...  :S
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

S.O.P.M.

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.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

backslider

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. :)