|
7 registered members (fairtrader, Quad, miwok, Martin_HH, AndrewAMD, alibaba, dpn),
581
guests, and 0
spiders. |
|
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Spieli]
#406620
08/25/12 21:16
08/25/12 21:16
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Hi Spieli! Ich denke du musst rausfinden, ob du mit dem Ball in der Luft bist. Wenn das nämlich der Fall ist, würde ich einfach die Sprungtaste sperren oder sowas. Wie ist denn das Level gemacht - also verwendest du z.B. den WED um deine Welt zu bauen - oder wie machst du das? Weil dann könntest du die Eigenschaft "floor_dist" verwenden, um zu schauen, wie weit du über dem Untergrund bist. Das funktioniert aber nur mit Levelblocks. Wenn du da auch noch Modelle rumstehen hast, dann musst du dir im Handbuch mal die Funktion "c_trace" anschauen - die sieht relativ kompliziert aus, ist aber sehr mächtig. Wenn du Fragen hast, schreib einfach hier ins Forum 
Last edited by HeelX; 08/25/12 21:17.
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: HeelX]
#406622
08/25/12 22:08
08/25/12 22:08
|
Joined: Aug 2012
Posts: 10
Spieli
OP
Newbie
|
OP
Newbie
Joined: Aug 2012
Posts: 10
|
Hi HeelX! ja ich verwende WED zum level bauen. ich werde versuchen dieses "floor_dist" einzubauen und schon wie gesagt arbeite ich mit gamestudio a8 erst seit 2 tagen also will alles noch nicht richtig funktionieren.manchmal kommen so kleine fehler hervor die normalerweise nie da sein dürften. ich bin auch nur ein junger bursche und kenn mich in der progammier sache noch gar keinen meter aus also kann ich dir nicht so viel über mein spiel sagen, deshalb mache ich einfach das: also die main datei:
#include <acknex.h>
#include <default.c>
#include <ackphysx.h>
#define PRAGMA_PATH "Audio"
#define PRAGMA_PATH "Models"
#define PRAGMA_PATH "Scripts"
#define PRAGMA_PATH "Images"
#define PRAGMA_PATH "Shaders"
#include "ballactions.c"
function main()
{
physX_open();
level_load("Level01.wmb");
on_cuu = yimpulse;
on_cul = xleftimpulse;
on_cur = ximpulse;
}
action ball()
{
ent_ball =me;
physx();
kamera();
}
und die ballsteuerung:
VECTOR ball_force;
ENTITY* ent_ball;
function yimpulse();
function ximpulse();
function xleftimpulse();
function physx()
{
pXent_settype(me, PH_RIGID, PH_SPHERE);
pXent_setfriction(me, 70);
pXent_setdamping(me, 10, 10);
pXent_setelasticity(me, 10);
while(1)
{
ball_force.y = -(key_cur = key_cul)*10*time_step;
ball_force.x = 0;
ball_force.z = 0;
pXent_addtorqueglobal(me, ball_force);
my.y = 0;
wait(1);
}
}
function kamera()
{
while(1)
{
camera.x = ent_ball.x;
camera.y = ent_ball.y -200;
camera.z = ent_ball.z +50;
camera.tilt = -20;
camera.pan = 90;
camera.arc = 90;
wait(1);
}
}
function yimpulse()
{
{
pXent_addvelcentral(ent_ball, vector(0,0,0250));
}
return;
}
function ximpulse()
{
{
pXent_addvelcentral(ent_ball, vector(0100,0,0));
}
return;
}
function xleftimpulse()
{
{
pXent_addvelcentral(ent_ball, vector(-0200,0,0));
}
return;
}
falls fehler drinne sind bitte verbessern und mir sagen! MfG Spieli
Last edited by HeelX; 08/26/12 09:21. Reason: bitte das nächste mal [code] und [/code] für Quellcode verwenden!
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Spieli]
#406624
08/26/12 09:24
08/26/12 09:24
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Also du hast ja die Funktion yimpulse an die Pfeil-nach-oben Taste gebunden. Drückst du sie, wird die Funktion ausgeführt. Dort führst du pXent_addvelcentral aus. Du könntest jetzt genau dort prüfen, ob die floor_dist von ent_ball kleiner einem gewissen Wert ist, und wenn das so ist, dann ist der Ball auf dem Boden (oder nahe dem Boden) und du führst pXent_addvelcentral aus, um ihn springen zu lassen! Das könnte in etwa so aussehen:
function yimpulse()
{
// ist der Ball 16 quants oder weniger nahe dem Boden, dürfen wir springen!
if (ent_ball->floor_dist < 16)
{
pXent_addvelcentral(ent_ball, vector(0, 0, 250));
}
}
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Spieli]
#406648
08/26/12 18:48
08/26/12 18:48
|
Joined: Jul 2002
Posts: 3,208 Germany
Error014
Expert
|
Expert
Joined: Jul 2002
Posts: 3,208
Germany
|
Hey, schau dir mal die snd_-funktionen an, insbesondere snd_play und snd_loop. Dafür musst du SOUND*-Objekte einfügen, entweder globale, die die Engine für dich initialisiert, zb so:
//ausserhalb von einer Funktion, und vor dem Code unten
SOUND* mein_sound = "sound.wav"; //"sound.wav" ist der Dateiname
...
//in deiner Funktion:
snd_play(mein_sound,100,0);
Alternativ kannst du solche Sounds auch lokal dynamisch erstellen, das geht mit snd_create. Das ist aber schon etwas schwieriger - für den Anfang (und für kleine Sounddateien) geht das oben schon ganz gut. Wenn du sehr große Sounddateien hast, ist es oft günstiger, diese mit den media_-Befehlen abzuspielen, das wäre z.B. für Hintergrundmusik ganz günstig. Als kleiner Nachteil "loopen" die aber nicht perfekt. Falls du das machen willst, brauchst du media_play, etwa so:
//In deiner Funktion:
media_play("sound.wav",NULL,100);
Für dich vermutlich nicht ganz so wichtig: Beachte, dass MP3-Dateien unangenehme Lizenzbedingungen haben. Daher bietet sich ogg eher an. wav-Dateien kannst du natürlich auch nehmen, die sind aber natürlich etwas größer.
Last edited by Error014; 08/26/12 18:50.
Perhaps this post will get me points for originality at least.
Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Error014]
#406651
08/26/12 21:18
08/26/12 21:18
|
Joined: Aug 2012
Posts: 10
Spieli
OP
Newbie
|
OP
Newbie
Joined: Aug 2012
Posts: 10
|
hey, danke für deine Antwort! ich werde es dann ausprobieren. nur gibt es ein problem und zwar:hab ich mit einem guten Programmierer geschrieben und zwar dass ich zwischen level 1 und level 2 wechsel kann(also wenn ich ans ende von level 1 komme dann gehe ich automatisch ins nächste level)nur das will nicht ganz funktionieren.
Der Code:
var aktuelles_level = 1;
function lade_neues_level() { STRING* nextlevel = "#30"; str_cpy(nextlevel, "level"); str_cat(nextlevel, str_for_num(NULL, aktuelles_level)); str_cat(nextlevel, ".wmb"); error(nextlevel); level_load(nextlevel); aktuelles_level = aktuelles_level +1; }
der fehler ist, ich kann das spiel zwar starten aber da kommt die fehlermeldung das es die level 1 datei nicht gibt.
Irgendwann werde ich auch ein Youtube Video oder Sceenshots von meinem spiel machen!
Last edited by Spieli; 08/26/12 21:22.
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Spieli]
#406710
08/27/12 17:04
08/27/12 17:04
|
Joined: Jul 2002
Posts: 3,208 Germany
Error014
Expert
|
Expert
Joined: Jul 2002
Posts: 3,208
Germany
|
Hey, STRING-Objekte sind etwas kniffliger als solche Typen wie var, int oder char. Dabei handelt es sich um Objekte, die man "korrekt" erstellen muss. Im letzten Post habe ich was von SOUND-Objekten geschrieben, und zwar, dass die Engine für dich den Sound erstellt, wenn du außerhalb einer Funktion definierst, es aber innerhalb nicht so klappt. Bei Strings ist das genauso. Du kannst außerhalb von Funktionen schreiben:
STRING* meinstring = "#30";
Innerhalb von Funktionen musst du aber str_create benutzen - du kannst lokal nur den Zeiger* erstellen, und musst dann mittels der str_create Anweisung getrennt den Auftrag geben, den String im Speicher zu erstellen:
function meine_funktion() {
STRING* mein_string;
mein_string = str_create("Dies ist mein String!");
error(mein_string);
str_remove(mein_string);
}
Du solltest auch nicht vergessen, nicht mehr benötigte Strings mittels str_remove wieder zu entfernen. Andernfalls bleiben sie im Speicher - Memory leak! Die einfachste Lösung für dein Problem wäre daher, die Definition von "nextlevel" einfach aus der Funktion auszulagern. Das kann aber auch ein allgemeiner, globaler "tempstring" sein, den du überall wieder verwendest. Das ist am Anfang IMHO einfacher, als stets mit lokalen Strings zu hantieren (was aber vll. eleganter ist).
var aktuelles_level = 1;
STRING* nextlevel = "#30";
function lade_neues_level()
{
str_cpy(nextlevel, "level");
str_cat(nextlevel, str_for_num(NULL, aktuelles_level));
str_cat(nextlevel, ".wmb");
error(nextlevel);
level_load(nextlevel);
aktuelles_level = aktuelles_level +1;
}
Oder alternativ:
var aktuelles_level = 1;
function lade_neues_level()
{
STRING* nextlevel;
nextlevel = str_create("#30"); //Würde auch in einer Zeile gehen, ist aber so klarer :)
str_cpy(nextlevel, "level");
str_cat(nextlevel, str_for_num(NULL, aktuelles_level));
str_cat(nextlevel, ".wmb");
error(nextlevel); //hier sollte korrekt "level1.wmb" ausgegeben werden!
level_load(nextlevel);
aktuelles_level = aktuelles_level +1;
str_remove(nextlevel);
}
Übrigens kannst du für aktuelles_level auch einen anderen Typ als var benutzen, z.B. "int" für ganze Zahlen (es gibt doch kein Level 2,323 oder?) oder falls es unter 255 Level bleiben auch char. In dem Fall solltest du aber str_for_int statt str_for_num verwenden. +++++++++++++ Und wo ich all das geschrieben habe: Ich glaube nicht, dass das dein Problem löst. Die Frage ist, gibt es denn "level1.wmb"? Dein Code verwendet error, d.h. vor dem laden sollte ein Dialogfeld aufgehen, dass den String ausgibt. Passiert das? Und wenn es passiert, was steht in dem Feld - es sollte "level1.wmb" sein. Deine "level1.wmb"-Datei muss sich im Verzeichnis des Spiels (da, wo auch deine Skriptdatei, die du benutzt, sitzt) befinden. Und achtung, uns interessiert nicht eine ".wmp", wir brauchen die ".wmb"-Datei. * - das Sternchen "*" hinter dem Typ deutet an, dass es nur ein Zeiger ist - das bedeutet, dass du dort nur die Adresse im Speicher hinterlegst, und gar nicht das Objekt selbst. Bei einem Sound kannst du dir das so vorstellen: Die Engine lädt also deine vll 1 MB große Sound-datei und die befindet sich nun irgendwo im Speicher, und zwar in diesem Beispiel beginnend bei Memory-Block 300. Dann würde der SOUND-Zeiger "mein_sound" nicht diese 1 MB Sounddaten beinhalten, sondern nur die Zahl 300. Da die Engine aber weiß, dass es sich um einen SOUND-Zeiger handelt, weiß sie, dass sie ab dieser Adresse den Sound auslesen kann. Für Zeiger benutzt man auch "->" statt den Punkt ".", wie du in HeelX Beispielcode oben gesehen hast. Das korrigiert lite-C aber i.d.R. (für alle nicht zu komplexen Codebeispiele) für dich. Keine Sorge, wenn das noch eher verwirrend klingt! Zeiger sind ein wichtiges Konzept, und man kann eine Menge damit machen, aber man braucht eine Weile um "reinzukommen". Das passiert aber früher oder später von allein, also keine Panik!
Last edited by Error014; 08/27/12 17:09.
Perhaps this post will get me points for originality at least.
Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!
|
|
|
Re: Mein erstes Spiel und erste probleme
[Re: Error014]
#406711
08/27/12 17:10
08/27/12 17:10
|
Joined: Nov 2007
Posts: 2,568 Germany, BW, Stuttgart
MasterQ32
Expert
|
Expert
Joined: Nov 2007
Posts: 2,568
Germany, BW, Stuttgart
|
@error014: Das Problem wurde schon gelöst. Es lag am falschen Dateinamen. Auch kann man das
STRING* nextlevel = "#30";
problemlos auch in funktionen verwenden, solange man diesen string nur temporär verwendet (es ist dann für jede funktion der selbe string, den man verwendet, sozusagen eine statische variable) Gruß Felix
|
|
|
|