2 Fragen... (2 Probleme - keine leichten) - Und Weiteres
- Kaktus
- Tastatursteuerer
- Beiträge: 658
- Registriert: 17.02.2006, 01:45
- Wohnort: Wüstä
- Kontaktdaten:
Also bei mir klappt es auch, zumindest bis zum 40. Schuss
Habe die Zeile
if (AktuellerSchuss != 40) AktuellerSchuss=AktuellerSchuss+1;
in
if (AktuellerSchuss != 39) AktuellerSchuss=AktuellerSchuss+1;
abgewandelt, da der Array[40] nur von 0 bis 39 geht und das spiel sonst abstürzt.
Als ich das geändert hab stürzt es zwar nicht mehr ab, aber zeichnet nach dem 40 keine weiternen Schüsse mehr.
Habe die Zeile
if (AktuellerSchuss != 40) AktuellerSchuss=AktuellerSchuss+1;
in
if (AktuellerSchuss != 39) AktuellerSchuss=AktuellerSchuss+1;
abgewandelt, da der Array[40] nur von 0 bis 39 geht und das spiel sonst abstürzt.
Als ich das geändert hab stürzt es zwar nicht mehr ab, aber zeichnet nach dem 40 keine weiternen Schüsse mehr.
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Ich hab zufälligerweise vor ein paar Tagen eine Sidescroller-Basis programmiert.
Dort mache ich es so:
Wenn ein Schuss verschwindet, setze ich seine x-Koordinate einfach wieder auf 0 und er wird automatisch frei.
freeshotindex() liefert den ersten freien Schuss.
Dort mache ich es so:
Code: Alles auswählen
int freeshotindex() {
int i;
int fnd=-1;
while (i<maxshots) {
if (shotx[i]==0) {
fnd=i;
i=maxshots;
}
i++;
}
return fnd;
}
// rep_ex
int fnd=freeshotindex();
if (IsKeyPressed(left_ctrl) && fnd!=-1 && !shot_blocked) {
...
freeshotindex() liefert den ersten freien Schuss.
Use gopher repellent on funny little man
- Timer
- Süßwasserpirat
- Beiträge: 260
- Registriert: 27.02.2007, 17:35
Darf ich euch wieder belästigen?
Es geht um das Modul "Pixel Perfect Collisions". Darf ich darüber überhaupt etwas fragen oder ist das Forum nur auf reine AGS-Fragen beschränkt?
Auf jeden Fall habe ich seit neuestem das Problem, dass ich einige Zeit nachdem ich das Spiel begonnen habe, folgende Meldung kommt:
Das Room 12 script lautet an dieser Stelle:
Ich fürchte stark, es hat etwas mit diesem neu hinzugefügten Scriptteil zu tun:
Ich fürchte natürlich, dass mir hier nicht zu helfen ist, weil ich zusätzlich zum Modul auch noch das Platform-Template verwende, was alles unglaublich verkompliziert...
Aber hoffen kann man immer.
Es geht um das Modul "Pixel Perfect Collisions". Darf ich darüber überhaupt etwas fragen oder ist das Forum nur auf reine AGS-Fragen beschränkt?
Auf jeden Fall habe ich seit neuestem das Problem, dass ich einige Zeit nachdem ich das Spiel begonnen habe, folgende Meldung kommt:
Code: Alles auswählen
An error has occured... scripting error... contact autor...
(ACI Version 2.72.920)
in Pixel Perfect Collisions (Zeile 37)
from Pixel Perfect Collisions (Zeile 116)
from Room 1 script (Zeile 12)
Code: Alles auswählen
int Durchmachen = 5;
while ((Durchmachen < oben) && tot == false) {
if (PPColliding.CWithO (player, object[Durchmachen])) {
tot = 1;
player.ChangeView (8);
hotspot[1].Enabled = false;
hotspot[2].Enabled = false;
}
else Durchmachen += 1;
}
Code: Alles auswählen
if (jumping == true) {
player.ChangeView (9);
player.loop = LLRicht;
if (jump <= -7) player.frame = 1;
else if (jump <= 0) player.frame = 2;
else player.frame = 3;
}
Aber hoffen kann man immer.
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Nicht unbedingt.
Der Fehler kommt bei dieser Zeile:
Ist das:
Der Fehler kommt bei dieser Zeile:
Code: Alles auswählen
ViewFrame *frame=Game.GetViewFrame(a.View, a.Loop, a.Frame);
der genaue Wortlaut der Fehlermeldung?An error has occured... scripting error... contact autor...
Use gopher repellent on funny little man
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Also: es ist möglich, den Loop oder das Frame eines Charakters direkt zu ändern, z.B. so:
Das kann insofern problematisch sein als dass der Loop/das Frame nicht existieren könnte.
Ich vermute mal, dass AGS intern nicht überprüft, ob hier bereits ein Fehler vorliegt, sondern den Wert erstmal ändert.
Sobald es aber ans Zeichnen geht, will AGS die Grafik des Frames zeichnen und bemerkt den Fehler.
In Deinem Fall werden *vorher* allerdings alle rep_ex-Funktionen aufgerufen (und somit auch PPCollision), d.h. der Fehler wird dadurch bemerkbar, dass AGS das einem nicht existenten Frame zugeordnete Sprite liefern soll.
CJ müsste also einbauen, dass Game.GetViewFrame null zurückliefert, falls das Frame nicht exisitert. Außerdem müsste das Modul angepasst werden.
In der Zwischenzeit kannst Du Folgendes machen:
Damit wird die Collision Detection einfach übersprungen.
Das Problem ist aber wahrscheinlich nicht wirklich gelöst, da der Charakter nach wie vor ein Frame zugewiesen bekommen hat, das in seiner View nicht existiert.
Das sollte natürlich nie der Fall sein, d.h. der Fehler liegt irgendwo anders.
Er könnte z.B. in dem von Dir hinzugefügten Codeteil liegen. Bedenke, dass die Nummerierung von Loops und Frames immer bei 0 losgeht, nicht bei 1.
Code: Alles auswählen
player.Frame=3;
Ich vermute mal, dass AGS intern nicht überprüft, ob hier bereits ein Fehler vorliegt, sondern den Wert erstmal ändert.
Sobald es aber ans Zeichnen geht, will AGS die Grafik des Frames zeichnen und bemerkt den Fehler.
In Deinem Fall werden *vorher* allerdings alle rep_ex-Funktionen aufgerufen (und somit auch PPCollision), d.h. der Fehler wird dadurch bemerkbar, dass AGS das einem nicht existenten Frame zugeordnete Sprite liefern soll.
CJ müsste also einbauen, dass Game.GetViewFrame null zurückliefert, falls das Frame nicht exisitert. Außerdem müsste das Modul angepasst werden.
In der Zwischenzeit kannst Du Folgendes machen:
Code: Alles auswählen
function PPC_GetCharBounds(Character *a) {
ppc_minx = a.x-GetViewportX();
ppc_maxy = a.y-GetViewportY();
if (a.Loop>=Game.GetLoopCountForView(a.View) || a.Frame>=Game.GetFrameCountForLoop(a.View, a.Loop)) {
ppc_maxx = ppc_minx+1;
ppc_miny = ppc_maxy-1;
return;
}
...
Das Problem ist aber wahrscheinlich nicht wirklich gelöst, da der Charakter nach wie vor ein Frame zugewiesen bekommen hat, das in seiner View nicht existiert.
Das sollte natürlich nie der Fall sein, d.h. der Fehler liegt irgendwo anders.
Er könnte z.B. in dem von Dir hinzugefügten Codeteil liegen. Bedenke, dass die Nummerierung von Loops und Frames immer bei 0 losgeht, nicht bei 1.
Use gopher repellent on funny little man
- Timer
- Süßwasserpirat
- Beiträge: 260
- Registriert: 27.02.2007, 17:35
Danke! Ein Problem weniger. Ich hatte irgendwie in Erinnerung, dass etwas in AGS anders gezählt wird - aha, die Frames waren es also nicht. Ich habe jetzt die ganzen .frame = ... - Stellen überprüft.
Danke nochmal!
(Ich glaube, umso weiter ich das ganze Ding verändere, desto mehr mache ich kaputt... Ich habe jetzt schon mehrere Sachen, die am Anfang funktionniert haben, ich aber eine kleine Veränderung wollte, die gleich alles zerstört hat...)
Danke nochmal!
(Ich glaube, umso weiter ich das ganze Ding verändere, desto mehr mache ich kaputt... Ich habe jetzt schon mehrere Sachen, die am Anfang funktionniert haben, ich aber eine kleine Veränderung wollte, die gleich alles zerstört hat...)
- Timer
- Süßwasserpirat
- Beiträge: 260
- Registriert: 27.02.2007, 17:35
Ich bin nun schon viel weiter, als ich es mir jemals vorgestellt hätte - ich habe einfach umgedacht, und jetzt funktionniert so ziemlich alles, was ich will...
Ohne Hilfe wäre ich da nicht angekommen. Noch einmal viiielen Dank!
Nun funktionniert das hier nicht:
Ich will damit überprüfen, ob der PlayerCharakter mit einem Gegenstand, der über RawDrawImage gezeichnet wird, zusammenstößt. Allerdings scheint es nicht zu funktionnieren. Trotzdem kann ich leider keinen richtigen Fehler finden - außer ich gehe das Problem falsch an...
Ich flehe um Hilfe!
Ohne Hilfe wäre ich da nicht angekommen. Noch einmal viiielen Dank!
Nun funktionniert das hier nicht:
Code: Alles auswählen
int Beruehrung (int Zahl) {
int X = Droops[Zahl].Xpos;
int Y = Droops[Zahl].Ypos;
int PlHoe = SpielerY ();
int PlBre = SpielerX () - 5;
while (X < Droops[Zahl].Xpos + 14){
while (Y < Droops[Zahl].Ypos - 17){
while (PlHoe < SpielerY () - 32){
while (PlBre < SpielerX () + 5){
if (PlBre == X) {
if (PlHoe == Y) return true;
else return false;
}
PlBre = PlBre + 1;
}
PlHoe = PlHoe - 1;
}
Y = Y - 1;
}
X = X + 1;
}
}
Ich flehe um Hilfe!
- Rocco
- Adventure-Treff
- Beiträge: 1019
- Registriert: 25.11.2003, 16:20
- Wohnort: Ronville
- Kontaktdaten:
also zu deinem konstrukt kann ich dir nicht sagen warum es nicht funktioniert, eines ist aber gewiss 4 ineinander verschachtelte whileschleifen sind sicher nicht der weisheit letzter schluss
wenn am anfang irgendeine deiner 4 while schleifen nicht true ist, kriegst du schon kein ergebnis mehr zurück, weil du dann nie in der mitte bei return ankommst.
hier ein anderer ansatz für eine kollisions erkennung:
wenn am anfang irgendeine deiner 4 while schleifen nicht true ist, kriegst du schon kein ergebnis mehr zurück, weil du dann nie in der mitte bei return ankommst.
hier ein anderer ansatz für eine kollisions erkennung:
Code: Alles auswählen
function FUNC_Roc_coll_detection(int obj1_x,int obj1_y, int obj1_width, int obj1_height, int obj2_x,int obj2_y, int obj2_width, int obj2_height)
{
if((obj1_y + obj1_height) < obj2_y) return 0; // no collision
if(obj1_y > (obj2_y + obj2_height)) return 0;
if((obj1_x + obj1_width) < obj2_x) return 0;
if(obj1_x > (obj2_x + obj2_width)) return 0;
return 1; // collision
}
- Rocco
- Adventure-Treff
- Beiträge: 1019
- Registriert: 25.11.2003, 16:20
- Wohnort: Ronville
- Kontaktdaten:
also meine kollisionsdetection funktioniert, du kannst sie dir in der praxis in diesem modul anschauen -> http://new.bigbluecup.com/games.php?act ... ail&id=689
ich gehe mal davon aus, dass du weisst welche parameter du übergeben musst.
ich gehe mal davon aus, dass du weisst welche parameter du übergeben musst.