Panels ...... reine Logiksache

Posted By: Otter

Panels ...... reine Logiksache - 01/08/11 00:53

Hiiii Leute!

Ist mir fast schon peinlich, dass ich in solch einer logikfrage hilfe brauche, aber mir will perdu keine klare lösung einfallen.
Es geht darum verschiedene Itmes in beliebiger reihenfolge in 3 panels anzuzeigen.

Die Panels -anfangs leer- füllen sich mit der anzahl gesammelter items von links nach rechts bis alle voll sind.
Alle items darüber werden gespeichert und können später verwendet werden.
Momentan hab ich für jedes item eine variable die sich auf max.3 erhöhen lässt.
Das problem ist .... ist .... ähm. ICH WEIS AUCH NICHT. Ich bekomm kopfschmerzen wenn ich nur dran denke! crazy

Hoffentlich ist die antwort nicht ZU leicht. blush
OTTER
Posted By: MasterQ32

Re: Panels ...... reine Logiksache - 01/08/11 01:09

mach dir halt nen Array mit drei elementen...
jedes element is ne variable mit dem wert von 1-3
wenn ein item reinkommt, schiebst du das array:
element 2 -> element 3
element 1 -> element 2
neues element -> element 1
danach überprüfst du den inhalt des arrays und weißt deinen drei Panels die passenden bmaps zu.
wenn du ein element verwendest, füllst du die items nach links wieder auf, d.h.
wenn element 1:
element 2 -> element 1
element 3 -> element 2
nichts -> element 3
wenn element 2:
element 3 -> element 2
nichts -> element 3
wenn element 3:
nichts -> element 3
das wars glaub ich so theoretisch grin
Posted By: Saturnus

Re: Panels ...... reine Logiksache - 01/08/11 02:21

Vom Prinzip her möglicherweise so ungefähr:
Code:
#include <acknex.h>

#define ITEM_ID_RED   0
#define ITEM_ID_GREEN 1
#define ITEM_ID_BLUE  2

BMAP *item_bmaps[3];
int   items[3];
int   items_count = 0;

void displayItems() {
    int i;
    for (i = 0; i < items_count; i++) {
        if (items[i] >= 0) {
            draw_quad(item_bmaps[items[i]], vector(10 + i*40, 10, 0),
                      NULL, NULL, NULL, NULL, 100, 0);
        }
    }
}

void addItem(int item_id) {
    if ((item_id >= 0) && (item_id < 3) && (items_count < 3)) {
        items[items_count] = item_id;
        items_count++;
    }
}

void removeItemAt(int index) {
    if ((index >= 0) && (index < 3) && (index < items_count)) {	
        for (; index < 2; index++) {
            items[index] = items[index+1];
        }
        items_count--;
    }
}

void main() {
    wait(1);
	
    item_bmaps[ITEM_ID_RED]   = bmap_createblack(32, 32, 24);
    item_bmaps[ITEM_ID_GREEN] = bmap_createblack(32, 32, 24);
    item_bmaps[ITEM_ID_BLUE]  = bmap_createblack(32, 32, 24);
    bmap_fill(item_bmaps[ITEM_ID_RED],   COLOR_RED,   100);
    bmap_fill(item_bmaps[ITEM_ID_GREEN], COLOR_GREEN, 100);
    bmap_fill(item_bmaps[ITEM_ID_BLUE],  COLOR_BLUE,  100);
	
    addItem(ITEM_ID_GREEN);
    addItem(ITEM_ID_GREEN);
    addItem(ITEM_ID_RED);
    removeItemAt(1);
    addItem(ITEM_ID_BLUE);
	
    while (1) {
        displayItems();
        wait(1);
    }
}


Posted By: Otter

Re: Panels ...... reine Logiksache - 01/08/11 14:21

Quote:
Vom Prinzip her möglicherweise so ungefähr:

Ja, funktioniert wie es soll! Danke laugh
Nur .... so wirklich verstehen tu ich's nicht. crazy

Was ist z.B. der unterschied zwischen:
*void und function ?
*for und if ?
Das manuel zeigt mir bei diesen begriffen kaum was nützliches.

PS: @Saturnus: netter avatar. wink
Posted By: Widi

Re: Panels ...... reine Logiksache - 01/08/11 14:30

Hallo Otter, farbenfroh wie immer wink
void ist das gleiche wie function, nur kann man mit void keine Rückgabeparameter angeben

if: alles in der Klammer{} wird nur einmal ausgeführt, wenn die Bedingung wahr ist
for (i = 0; i < items_count; i++)

i ist beim Start 0 (i = 0)
alles in der Klammer {} wird sooft ausgeführt, wie i < items_count
Bei jedem Durchlauf der Klammer {} wird i um 1 erhöht (i++)
Posted By: Otter

Re: Panels ...... reine Logiksache - 01/09/11 14:27

Quote:
Hallo Otter, farbenfroh wie immer

Bin jederzeit bereit euren tristen alltag zu versüßen wink

Okay, alles klar. Danke Widi!
Und int ist die kommastellenlose version von var, oder seh ich das falsch?
Posted By: Ayumi

Re: Panels ...... reine Logiksache - 01/09/11 14:56

"var" = variable ->wandelt automatisch Typen um
"int" = integer ->Kann keine Komma zahlen darstellen
"double und float" -> fuer kommazahlen

Das ganze hat eigendlich nur mit dem Speicher zu tun,
in "int" kannst du Zahlen von 32.768 bis 32.767 darstellen.
und ohne Vorzeichen bis 64000~.

EDIT: Der unterschied ist eigendlich nicht merkbar aber
1) zaehlt es als "unsauber", falsche Datentypen anzugeben und
2) merkt man das dann bei einigen tausend codezeilen schon.
(Das nur so als Zusatz:D)
Posted By: Otter

Re: Panels ...... reine Logiksache - 01/09/11 17:39

Danke für den crashkurs in sachen Interface.
Ihr seit Klasse! Wirklich klasse!
grin

Um nicht gleich noch einen thread zu öffnen, stell ich euch einfach noch eine frage.
Keine Sorge, ich kann mir echt nicht vorstellen das das schwierig ist.
Für den fall das ich euch auf den wecker geh, sagt einfach bescheit. wink

ALSO:
Wie krieg ich es hin, das die 4 LILA SCHOCKWELLEN beim aufprall in die richtige richtung schauen?

mfg
OTTER
Posted By: Pappenheimer

Re: Panels ...... reine Logiksache - 01/09/11 17:54

Was wäre denn die richtige Richtung?
Posted By: chrisp1

Re: Panels ...... reine Logiksache - 01/09/11 17:57

kannst du das etwas genauer erklären ?
Posted By: WretchedSid

Re: Panels ...... reine Logiksache - 01/09/11 18:50

Originally Posted By: Ayumi

Das ganze hat eigendlich nur mit dem Speicher zu tun,
in "int" kannst du Zahlen von 32.768 bis 32.767 darstellen.
und ohne Vorzeichen bis 64000~.

Uhm, nein. Ein int bietet 4 byte Speicher, sprich 32 bits an. Mit Vorzeichen (sprich das most significant bit dient als Vorzeichen) kannst du maximal bis 2^32-1 darstellen was exakt der Zahl 2147483647 entspricht (natürlich von -2147483647 bis +2147483647, da ein bit das Vorzeichen hält).

Ohne Vorzeichen kannst du sogar bis zur 2^32 darstellen, oder anders ausgedrückt: 4294967295.

Aber, Lite-C ist nicht in der Lage über dem Maximum von signed ints darzustellen (außer bei pointern), sprich auch ein unsigned int kann maximal 2147483647 darstellen.


Allerdings gibt es sehr wohl einen Datentypen der deine ~64000 speichern kannst (oder um genau zu sein, 2^16 = 65535). Wie in der Klammer bereits angedeutet geht es um einen 16 bit typen (2 bytes), dieser trägt den schönen Namen short.

Nachtrag: Es ist nicht nur unsauber falsche Datentypen anzugeben, aber du brichst damit auch die komplette Hilfe die der ein C Compiler geben kann da du vom Konzept der statischen Typen weggehst (jeder Datentyp in C ist statisch) und somit eigentlich ganz klar gegen die Regeln verstösst und den Code unsicher machst (ein echter C compiler liefert dir in dem Fall normalerweise eine Fehlermeldung und hört mit dem kompilieren auf)


Zu der letzten Frage von Otter, ich nehme mal an das es die Schockwellen in die selbe Richtung zeigen sollen wie das Projektil beim Aufschlag auf den Körper. Was im Code dann so aussieht:
Code:
vec_set(schockwellen.pan, projektil.pan);


Posted By: Ayumi

Re: Panels ...... reine Logiksache - 01/09/11 19:54

Ups, ja sry mein Fehler.Danke fuer die Korrektur.Hab s wohl verdreht^^
Posted By: Otter

Re: Panels ...... reine Logiksache - 01/09/11 21:15

Quote:
vec_set(schockwellen.pan, projektil.pan);

Aber natürlich!
Ich hab diese schockwellen als particel erzeugt und da schreibt man ja alles irgendwie anders. crazy
Hab gar nicht daran gedacht einfach ein sprite mit einer function zu erzeugen. Ist ganz klar leichter und hat sich damit erledigt.
Danke Just Sid.

Mit "die richtige richtung" war gemeint das die Wellen halbkreisförmig vom projektil wegfliegen (nur x und z coordinaten) und auch in die dementsprechende richtung "blicken".
Aber das ist jetzt eh schon egal.

Dankeschön an alle hilfbereiten poster!

OTTER
© 2024 lite-C Forums