Include
Übersicht BlitzBasic Beginners-Corner
Krumu1201Betreff: Programmierkonzept |
Mo, Nov 03, 2014 16:14 Antworten mit Zitat |
|
---|---|---|
Hey leute,
Sorry das so spät schreibe. Muss mir erstmal klar werden wo ich mit meinem Projekt hinwill. Habe jetzt ne Frage zum Grundlegenen Programmierkonzept. Programmmiere grundsätzlich immer so: Code: [AUSKLAPPEN] Graphics 800,600,16,2 SetBuffer BackBuffer() frametimer = CreateTimer(60) ;hier stehen variablen, types, schriften, Grafiken usw. Repeat WaitTimer(frametimer) Cls funk1() funk2() Flip 0 Until KeyHit(1) End function funk1() ;code end funtion function funk2() ;code end funtion ;usw. also fasst alles in Funktion und die rufe ich dann in der Hauptschleife auf. Ist das überhaupt sinvoll so? Gruß Krumu1201 |
||
BladeRunnerModerator |
Mo, Nov 03, 2014 20:00 Antworten mit Zitat |
|
---|---|---|
Was Du da beschreibst ist ein prozeduraler Ansatz, und der ist durchaus okay, der wurde Jahrzehntelang genutzt. Mittlerweile ist man eher beim objektorientierten Ansatz, aber Blitz bietet dafür nur begrenzte Möglichkeiten. Solange Du zurecht mit deinem Ansatz kommst bist Du auf dem rechten Weg. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Krumu1201Betreff: Danke |
Di, Nov 04, 2014 8:30 Antworten mit Zitat |
|
---|---|---|
Und wie würde ein objektorientierter Ansatz in Blitz Basic aussehen?
Gruß Krumu1201 |
||
DAK |
Di, Nov 04, 2014 12:40 Antworten mit Zitat |
|
---|---|---|
Richtig echt objektorientiert geht in BB leider gar nicht, da wichtige Konzepte wie Vererbung und Methoden fehlen.
(Info am Rande: Methoden sind Funktionen, die nur für ein bestimmtes Objekt aufgerufen werden können, so z.B. Tür->öffnen(). öffnen() kann hier nicht ohne die Tür aufgerufen werden und wirkt nur auf diese eine Tür, nicht auf andere Objekte) Man kann es aber teilweise nachbauen: BlitzBasic: [AUSKLAPPEN] Type TTest Auf diese Weise kannst du zumindest Methoden emulieren. Einfach Funktionen machen, die als ersten Parameter ein Objekt des passenden Typs nehmen. Um den objektorientierten Ansatz hier zu übernehmen machst du für jedes Objekt im Spiel ein Type-Objekt, also z.B. hast du einen Type Gegner, und jede gegnerische Einheit wird durch ein Objekt des Types Gegner repräsentiert. BlitzBasic: [AUSKLAPPEN] Type TGegner Statt jetzt eine Funktion zu machen, die z.B. alle Gegner bewegt oder alle Gegner zeichnet machst du eine Pseudo-Methode (wie oben geschrieben), die einen Gegner zeichnet oder updatet: BlitzBasic: [AUSKLAPPEN] Function TGegner_draw(t.TGegner) Somit kontrolliert jeder Gegner sich selbst statt dass das eine Funktion im Hauptprogramm tut. Jetzt machst du dann noch eine Funktion, die nur mehr diese Methoden für jedes Objekt des Typs TGegner aufruft. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
CO2ehemals "SirMO" |
Di, Nov 04, 2014 22:19 Antworten mit Zitat |
|
---|---|---|
Falls es sich nicht um ein 3D-Spiel handelt, kann ich dir BlitzMax ans Herz legen. Das unterstützt zumindest mehr die OOP als BlitzBasic und ist außerdem relativ einfach zu lernen (Die Ansätze aus BB können übernommen werden). Geschwindigkeitsmäßig sind die entstehenden Programme in der Ausführung außerdem mit in C geschriebenen Programmen vergleichbar. | ||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Krumu1201Betreff: Nochmal danke für die vielen Antworten |
Do, Nov 06, 2014 0:42 Antworten mit Zitat |
|
---|---|---|
Wird eine ganz schon lange Diskussion hier.
Habe mich entschieden beide spiele in eins zu machen. Hauptspiel wird mit Story und das Minigame ist zum leveln da (Hoffe bekomme die balance hin) Benutze als Programmiersprache Blitz Basic. @Xeres Bekomme die map zeichnen Funktion so mit dem neuen System nicht hin. Bei Variante 1: Code: [AUSKLAPPEN] Function map_zeichnen()
Local zeile, spalte For zeile = 0 To Zeilen For spalte = 0 To Spalten Local feld.mapTile = mapFeld(spalte,zeile) DrawImage(feld\tile, feld\x, feld\y) Next Next End Function Sieht es so aus: https://www.blitzforum.de/upload/file.php?id=12913 Bei Variante 2 Code: [AUSKLAPPEN] Const TileSize = 64
Function map_zeichnen() Local zeile, spalte For zeile = 0 To Zeilen For spalte = 0 To Spalten DrawImage(mapFeld(spalte,zeile)\tile, spalte*TileSize, zeile*TileSize) Next Next End Function Sieht es so aus: https://www.blitzforum.de/upload/file.php?id=12914 @Co2 Zitat: - In deinem Testprogramm wurde die Bewegung mit KeyDown() gemacht: Solange die entsprechende Taste gedrückt wird, wird der Code in der If() ausgeführt. In deinem richtigen Projekt schreibst du aber KeyHit(), was zur Folge hat, dass du die Tasten "hämmern" musst, um eine flüssige Bewegung hinzubekommen (Wenn die Taste gedrückt wurde (die Dauer ist egal), dann führe einmal den Code in der If() aus). Ist das gewollt?
Nein will ja in beiden mit keydown laufen das ist ja mein riesen Problem gewesen, dass ich es im Hauptspiel nicht hinbekomme. Zitat: - Du kannst deine MapDaten auch über WriteByte, bzw. WriteInt und ReadByte, bzw. ReadInt speichern/lesen, dann musst du nicht mit dem String und mit Mid() rumfentern.
Spart das Ressourcen? Hast du Code den du mir zeigen kannst? |
||
DAK |
Do, Nov 06, 2014 1:05 Antworten mit Zitat |
|
---|---|---|
Um Ressourcen brauchst du dich nicht wirklich kümmern. Nicht bei vergleichsweise billigen Operationen. Ja, es wird schneller sein, aber nicht um ne Welt. Was hier wichtiger ist, ist dass du die Daten einfach richtig speicherst und dass dein Code übersichtlicher wird.
Die Beispiele in der Hilfe dazu sind ziemlich gut. Z.B. das Beispiel bei PeekInt erklärt schon eigentlich alles. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
CO2ehemals "SirMO" |
Do, Nov 06, 2014 18:56 Antworten mit Zitat |
|
---|---|---|
@ Krumu1201:
Entweder reden wir beide gerade derbe aneinander vorbei, oder ich verstehe das Problem nicht: Zitat: Nein will ja in beiden mit keydown laufen das ist ja mein riesen Problem gewesen, dass ich es im Hauptspiel nicht hinbekomme
Warum nimmst du dann im Hauptspiel nicht auch einfach KeyDown()? In dem Code ziemlich weit oben hast du im Hauptspiel KeyHit() für die Bewegung genommen... Zum Speichern der Daten: Es ist in der Tat so, wie DAK es sagt: Vorerst brauchst du dir keine Sorgen um Resourcen machen. Das mit WriteByte und ReadByte habe ich nur vorgeschlagen, weil ich kein Fan von String-Operationen bin - vor Allem dann nicht, wenn es um TileIDs geht: BlitzBasic: [AUSKLAPPEN] For Zeile = 0 To 10- Mit dem Parameter 1 an letzter Stelle der Methode Mid() gibst du an, dass du nur ein Zeichen ausfiltern willst. Das heißt, du kannst maximal 10 unterschiedliche Tiles speichern. Jetzt könnte man sagen: "Ok, dann mach ich halt ne 2 daraus und schreibe vor einzifferige Zahlen einfach eine Null!" - Das geht, dann bist du aber auf 100 Tiles begrenzt und der Aufwand ist ungleich höher als wenn du es direkt als Byte (Begrenzung auf 256 Tiles) oder als Int (Begrenzung auf 4.294.967.295) speicherst. Zumal auch Sachen wie das Ausfiltern von eventuellen Buchstaben wegfallen würde (Schnell ist in der Datei ein "Typo": Aus 1 wird beispielsweise 1q oder soetwas) - Das macht BlitzBasic meines Wissens nach nichts, die gecastete Zahl ist dann trotzdem 1, aber schön ist es nicht. Der Nachteil bei der Speicherung der Tiles als Bytes oder Ints ist, dass du ein Programm - möglichst ebenfalls geschrieben mit BlitzBasic - brauchst, um die Daten speichern zu können. Die einfachste Form wäre hier wahrscheinlich ein "Converter", der die Strings zwar aus einer Datei entgegennimmt (So wie du bereits die Daten im Hauptspiel lädst), diese dann aber als Bytes oder Ints in einer anderen Datei ablegt (So ein Converter ist natürlich nichts auf längere Sicht gesehen - da muss dann schon ein Tilemapeditor her). Dabei ist natürlich darauf zu achten, dass alle Daten in der Quelldatei richtig sind. Des Weiteren würde ich nicht hergehen und die Größe der Map hardcoden, sondern sie mit in die Map-Datei schreiben, sodass auch Maps größeren Umfangs ohne weiteres möglich sind - Dies ist aber eher eine Erweiterung, die vorerst nicht wichtig ist (Im Vergleich zum Speichern der Daten als Bytes oder Ints, was selbst vorerst auch nicht wichtig ist, wie DAK schon richtig sagte). |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
XeresModerator |
Do, Nov 06, 2014 21:19 Antworten mit Zitat |
|
---|---|---|
Ohne den Code drum herum zu sehen, lässt sich nur feststellen, dass offenbar das Array nicht mit den Daten befüllt ist, die an der stelle erwartet werden.
DebugLog ist dein Freund - sind die Bilder geladen worden? - sind die Bilder in den richten Variablen? - wird der Code zum zeichnen ausgeführt? - sind die Koordinaten richtig? - wurde die Kartendaten geladen? usw. usf. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Krumu1201 |
Fr, Nov 14, 2014 0:02 Antworten mit Zitat |
|
---|---|---|
Hi
@Xeres Problem mit dem map zeichnen gelöst. Hatte nur in den konstanten: zeilen = 15 und spalten = 10. Muss ja andersherum. @Co2 Zitat: Das heißt, du kannst maximal 10 unterschiedliche Tiles speichern
Kann doch auch noch buchstaben nehmen. Zitat: ...da muss dann schon ein Tilemapeditor her Habe doch schon Tilemapeditor, habe ich vorher geschrieben. Zitat: Warum nimmst du dann im Hauptspiel nicht auch einfach KeyDown()? In dem Code ziemlich weit oben hast du im Hauptspiel KeyHit() für die Bewegung genommen...
Wenn ich hier keydown nehme läuft er der Spieler viel zu schnell durch die welt Beispiel für nach rechts gehen: Code: [AUSKLAPPEN] If Keydown(205) Then ;nach rechts gehen richtung = "rechts" xmapKol =spielerfeldx+1 If xmapKol > 15 Then xmapKol = 15 If TileStatusFeld(xmapKol,spielerfeldy) = 0 And objektFeld(xmapKol,spielerfeldy) = 0 Then xs = xs + bewegungSpieler frame2 = frame2 +1 If frame2 > 11 Then frame2 = 0 spielerfeldx = spielerfeldx+1 If spielerfeldx > 15 Then spielerfeldx = 15 EndIf endIf Sieht im Spiel so aus: https://www.blitzforum.de/upload/file.php?id=12919 Sorry noch keine vernünfigen Bezeichner hier im Code. @Xeres Wie bekomme ich eine Direktverlinkung so elegant hin wie du es in dieser Diskusion gemacht hast. Gruß Krumu1201 |
||
DAK |
Di, Dez 02, 2014 14:17 Antworten mit Zitat |
|
---|---|---|
@Zu schnell rennen: Such nach Frameunabhängiger Programmierung.
@Direktverlinkungen: Wenn du sehen willst, wie jemand etwas formatiert hat drück einfach auf "Antworten mit Zitat", dann siehst du den "Sourcecode" des Posts. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group