HALT! Position gesperrt

Posted By: Otter

HALT! Position gesperrt - 04/25/11 18:32

Hallöchen!

Wie ihr seht, arbeite ich gerade an einem level-editor.
Mein problem ist nur, das ich mehrere objekte auf das selbe feld platzieren kann.
Wo kann ich festhalten, das die "bebaute" position gesperrt ist? In variablen, Vectoren oder sogar skills?
Oder kann man das zur laufzeit von einem textdokument auslesen lassen?
Diese technik wäre allerdings komplettes neuland für mich. smirk
HILFE ! !

mfg
OTTER
Posted By: Michael_Schwarz

Re: HALT! Position gesperrt - 04/25/11 18:36

Ich weis zwar nicht wie du die blocks plazierst, aber du kannst nen C_trace machen und wenn you auf einen pointer gesetzt wird, dann ist es wohl einer der blocks die du plaziert hast.
Posted By: WretchedSid

Re: HALT! Position gesperrt - 04/25/11 18:48

Ein Array aller Blöcke bietet sich auch an. Der kann dann auch nahezu 1 zu 1 als Datei abgespeichert werden.
Posted By: xxxxxxx

Re: HALT! Position gesperrt - 04/25/11 19:07

die Blöcke, liegen die auf einer art raster oder sind die einfach nur so platiert? wenn ja kannste du einfach ein arrry dreidimensionales(o.4/5diminsionalen für blocktype ect.) arry machen und jeweils cheken ob die raster position belegt ist oder net... das kannst du auch, wie Sid schon sagte, gut abspeichern.
xxxxxxx
Posted By: Otter

Re: HALT! Position gesperrt - 04/25/11 19:11

Das ging ja schnell, danke!
Der trick mit dem trace funktioniert gut, aber das mit den arrays kann mir später sicher noch nützlich sein.

Ich müsste wohl "ptr_for_handle" benutzen um der gespeicherten koordinaten ein beliebiges objekt zuzuweisen oder?

PEITSCH MICH AUS Sidi! Den ich hab keine ahnung wie ich eine x-beliebige position in ein array speichere. cry

[EDIT] @7x: ist gerastert! 64 quants felder.
Posted By: WretchedSid

Re: HALT! Position gesperrt - 04/25/11 19:20

Originally Posted By: Otter
PEITSCH MICH AUS Sidi!

Naja gut, wenn du unbedingt willst. Um halb drei bei mir? Ich leg dann schon einmal die Peitsche bereit du unartiges Mädchen!


Wegen Arrays, guck dir das hier mal an:
Code:
var foo[25]



Damit ist die Variable foo ein Array mit 25 Elementen. Sprich, anstelle von einer var foo, hast du dort Platz für 25 vars. Adressiert wird das ganze wieder über die [], dabei gibt die Zahl in den Klammern den offset zum ersten Element an.

Code:
foo[0] = n; // Erstes Element
foo[1] = n; // Zweites Element
...
foo[24] = n; // Letztes Element



Soo, wenn du jetzt einen Leveleditor hast der alle Blöcke auf einem Raster hat, dann kannst du dir einen Zweidemensionalen ENTITY Array mit derselben Größe wie das Level basteln:
Code:
ENTITY *levelEntities[125][50]; // Ein 125 x 25 großes Level



Wenn jetzt an Punkt 10, 5 ein Block hin soll, kannst du einfach folgendes machen:

Code:
if(levelEntities[9][4] != NULL) // Gucken ob da schon ein Block ist
   ent_remove(levelEntities[9][5]); // Alten Block entfernen...

levelEntities[9][5] = ent_create(...); // Und den neuen Block erstellen


Posted By: xxxxxxx

Re: HALT! Position gesperrt - 04/25/11 19:35

Ich würde eher ein var arry empfehlen
zb. so
var Block[125][25]
das nimmt weniger speicherplaz weg alls entitys, selbst wenn du dir ein zweites oder drittes arry erstellst...

ein weiterer vorteil fürs speichern:
geb mal im index vom Manual "file" ein. da ist file_var_read und file_var_write.
arrays beherst diese funk glaub ich nicht, aber das kannst du alles mit ein paar for loops speichern...
da ich damit noch nicht gearbeitet habe kann ich aber nicht sagen ob das wirklich klappt.
xxxxxxx

Posted By: WretchedSid

Re: HALT! Position gesperrt - 04/25/11 19:37

Originally Posted By: xxxxxxx
Ich würde eher ein var arry empfehlen
zb. so
var Block[125][25]
das nimmt weniger speicherplaz weg alls entitys, selbst wenn du dir ein zweites oder drittes arry erstellst...

Ein var ist 4 byte groß, ein ENTITY pointer ist 4 byte groß. Your argument is invalid.

Ich würd das Problem ja übrigens am liebsten mit eine extra Lite Foundation Klasse totschlagen, da könnte man auch die serialisierung in eine Datei ganz einfach lösen, aber ich glaub damit wäre dann nicht nur das Problem totgeschlagen =/
Posted By: xxxxxxx

Re: HALT! Position gesperrt - 04/25/11 19:40

achso... sorry für die fehlinformation blush
aber wie macht man es dann das eine entity 100 skills + flags usw. hat?
ok dumme frage grin
xxxxxxx
Posted By: WretchedSid

Re: HALT! Position gesperrt - 04/25/11 19:47

Originally Posted By: xxxxxxx
aber wie macht man es dann das eine entity 100 skills + flags usw. hat?

Ist das jetzt eine ernst gemeinte Frage oder willst du mich verarschen? o_O
Posted By: MasterQ32

Re: HALT! Position gesperrt - 04/25/11 19:47

grin das liegt daran, das du nur einen pointer auf die entity im array hast und nicht die entity selbst
in ganz gamestudio arbeitest du nicht ein einziges mal mit einer "echten" entity sondern immer nur mit pointern auf diese
die entity ist schon dementsprechend groß, aber der pointer halt nur 4 byte bei 32 bit systemen
Posted By: Otter

Re: HALT! Position gesperrt - 04/25/11 20:03

FANTASTISCH! Es klappt.
Danke Sidi.

Quote:
Um halb drei bei mir?
Ohh sorry, da bin ich schon wo anders Süßer.... wink



Momentan hab ich keine fragen mehr bezüglich dem editor, aber ich werd mich bestimmt bald wieder hier melden.

tschau!
OTTER
Posted By: Otter

Re: HALT! Position gesperrt - 05/01/11 14:56

Wie kann man allen entities mit dem selben pointer eine eigenschaft geben?
momentan kann ich nur einem objekt etwas zuweisen.

set(obj_list1[?], INVISIBLE); ///obj_list1 besteht aus 15 pointern die ich bereit zugewiesen hab

Danke schonmal im vorraus.
Posted By: MasterQ32

Re: HALT! Position gesperrt - 05/01/11 15:05

da musst du die einzelnen elemente deiner liste durchgehen
Code:
var i;
for(i = 0; i < 15; i++)
    set(obj_list1[i], INVISIBLE);

Dieser Code geht alle Elemente durch und macht sie unsichtbar
Posted By: Superku

Re: HALT! Position gesperrt - 05/01/11 15:06

var i; // oder int statt var
for(i = 0; i < 15; i++) set(obj_list[i],INVISIBLE);

Meinst du das so?

zu spät...
Posted By: xxxxxxx

Re: HALT! Position gesperrt - 05/01/11 15:06

also eine function mit der man aus alles in einem arry eine eigenschaft zuweisen kann ist mir nicht bekannt, ich würde einen for-loop nehmen...
Originally Posted By: Superku
zu spät...

ich auch frown
Posted By: Rondidon

Re: HALT! Position gesperrt - 05/01/11 15:12

Quote:
Quote:

Um halb drei bei mir?

Ohh sorry, da bin ich schon wo anders Süßer.... wink


You can play with a game,
you can play with a knife,
but when you play with a girl,
you play with your life

wink
Posted By: WretchedSid

Re: HALT! Position gesperrt - 05/01/11 15:22

Originally Posted By: Rondidon
You can play with a game,
you can play with a knife,
but when you play with a girl,
you play with your life

wink

Aber sie hat angefangen D:
Posted By: Rondidon

Re: HALT! Position gesperrt - 05/01/11 15:33

Frauen verbinden am liebsten die Wunden, die sie selbst geschlagen haben. wink
Posted By: Otter

Re: HALT! Position gesperrt - 05/01/11 16:10

Quote:
var i;
for(i = 0; i < 15; i++)
set(obj_list1[i], INVISIBLE);

Dieser Code geht alle Elemente durch und macht sie unsichtbar

Ja, aber nur einmal bei der erstellung.
Ich würde auch gern im nachhinein bei allen pointern etwas ändern können.

Quote:
You can play with a game,
you can play with a knife,
but when you play with a girl,
you play with your life
WOW, Rondidon!
Diese poetische seite von dir kenn ich ja noch garnicht. Entzückend! laugh
Posted By: MasterQ32

Re: HALT! Position gesperrt - 05/01/11 16:15

du kannst einfach auf alle elemente in deiner Liste zugreifen:
obj_list1[i]
i = 0: Erstes Element
i = 14: 15tes Element
Posted By: Pappenheimer

Re: HALT! Position gesperrt - 05/01/11 16:23

Ich weise jedem Objekt bei seiner Erstellung eine ID zu, die in seinem ersten Skill gespeichert wird. In Deinem Fall würden Blöcke mit den gleichen Eigenschaften gleiche IDs bekommen.

Dann gehe ich über die Funktion ent_next alle Entities durch, wenn ich bei mehreren etwas entsprechend ihrer Identität ändern will.

z.B. Metallblock:

#define ID skill1
#define Metallblock 4

Also wird das Beispiel aus dem Handbuch um die Abfrage des Skills erweitert:

function hide_all_ents()
{
// repeat for all entities
for(you = ent_next(NULL); you; you = ent_next(you))
if(you.ID == Metallblock)set(you,INVISIBLE); // make entity invisible
}
}
Posted By: Rondidon

Re: HALT! Position gesperrt - 05/01/11 16:50

Originally Posted By: Otter
WOW, Rondidon!
Diese poetische seite von dir kenn ich ja noch garnicht. Entzückend! laugh

So bin ich halt laugh
Posted By: Otter

Re: HALT! Position gesperrt - 05/02/11 21:59

@Pappenheimer: daran hab ich auch schon gedacht, hatte aber gehoft das es etwas in der richtung gibt:
set(obj_list1[all], INVISIBLE);
oder
set(obj_list1[1-15], INVISIBLE);

aber es soll halt nicht sein....

danke euch
Otter
Posted By: Pappenheimer

Re: HALT! Position gesperrt - 05/02/11 22:37

Ich finde den Weg halt viel intuitiver, weil es auf "Strukturen" zurückgreift, die Lite-C halt von vornherein bietet.
Ich finde es klein, fein und übersichtlich! wink
Posted By: Otter

Editor mit langzeitgedächtnis - 05/22/11 16:45

SO! Da ich meinen editor jetzt einigermassen "vorzeigbar" gemacht hab, stellt sich mir jetzt natürlich die MASTER FRAGE:
Wie kann ich die position und form jedes bausteins in einer text datei oder -was weis ich- abspeichern?
So, das man sie jederzeit wieder laden kann.


mfg
OTTER
Posted By: Pappenheimer

Re: Editor mit langzeitgedächtnis - 05/22/11 16:52

Diese "Echt3D_Herbst_2009_11_05.zip", die man in meineer Signatur herunterladen kann, ist ein Kombination aus Spiel und Leveleditor, in der genau so ein System vorhanden ist.
Keine Ahnung wie leicht oder schwer man als Außenstehender durchsteigt.
Posted By: xxxxxxx

Re: HALT! Position gesperrt - 05/22/11 16:57

steht alles im manual
zum schreiben
Code:
var filehandle = file_open_write("myfile.txt");
file_var_write(filehandle,123456.789);
file_var_write(filehandle,sqrt(2));
file_close(filehandle); // the file now contains "123456.789 1.414 "


zum lesen
Code:
var filehandle = file_open_read("myfile.txt"); // file contains: "123456.789 1.414"
var temp = file_var_read(filehandle); // now temp == 123456.789
temp = file_var_read(filehandle); // now temp == 1.414
file_close(filehandle);

dann gehst du beim speichern einfach dein arry durch und speicherst alle benötigten eigenschaften als var in deine datei, die du dann mit lauter if/switch abfragen usw. beim laden in blöcke umwandelst...
wenn du das ganze jetzt nicht noch aus welchen gründen auch immer irgendwie verschlüsseln willst sollte das der ganze trick sein
xxxxxxx


Posted By: WretchedSid

Re: Editor mit langzeitgedächtnis - 05/22/11 17:05

Originally Posted By: Otter

Wie kann ich die position und form jedes bausteins in einer text datei oder -was weis ich- abspeichern?

Mehrere Möglichkeiten. Es gibt eine langsame simple, und eine komplexere aber dafür schnelle Variante.
Die simple sieht so aus das du einfach alle Zahlen (ich nehme einfach mal an das jeder Block durch eine Zahl repräsentiert werden kann) nimmst und in Strings umwandelst und dann in ne Textdatei schreibst. Laden ist dann genau andersrum.
Das is lame, suckt und deswegen geh ich nicht weiter darauf ein.
Edit: Außerdem haben die über mir schon erklärt warum die Methode scheiße ist, sogar mit Codebeispielen.

Mehr Komplex ist das ganze als binär zu speichern, sprich, du wandelst deine Zahlen nicht mehr in Strings um sondern schreibst direkt alle bytes der Zahlen in die Textdatei. Das produziert deutlich kleinere Dateien, und ist viel viel schneller zu lesen da halt keine Umwandlung stattfindet.
Als erstes musst du stdio.h includen (mit den eckigen Klammern). Dann baust du dir sowas:
Code:
var levelSizeWidth, levelSizeHeight; // Breite und Höhe des Levels

void writeToFile(STRING *name)
{
    FILE *file = fopen(_chr(name), "wb"); // Öffne die Datei zum schreiben
    
    // Als erstes wird die Ausdehnung des Levels gespeichert:
    fwrite(&levelSizeWidth, 4, 1, file); // Schreibe den Wert von levelSizeWidth in die Datei
    fwrite(&levelSizeHeight, 4, 1, file);


    // Und jetzt jedes einzelne Blöcklein
    var x, y;
    for(x=0; x<levelSizeWidth; x++)
    {
        for(y=0; y<levelSizeWidth; y++)
        {
             fwrite(&block[x][y], 4, 1, file);
        }
    }

    fclose(file); // Die Datei wieder freigeben
}



Und fertig. Lesen geht dann ähnlich:

Code:
var levelSizeWidth, levelSizeHeight; // Breite und Höhe des Levels

void readFromFile(STRING *name)
{
    FILE *file = fopen(_chr(name), "rb"); // Öffne die Datei, diesmal zum lesen
    
    // Jetzt holen wir uns erstmal die Ausdehnung wieder:
    fread(&levelSizeWidth, 4, 1, file); // Dann wolln wir doch mal lesen...
    fread(&levelSizeHeight, 4, 1, file);


    // Und jetzt können wir locker flockig jeden Block auslesen
    var x, y;
    for(x=0; x<levelSizeWidth; x++)
    {
        for(y=0; y<levelSizeWidth; y++)
        {
             fread(&block[x][y], 4, 1, file);
        }
    }

    fclose(file); // Die Datei wieder freigeben
}



Das Dateiformat sieht dann so aus das zuerst die Ausdehnung des Levels gespeichert wird und danach der Wert jedes Blocks, dh. man muss nicht extra schreiben in welcher Zeile und Spalte der Block ist sondern kann ganz locker anfangen zu lesen und zu schreiben wenn die Ausdehnung bekannt ist.

Posted By: Rackscha

Re: Editor mit langzeitgedächtnis - 05/23/11 17:51

Ich würde ebenfalls Sids weg gehen.
Und würde außerdem als allererstes eine zahl abspeichern, die als Versionsnummer für den loader/saver steht.

Den sobald du was am lade/speicher system änderst sind alte dateien natürlich komplett inkompatibel. Durch die versionsnummer am anfang könnte man den Fehler frühzeitig abfangen und eventuel sogar auf eine alte lade funktion zurückgreifen. Nicht das du dich später wunderst warum beim laden aufeinmal nurnoch wurst rauskommst, nachdem du was am system geändert hast und ne savedatei von vor x tagen lädst wink

MFG
Rackscha
Posted By: Otter

Re: Editor mit langzeitgedächtnis - 05/26/11 20:01

Hach, es ist schon wieder so viel zeit vergangen ....
Bei dem ganzen herumprobieren und umsätzen, vergisst man das ein oder andere.

Ich komm nämlich nicht dahinter, was diese zeilen bedeuten soll:
Vorallem das &block irritiert mich. Ist das ein platzhalter für einen meiner pointer oder eine eigene function?

{
fwrite(&block[x][y], 4, 1, file);
}

mfg
OTTER
Posted By: Rackscha

Re: Editor mit langzeitgedächtnis - 05/29/11 19:31

Lieber Sid, schlag mich nicht, aber bedeutet
Code:
{
fwrite(&block[x][y], 4, 1, file);
}



das & hier nicht das wir uns die ADRESSE an Position XY des 2dArray block holen?
Wir brauchen doch aber den INHALT oder nicht o.O(im letzteren fall muss dann das & weg).

Zumindest wird doch in C++ somit eine Referenz abgefragt, sprich die Adresse des Datenspeichers, nicht aber der Inhalt...oder vertu ich mich jetz?


MFG
Memnarch
Posted By: MasterQ32

Re: Editor mit langzeitgedächtnis - 05/29/11 20:53

@Rakscha:
in dem Fall braucht man das &, da man ja von einer adresse lesen will. Die Funktion benötigt einen pointer auf die Variable, die in dem Falle vier Byte groß ist.

@Otter:
&block ist eine zweidimensionales array mit deinen level-elementen (das array besteht in diesem fall aus var-variablen)
© 2024 lite-C Forums