Include

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Krumu1201

Betreff: Programmierkonzept

BeitragMo, Nov 03, 2014 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragMo, Nov 03, 2014 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

Krumu1201

Betreff: Danke

BeitragDi, Nov 04, 2014 8:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wie würde ein objektorientierter Ansatz in Blitz Basic aussehen?

Gruß

Krumu1201

DAK

BeitragDi, Nov 04, 2014 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Field x
Field y
EndType

Function ttest_printvalues(t.TTest)
Print(t\x+"/"+t\y)
End Function


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
Field posX
Field posY
Field speedX
Field speedY
EndType


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)
DrawOval(t\posX,t\posY,10,10)
End Function

Function TGegner_update(t.TGegner)
t\posX = t\posX + t\speedX
t\posY = t\posY + t\speedY
End Function


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
 

CO2

ehemals "SirMO"

BeitragDi, Nov 04, 2014 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

Krumu1201

Betreff: Nochmal danke für die vielen Antworten

BeitragDo, Nov 06, 2014 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 06, 2014 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

CO2

ehemals "SirMO"

BeitragDo, Nov 06, 2014 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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
A = ReadLine(AbsschnittDatei)
For Spalte = 0 To 15
AbschnittFeld(Zeile,Spalte) = Mid$(A,Spalte+1,1)
Next
Next
- 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

Xeres

Moderator

BeitragDo, Nov 06, 2014 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Krumu1201

BeitragFr, Nov 14, 2014 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 02, 2014 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group