Dim-Felder statt Types

Übersicht BlitzBasic FAQ und Tutorials

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Kabelbinder

Sieger des WM-Contest 2006

Betreff: Dim-Felder statt Types

BeitragSo, Sep 26, 2004 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
So, das hier ist das erste Tutorial, das ich schreibe, ich hoffe, es wird gut. Smile .

Also: Ich habe vor ner Zeit auch Types benutzt. Aber das mit den ganzen Punkten und Backslashs wurde mir irgendwann echt zu viel. So habe ich als Alternative also das Dim-Feld für mich entdeckt, das ist einmal schneller und zum Anderen leicht zu bedienen, wenn man erstmal damit vertraut ist.

Die meisten benutzen dim-Felder nur, um darin ihre Map zu speichern: jeder Eintrag erhält eine Zahl, aus der später das entsprechende Tiles hervorgeht.

Wie zum Henker soll man denn darin die einzelnen Eigenschaften von z.B. Gegnern (x,y,x-richtung,y-richtung,...) speichern?

Beim Type kann man diese Eigenschaften ganz einfach festlegen;
beim Dim-Feld geht das wenn man so will jedoch genausogut, man muss nur assozieren. Mit "assozieren" meine ich hier eine Zahl mit einer Eigenschaft verbinden.

Dazu hier mal ein Beispiel.

Code: [AUSKLAPPEN]

; Erstellen wir mal einfach ein zweidimensionales Dim-Feld:

Dim Gegner(10,4)

; Die 10 steht für die Anzahl der Gegner, die in diesem Dim-Feld Platz
; haben während die 4 <AUFPASSEN> für die Anzahl der verschiedenen
; Eigenschaften steht; (s.o.) . Also ganz einfach:
;
; 10 Gegner mit 4 Eigenschaften.


Man kann sich das so vorstellen, wie diese Tabelle:
user posted image
Etwa so, dass jede Spalte (1. Eintrag) der Tabelle für einen Gegner zuständig ist und jede Zeile (2. Eintrag) für eine Eigenschaft.

Und nun kommt die Assosation ins Spiel:
Man assoziert einfach jede Zeile mit einer Eigenschaft. z.B. so:
user posted image
Die Zahl 1 steht also für die X-Koordinate jedes Gegners, Die Zahl 2 für die Y-Koordinate usw.

wenn du in diesem Fall z.B. schreibst:
Code: [AUSKLAPPEN]
Gegner(7,2)

, ist damit die Y-Koordinate [2. Eigenschaft] des 7. Gegners gemeint.
oder wenn du schreibst:
Code: [AUSKLAPPEN]
Gegner(3,3)

, ist damit die X-Richtung [3. Eigenschaft] des 3. Gegners

Ok, und nun du:
Was ist mit Gegner(9,1) gemeint? <Bitte erst eine Antwort finden, bevor du weiterliest!>

****************************
****************************
****************************
****************************
****************************
****************************
****************************
****************************
****************************
****************************

Wenn deine Antwort X-Koordinate des 9. Gegners ist, ist sie richtig. Dann kann ich dir nur Gratulieren, dann hast du diesen Teil des Tutorials offensichtlich verstanden.

Natürlich kannst du selbst bestimmen, welche Zahl für welche
Eigenschaft steht. Bring deine eigenen Ideen mit ein. Smile . Selbstverständlich Gibt es in den meisten Spielen auch mehr, als
10 Gegner Wink , Die 10 ist hier auch nur als Beispiel
angegeben. Dieser Wert gilt im Normalfall auch nur als Maximalwert.
Ich würde dir empfehlen, ihn in einer Konstante
festzuhalten (z.B. 'Gegnermax'), damit du ihn jederzeit ohne
Aufwand ändern kannst. Wenn in deinem Spiel nicht
automatisch immer 'Gegnermax' Gegner vorhanden sind, ist es
wichtig, noch einen Eintrag für die Eigenschaft "leben" anzulegen
[ich packe ihn immer in 3 Smile ]. Diesen setze auf 1 wenn der Gegner
leben soll und auf 0, um ihn aus dem Weg zu räumen.
Zusätzliche Angaben können andere Zustände beinhalten (z.B.
Betäubt, Erschöpft, Bekehrt,...). Natürlich gibt es auch bei
den Eigenschaften keine
Grenzen.

-So, an deiner Stelle würde ich jetzt nur dann weiterlesen, wenn du alles bis hier her verstanden hast.

Die nächste Frage wäre vielleicht:
Wie kann ich denn jetzt nur diese leere Tabelle ausfüllen?
Ganz einfach: mit einer For-Schleife ODER im Normalfall, für ein Spiel mit Variabler Gegneranzahl mit einer Nummern-Variable. Shocked

Ja, das klingt jetzt anspruchsvoll: "NUMMERN-VARIABLE", ist aber an sich sehr simpel: Die Variable gibt an, welcher Gegner gerade an der Reihe ist.
Ich nenne diese Nummern-Variable immer 'num' 8)

Regel das Ausfüllen am besten so:

-Den Impuls aus deiner Source (.txt-Datei, Data-Feld etc.) für das Spiel abwarten.
-Die gewonnenen oder festgesetzten Daten in die 'num'-te Spalte des Dim-Felds eintragen.
-Weiter zum Nächsten (Namenlosen) Gegner.

Mal als Pseudocode:
Code: [AUSKLAPPEN]

;Gegner beschriften
Gegner(num,1)=50
Gegner(num,2)=350
Gegner(num,3)=1
Gegner(num,4)=0
Gegner(num,5)=1 ;Sagen wir einfach mal 5 beinhaltet "leben", daher 1
;Weiter zum nächsten Gegner
If num = Gegnermax Then ; bei der Maximalen Gegneranzahl
num = 0 ;Wieder beim ersten Gegner anfangen
Else ;Sonst
num = num + 1 ;Zum nächsten Gegner
Endif


so, soviel zum Ausfüllen

Um die Gegner im Spiel zu bearbeiten (Kollisionen, Animation, Bewegung, Ausgabe, etc.)
Benutze dazu For-Schleifen.
Dazu prüfst du zu zunächst, ob der Gegner lebt und führst wenn er lebt anschließend die entsprechenden Moves aus.

Hier ein Code-Beispiel dafür (und denk daran, Eintrag 5 ist hier für die Eigenschaft "leben" zuständig Smile ):

Code: [AUSKLAPPEN]
For i = 0 to Gegnermax
If Gegner(i,5)=1 Then
Gegner(i,1)=Gegner(i,1)+Gegner(i,3)
Gegner(i,2)=Gegner(i,2)+Gegner(i,4)
DrawImage Drache,Gegner(i,1),Gegner(i,2)
EndIf
Next


Das heißt:
Den Gegner wenn er lebt verschieben und Bei seinen Koordinaten den Drachen ausgeben. Genauso werden auch alle Anderen
Gegner-Verwaltungs-Angelegenheiten gemanaged (Kollisionen, Angriff etc.)

Yetzt muss du nur noch wissen, wie man den Gegner löscht. bei Types geht das einfach mit "Delete" hier setzt du einfach den Eintrag für "leben" (hier 5) auf 0:
Code: [AUSKLAPPEN]
For i = 0 to gegnermax
If ImagesCollide(Drache,Gegner(i,1),Gegner(i,2),0,Bulled,Shot(j,1),Shot(j,2),0) Then
Gegner(i,5)=0
Shot(i,5)=0
EndIf
Next

[Shot() ist hier ein imaginäres Dim-Feld, in dem Die Shots Gespeichert werden können und das genauso angelegt wird, wie das für die Gegner]

Also: z.B. Überprüft man, ob der Gegner getroffen wurde und wenn, setzt man ihn anschließend auf 0. Und den Schuss von den er erledigt wurde natürlich auch! Smile
Dann werden für den Gegner auch keine Moves, wie für lebende Gegner mehr ausgeführt und er wird vor allen nicht mehr ausgegeben (s.o. bei Bearbeitung).

Der einzige Nachteil dieser Art und Weise ist finde ich, dass es, anders als bei Types, zwingend eine Mindest-Anzahl für Gegner gibt. Andererseits gib es in JEDEM Spiel eine Begrenzung für Gegner (irgendwann stürtzt das Programm ab), außerdem kannst du den Maximalwert-selber regeln, sodass das Spiel nich allzu langsam läuft.

So, ich hoffe, ich konnte dich mit diesem Tutorial einwenig für Dim-Felder begeistern. Dann viel Erfolg Mit deinem Spiel.

Zitat:
Kabelbinder sagt: Ich hätte gern von jedem, der dieses Tutorial liest eine Bewertung, was ich in Zukunft besser machen könnte und was vielleicht gut war. So, ich bin raus.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
  • Zuletzt bearbeitet von Kabelbinder am Mo, Sep 27, 2004 13:25, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragSo, Sep 26, 2004 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Der erste Codeausschnitt und die 2 Tabellen sind falsch. Array-Indizen fangen bei 0 an, nicht bei 1.
Ansonsten schön, dass du dir die Mühe gemacht hast.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Vinz

BeitragFr, Apr 01, 2005 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich habe es mir gerade durchgelesen und finde das Tutorial super, es laestt sich gut lesen, du haettes vieleicht mehr zu den Eigenschaften der Gegner schreiben keonnen, also warum da 1=50 und 2=350 ist.

Aber auf jedenfall lesenswert, ich werde mal sehen ob ich das irgendwo anwenden kann daher ich mich mit types noch uerberhaupt nicht auskenne.

hamZta

Administrator

BeitragFr, Apr 01, 2005 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
kleiner tipp, zwecks übersicht:
statt mit gegner(1,0) die x-richtung des gegners auszulesen (und sich viele zahlen merken müssen), definiert man anfangs einige konstanten wie GEGNER_X = 0 oder GEGNER_Y = 1.

diese setzt man dann einfach ein: gegner(0,GEGNER_X)

viel übersichtlicher, oder?

hamZta
Blog.
 

ke^kx

BeitragFr, Apr 01, 2005 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Tutorial ist wirklich nicht schlecht, kompliment. Legt einem die Benutzung von Dims sehr nahe^^

Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

hitokiri

BeitragDo, Apr 14, 2005 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm...schneller mögen DIM's ja durchaus sein aber nicht gerade speicherfreundlich. Bei nem Type kannst halt dynmaisch neue erstellen und nur wenn du ein neues Objekt des Types erstellst wird der Speicher belegt, bei nem DIM dagegen wenn du sagen wir mal alle gegner für ein Level darin speicherst hast du dann eben von anfang bis ende den speicher mit allen gegnern vollgemüllt. Da finde ich haben Types schon auch ihre vorzüge mit wirklich löschen und neu erstellen.

Hubsi

BeitragDo, Apr 14, 2005 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Senf dazu: Ob Array oder type kommt doch vielmehr auf den Zweck an, denke ich. Niemand würde auf die Idee kommen eine Tilemap beispielsweise in ein Type zu speichern, genauso wie man Schüsse mit ständig variierender Anzahl nicht in ein Array speichern würde Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

darkshadow

BeitragDo, Apr 14, 2005 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey! Sag das nicht! Ich habe auch schonmal Schüsse in einem Array gespeichert. Zwar in einer anderen Programmiersprache (Turbo Pascal), aber es waren Schüsse. Wink
Aber auch nur, weil ich nicht wusste, wie man Types benutzt in TP, falls es dort überhaupt welche gibt.

Spikespine

BeitragDo, Apr 14, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Schüsse in einem Array geht, ist aber komplizierter.

Allerdings sind Dims meines Wissens nach um einiges schneller als Arrays!


Spike
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Hubsi

BeitragDo, Apr 14, 2005 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Dim schneller denn Arrays? Mr. Green Ich bin immer davon ausgegangen das sei dasselbe Very Happy Wenn Du Types - Array meinst, dazu gabs mal eine sehr interessanten Speedvergleich hier im Forum.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Spikespine

BeitragDo, Apr 14, 2005 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, daran erinnere mich noch...
Meines wissens kam aber dabei heraus, dass Dims schneller sind (oder nur bei ausgeschaltetem Debugger Confused )

Edit: https://www.blitzforum.de/viewtopic.php?t=2181 hier sagtest du es ja selber Wink
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

hitokiri

BeitragDo, Apr 14, 2005 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
DIM und array ist nicht dasselbe... ist ein unkommentiertes feature.
DIM's sind eigentlich linked lists.
Und es gibt einen eigenen Array befehl in BB, die können allerdings nur eine Dimension haben,also nur (x)
 

Timo

BeitragDo, Apr 14, 2005 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
DIM steht für Dimension, also Dimensionen - Felder --> Arrays!!

Dim's sind Arrays, ob du's glaubst oder net Wink
Es gibt noch BlitzArrays, die undokumentierte Art, Arrays zu benutzen, auch das sind Arrays.
Aber warum sollten Dims keine Arrays sein??
 

hitokiri

BeitragDo, Apr 14, 2005 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaaaaaalso....DIM's sind klar schon arrays aber *kopfkratz* wenn ich das richtig verstanden habe, dann ist das DIM eben ein spezielles Array weil es eine linked list ist. also, wenn du eine DIM überschreibst dann behält es die Informationen für das vorher reingeschriebene doch im memory und man kann auch wieder drauf zugreifen, sind also miteinander verlinkt, was "normalerweise" bei einem array nicht der fall ist.

Firstdeathmaker

BeitragDo, Apr 14, 2005 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich weis nicht so recht:

Ich benutze Dim´s für Maps, ist klar.

Aber Gegner würde ich NIE mit Dim´s machen, alleine wegen der variablen Anzahl, genauso wie Schüsse. Zudem, ein Typefeld hat einfach den Vorteil, das die Variablen leichter zu lesen sind (für den Programmierer). Für schnellen Zugriff auf Types benutze ich als Unterstützung Dim´s.

Eben alles nach dem Prinzip, wo was einfach am besten passt.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Hubsi

BeitragDo, Apr 14, 2005 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hitokiri hat Folgendes geschrieben:
DIM und array ist nicht dasselbe... ist ein unkommentiertes feature.
DIM's sind eigentlich linked lists.
Und es gibt einen eigenen Array befehl in BB, die können allerdings nur eine Dimension haben,also nur (x)
Was Du meinst sind schlicht BlitzArrays: bla[tralala] Wink Und Linked Lists sind umgangssprachlich Types. Wenn ich daneben liege, kläre man mich bitte auf Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Timo

BeitragFr, Apr 15, 2005 6:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ganau so habe ich es auch verstanden... Smile
 

hitokiri

BeitragFr, Apr 15, 2005 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Arghhh...ja, ich hab mir das eine tut nochmal durchgelesen. ich hatte unrecht. *schäm* type is linked list und DIM ist ein array. blitzarray auch nur einfach eindimensional.
 

Kevin_ble

Betreff: VIELEN DANK

BeitragSo, Aug 06, 2006 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wollt mich nur mal kurz ganz herzlichst bedanken ich hab das mit den Types nie verstanden aber das versteh ich! Vielen Dank für dieses Tutorial jetz habe ich eine Alternative zum Type! Jetz kann ich auch mein erstes Spiel zu ende machen! VIELEN DANK!
Jeder Tag ohne meinen Pc ist ein verlorener Tag!

Aktuelles Projekt: Universe War 2
Suche noch Hilfe!
Für mehr Infos http://www.kfgames.2page.de/


User posted image

garret

BeitragSo, Aug 06, 2006 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist jetzt aber, wenn jeder Gegner einen Namen haben soll? Dazu müsstest du entweder ein neues Feld (z.B. name$()) anlegen oder das Ganze als Feld behandeln, das nur Zeichenketten speichert. Da kann man Zahlen als Zeichenkette speichern und muss sie halt mit Int oder Float wieder umwandeln.

Im Übrigen umgehst du mit deiner num-Variable einfach nur eine For-Schleife...

Meiner Meinung nach sind Types eine mächtige Waffe und sooo schwer sind sie auch nicht zu verstehen. Außerdem kann man ihnen noch andere Types unterordnen und so eine Hierarchie schaffen. Anfängern zu erzählen, Types seien zu kompliziert finde ich schlecht. Es kommt halt wie gesagt auf den Einsatzzweck an. Für mein erstes Strategiespiel hatte ich damals nur Felder genommen, weil ich Types noch nicht beherrschte. Im Nachhinein habe ich erkannt, dass es viel zu umständlich war, für alles ein Extrafeld wie einheit(x,y) und einheitname$(x) anzulegen.

Letztlich bleibt es jedem selbst überlassen. Ich finde es allerdings schade, dass im Buch "Jetzt lerne ich ... BB" Types viel zu kurz kamen und viel zu unübersichtlich und ungeschickt erklärt wurden. Im gesamten Buch wurden sie auch nur in diesem Abschnitt verwendet. Zumindest beim Spaceshooter hätte man sie verwenden können.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group