Mein erstes Spiel und erste probleme

Posted By: Spieli

Mein erstes Spiel und erste probleme - 08/25/12 20:14

Hey Leute,
ich hab vor 2 tagen angefangen zu scripten und mein erstes spiel ist einfach ein 2D adventure wo man einen ball durch verschiedene Levels steuert.Den Ball steure ich mit physiks und ich kann noch in der luft springen aber ich will das ich nur einmal springen kann, aber ich weiss nicht wie das geht. Könnt ihr mir bitte helfen?

Schöne Grüße,
euer Spieli
Posted By: HeelX

Re: Mein erstes Spiel und erste probleme - 08/25/12 21:16

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 smile
Posted By: Spieli

Re: Mein erstes Spiel und erste probleme - 08/25/12 22:08

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:

Code:
#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
Posted By: HeelX

Re: Mein erstes Spiel und erste probleme - 08/26/12 09:24

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:

Code:
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));
	}
}

Posted By: Spieli

Re: Mein erstes Spiel und erste probleme - 08/26/12 09:56

ja ich habe es geschafft mit hilfe meines bruders dass ich nur einmal springen kann. nur ne anfänger frage: wie kann ich sounds ins spiel einfügen?
Posted By: Error014

Re: Mein erstes Spiel und erste probleme - 08/26/12 18:48

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:

Code:
//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:

Code:
//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.
Posted By: Spieli

Re: Mein erstes Spiel und erste probleme - 08/26/12 21:18

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!
Posted By: Error014

Re: Mein erstes Spiel und erste probleme - 08/27/12 17:04

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:

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

Code:
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).

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

Code:
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!

Posted By: MasterQ32

Re: Mein erstes Spiel und erste probleme - 08/27/12 17:10

@error014:
Das Problem wurde schon gelöst. Es lag am falschen Dateinamen. Auch kann man das
Code:
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
Posted By: Spieli

Re: Mein erstes Spiel und erste probleme - 08/28/12 07:10

ja ich und MasterQ32 haben das Problem gelöst! Ein großes danke an dich MasterQ32!! wink

Gruß Spieli
Posted By: MasterQ32

Re: Mein erstes Spiel und erste probleme - 08/28/12 07:17

kein problem, gerne geschehen
© 2023 lite-C Forums