also ich wollte eigentlich gerne so ein rätsel in mein spiel einbauen wo der spieler eine box auf einen schalter schieben muss. nur habe ich ein paar probleme.
- ich weiß nicht wie ich überprüfen kann in welche richtung der charakter guckt denn wenn er sich links neben der box befindet soll er sie ja nur dann nach rechts bewegen können wenn er auch nach rechts guckt. ich habs z.b. mit character[ego].loop ==1 aber den befehl nimmt ags irgendwie nich an.
- desweiteren habe ich das problem dass ego zwar die kiste mehr oder weniger schiebt aber dann auch durch sie durch läuft. wie kann ich das objekt der kiste bzw box für ego undurchlässig machen?
danke im voraus.
kistenschieberätsel
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Probier es mal mit player.Loop (AGS 2.7!). Funktioniert bei mir einwandfrei.
Wie machst Du das denn bis jetzt? Poste doch mal dein script.
Hilfreich ist es auch, die Koordinaten mit einzubeziehen, also player.x, player.y, Object.X und Object.Y
Machst Du es so, dass die Kiste automatisch geschoben wird, wenn der Spieler in sie "hinein"läuft?
Ich würde es so lösen, dass der Spieler die Kiste mit Interact anklicken muss und die Kiste dann immer ein Stück in die entsprechende Richtung geschoben wird, je nachdem, ob er über, unter, links oder rechts neben der Kiste steht.
Wie machst Du das denn bis jetzt? Poste doch mal dein script.
Hilfreich ist es auch, die Koordinaten mit einzubeziehen, also player.x, player.y, Object.X und Object.Y
Machst Du es so, dass die Kiste automatisch geschoben wird, wenn der Spieler in sie "hinein"läuft?
Ich würde es so lösen, dass der Spieler die Kiste mit Interact anklicken muss und die Kiste dann immer ein Stück in die entsprechende Richtung geschoben wird, je nachdem, ob er über, unter, links oder rechts neben der Kiste steht.
Use gopher repellent on funny little man
Hier mein code (bisher):
ich habe mich bis jetzt wie man sieht nur wenige minuten damit beschäftigt. ich wollte es so machen dass der charakter in die kiste hinein laufen muss um sie zu schieben denn bei längerem verschieben wird das mit dem interact auf die dauer nervig. was ich bei meinem letzten post vergessen hatte: ich wollte eine allgemeine funktion machen damit ich auch mehrer kisten in einem raum einfach per funktion verschieben lassen kann. wie gesagt kriege ich das mit der laufrichtung nicht hin und der charakter überläuft halt noch die kiste weshalb ich sie irgendwie gerne als festes undurchlässiges objekt hätte aber da weiß ich ebenfalls nicht wie ich das anstellen soll.
Code: Alles auswählen
function BoxMove (int obj){
objx = GetObjectX(obj);
objy = GetObjectY(obj);
if ((character[EGO].Moving) && (character[EGO].x <= objx) && (character[EGO].x >= objx-20)){ //EGO ist links von der box
MoveObject(obj, objx+20, objy, 5);
}
if ((character[EGO].Moving) && (character[EGO].x >= objx) && (character[EGO].x <= objx+20) ){ //EGO ist rechts von der box
MoveObject(obj, objx-20, objy, 5);
}
if ((character[EGO].Moving) && (character[EGO].y <= objy) && (character[EGO].y >= objy-20)){//EGO ist über von der box
MoveObject(obj, objx, objy+20, 5);
}
if ((character[EGO].Moving) && (character[EGO].y >= objy) && (character[EGO].y <= objy+20)){ //EGO ist unter von der box
MoveObject(obj, objx, objy-20, 5);
}
}
okay ich habe das mal mit dem player.Loop probiert und bei mir klappt es nun auch einwandfrei.
jetzt habe ich nur noch ein problem. der charakter scheint die kiste nur auf dessen baseline zu schieben was dafür sorgt dass wenn er nicht die baseline trifft dass er dann durch die kiste hindurch läuft. ich weiß halt nicht wie ich das machen kann dass die kiste undruchlässig ist oder dass er halt an allen punkten gleich "angreifen" kann.
jetzt habe ich nur noch ein problem. der charakter scheint die kiste nur auf dessen baseline zu schieben was dafür sorgt dass wenn er nicht die baseline trifft dass er dann durch die kiste hindurch läuft. ich weiß halt nicht wie ich das machen kann dass die kiste undruchlässig ist oder dass er halt an allen punkten gleich "angreifen" kann.
erst mal will ich mich für meine vielen posts entschuldigen. als nächstes wollte ich sagen dass ich glaube dass ich es so hinbekommen habe wie ich es haben wollte. es fehlt nur noch das feintuning. wen es interessiert kann ja meinen code benutzen:
Code: Alles auswählen
int objx, objy;
function BoxMove (int obj){
objx = GetObjectX(obj);
objy = GetObjectY(obj);
if ((character[EGO].Moving) && (character[EGO].x <= objx) && (character[EGO].x >= objx-20) && (character[EGO].y>=objy-30) && (character[EGO].y<=objy) && (player.Loop==2)){
MoveObject(obj, objx+20, objy, 5);
}
if ((character[EGO].Moving) && (character[EGO].x >= objx+50) && (character[EGO].x <= objx+100) && (character[EGO].y>=objy-30) && (character[EGO].y<=objy) && (player.Loop==1)){
MoveObject(obj, objx-20, objy, 5);
}
if ((character[EGO].Moving) && (character[EGO].y <= objy-25) && (character[EGO].y >= objy-50) && (character[EGO].x>=objx) && (character[EGO].x<=objx+30) && (player.Loop==0)){
MoveObject(obj, objx, objy+20, 5);
}
if ((character[EGO].Moving) && (character[EGO].y >= objy+10) && (character[EGO].y <= objy+20) && (character[EGO].x>=objx) && (character[EGO].x<=objx+30) && (player.Loop==3)){
MoveObject(obj, objx, objy-20, 5);
}
}
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Die Koordinaten der Box beziehen sich auf die linke, untere Ecke!
Hier meine Lösung:
Hier meine Lösung:
Code: Alles auswählen
function abs(int i) {
if (i<0) i=-1*i;
return i;
}
function repeatedly_execute() { // rep_ex des raumes!
int box=1;
while (box<=4) { // Boxen sind Objekte 1-4
dx=player.x-(object[box].X+20); // Box-Objekt ist 40 Pixel breit
dy=(player.y-(object[box].Y))*2; // Box nicht so hoch wie breit
if (FloatToInt(Math.Sqrt((IntToFloat(dx)^2)+(IntToFloat(dy)^2)))<25) {
if (abs(dx)>=abs(dy)) {
dx=(dx/(abs(dx))*20;
dy=0;
}
else {
dx=0;
dy=(dy/(abs(dy))*20;
}
object[box].Move(dx, dy, 5, eBlock);
}
box++;
}
}
Use gopher repellent on funny little man