2 Fragen... (2 Probleme - keine leichten) - Und Weiteres

Fragen zu "Adventure Game Studio"? Hier rein!
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Kein Thema, hats geklappt? :)
Use gopher repellent on funny little man
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

Nein - leider funktionniert es immer noch nicht besser. Ich drücke zwar auf ENTER, aber es kommt kein Geschoss...
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hm, bei mir funktionierts.
Ich hab nur die Spriteslots geändert. Seltsam.
Use gopher repellent on funny little man
Benutzeravatar
Kaktus
Tastatursteuerer
Tastatursteuerer
Beiträge: 658
Registriert: 17.02.2006, 01:45
Wohnort: Wüstä
Kontaktdaten:

Beitrag von Kaktus »

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.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ich hab zufälligerweise vor ein paar Tagen eine Sidescroller-Basis programmiert.

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) {
  ...
Wenn ein Schuss verschwindet, setze ich seine x-Koordinate einfach wieder auf 0 und er wird automatisch frei.
freeshotindex() liefert den ersten freien Schuss.
Use gopher repellent on funny little man
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

Super. Jetzt funktionniert alles auch bei mir. Gut. Das Grundgerüst ist aufgestellt. Jetzt müssen noch alle Details geregelt werden.
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

Darf ich euch wieder belästigen? :oops:

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)
Das Room 12 script lautet an dieser Stelle:

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;
}
Ich fürchte stark, es hat etwas mit diesem neu hinzugefügten Scriptteil zu tun:

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;
}
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... :cry:
Aber hoffen kann man immer.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Nicht unbedingt.
Der Fehler kommt bei dieser Zeile:

Code: Alles auswählen

  ViewFrame *frame=Game.GetViewFrame(a.View, a.Loop, a.Frame);
Ist das:
An error has occured... scripting error... contact autor...
der genaue Wortlaut der Fehlermeldung? :-k
Use gopher repellent on funny little man
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

Erst einmal: Vielen Dank für deine Antwort! :)
Und nein - der genaue Wortlaut der Fehlermeldung ist folgender:
Bild
Aargh... Jetzt merke ich, dass ich den wichtigsten Satz der Fehlermeldung weg gelassen habe... :roll:
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Also: es ist möglich, den Loop oder das Frame eines Charakters direkt zu ändern, z.B. so:

Code: Alles auswählen

  player.Frame=3;
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:

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;
    }
    ...
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.
Use gopher repellent on funny little man
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

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...)
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

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... :D
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 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! :)
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

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 :wink:

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
}
Benutzeravatar
Timer
Süßwasserpirat
Süßwasserpirat
Beiträge: 260
Registriert: 27.02.2007, 17:35

Beitrag von Timer »

Deine Lösung funktionniert leider auch nicht besser als meine (also gar nicht :wink: ). Aber trotzdem danke! :)
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

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.
Antworten