Mit welcher Programmiersprache sollte man Spiele programmieren?
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
antwort
befehlen
beispiel
beitrag
button
datei
element
face
fragen
funktion
jahr
main
model
null
programmiersprache
quiz
schulen
sprache
tutorial
window
-
adrians schrieb:
....oh mann *hand vorn kof hau*
woher soll man das wissen wenns einem keiner sagt? ich bin nunmal auch erst 15
danke compactdisc, jetzt funktionierts -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wof?r gibt es B?cher und TUtorials? SOviel Eigeninitiative kann man mit 15 schon erwarten -.-
-
Ich versuch mal den Begriff Engine ein wenig zu erkl?ren:
Um einen 3D-W?rfel zu erstellen, musst du zB mit DirectX "von hand" 12 Polygone zeichnen (f?r jede Seite zwei), also du erstellst diese 12 Poloygone jedes einzelnd und gibts die Koodinaten im 3D-W?rfel jeweils f?r jedes Polygon an. Der Nachteil: Du musst selber berrechnen, wo welches Polygon im 3D-W?rfel sein soll, ?ber die Vertices. Bei einem W?rfel noch nicht der Weltuntergang, dann aber viel Spa? bei einer Kugel.
Bei einer Engine im Gegensatz hast du:
ErstelleQuader(x,y,z,b,h,t);
Dann hast du deinen Quader auf dem Bildschirm mit einer Programmzeile (x,y,z: Position, b,h,t: Breite, H?he, Tiefe).
Das w?re jetzt schon eine einfache Engine, wobei die gr??eren gesamte Mapformate, Modelle, Licht&Schatten, uvm. darstellen k?nnen. Das alles "von Hand" zu Programmieren, ist schier unm?glich ;)
Ich habe einmal eine Zeit lang mit der Genesis3D-Engine gearbeitet, ist aber nicht mehr so aktuelle Grafik. Dann bin ich auf Irrlich und schlie?lich auf Ogre3D-Engine umgestiegen. Wobei ich heute keine 3D-Spielereien mehr programmiere.
Wer es einfach haben will, empfehle ich Blitz3D, ist sehr einfach un dim Basic-Dialekt, aber halt sehr eingeschr?nkt, f?rn Anfang sollte es aber reichen und um sich mit der 3D-Programmierung vertraut zu machen.
Beitrag ge?ndert am 3.08.2006 13:52 von trueweb -
Ein Model oder ?hnliches zu laden ist nicht so kompliziert, aber Aufwand bis es wirklich klappt ist es schon genug. Hier ein Beispiel aus meinen eigenen Projekt. musste die Class Datei dekompilieren, da ich die Sources nat?rlich nicht @work hab ;)
Java & OpenGL: OBJModel Reader und ModelRenderer
// Decompiled by DJ v3.9.9.91 Copyright 2005 Atanas Neshkov Date: 03.08.2006 14:31:19 // Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version! // Decompiler options: packimports(3) // Source File Name: ModelReader.java package com.evildevil.bubble.model; import java.io.*; import java.util.*; // Referenced classes of package com.evildevil.bubble.model: // Model, Mesh, Vertex3, TexCoordf, // Normalf, Face public class ModelReader extends BufferedReader { public ModelReader(Reader in) { super(in); model = null; materials = null; vertices = null; uvs = null; normals = null; texCoords = null; line = null; modelLineNumber = 0; centered = true; materials = new HashMap(); vertices = new ArrayList(); uvs = new ArrayList(); normals = new ArrayList(); texCoords = new ArrayList(); } public boolean readModel() throws IOException, NumberFormatException { model = new Model(); Mesh mesh = null; String material = null; String elements[] = (String[])null; while((line = readLine()) != null) { modelLineNumber++; line = line.trim(); if(line.length() <= 0) continue; elements = line.split("\\s+"); if(elements == null || elements.length == 0) { elements = (String[])null; continue; } if(elements[0].equalsIgnoreCase("mtllib")) { readMaterial(line); model.setMaterials(materials); continue; } if(elements[0].charAt(0) == 'g' || elements[0].charAt(0) == 'o') { if(mesh != null) model.addMesh(mesh); mesh = new Mesh(elements[1]); continue; } if(elements[0].charAt(0) == 'v') { if(elements[0].length() == 1 && elements.length == 4) { Vertex3 v = new Vertex3(Float.valueOf(Float.parseFloat(elements[1])), Float.valueOf(Float.parseFloat(elements[2])), Float.valueOf(Float.parseFloat(elements[3]))); model.addVertex(v); continue; } if(elements[0].length() == 2) { if(elements[0].charAt(1) == 't') { TexCoordf tc; switch(elements.length) { case 2: // '\002' tc = new TexCoordf(Float.parseFloat(elements[1])); break; case 3: // '\003' tc = new TexCoordf(Float.parseFloat(elements[1]), Float.parseFloat(elements[2])); break; case 4: // '\004' tc = new TexCoordf(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]), Float.parseFloat(elements[3])); break; case 5: // '\005' tc = new TexCoordf(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]), Float.parseFloat(elements[3]), Float.parseFloat(elements[4])); break; default: tc = new TexCoordf(); break; } model.addUV(tc); continue; } if(elements[0].charAt(1) == 'n') { model.addNormal(new Normalf(Float.parseFloat(elements[1]), Float.parseFloat(elements[2]), Float.parseFloat(elements[3]))); continue; } } } if(elements[0].equalsIgnoreCase("usemtl")) mesh.setMaterial(elements[1]); else if(elements[0].charAt(0) == 'f') { Face face = new Face(); face.setGLPolygonMode(elements.length - 1); for(int i = 1; i < elements.length; i++) { String values[] = elements[i].split("/"); if(!values[0].equalsIgnoreCase("")) face.addVertex(Integer.parseInt(values[0]) - 1); if(!values[1].equalsIgnoreCase("")) face.addUV(Integer.parseInt(values[1]) - 1); if(!values[2].equalsIgnoreCase("")) face.addNormal(Integer.parseInt(values[2]) - 1); } mesh.addFace(face); } } model.addMesh(mesh); return false; } public Model getModel() { return model; } protected void readMaterial(String materialFileName) { if(model == null || materials == null) return; try { BufferedReader br = new BufferedReader(new FileReader(new File((new StringBuilder("models/")).append(materialFileName.split(" ")[1]).toString()))); String materialName = null; String materialTexture = null; for(String line = null; (line = br.readLine()) != null;) { line = line.trim(); if(line.length() > 0) { if(line.startsWith("newmtl")) materialName = line.split(" ")[1]; if(line.startsWith("map_Kd")) materialTexture = line.split(" ")[1]; if(materialName != null && materialTexture != null) { materials.put(materialName, materialTexture); materialName = null; materialTexture = null; } } } br.close(); } catch(FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch(IOException ioe) { ioe.printStackTrace(); } } public String getLastReadLine() { return line; } public int getLineNumber() { return modelLineNumber; } private Model model; private HashMap materials; private List vertices; private List uvs; private List normals; private List texCoords; private String line; private int modelLineNumber; private boolean centered; }
Und ein Auszug aus dem Anzeige Code. Diesmal nicht dekompiliert. Den gibt es frei ;D
...public ModelViewerRenderer() { } public void initRenderer() { GL11.glShadeModel(GL11.GL_SMOOTH); GL11.glClearColor(0.0f,0.0f,0.0f,0.0f); // black background GL11.glClearDepth(1.0f); // depth of 0 to 1 GL11.glEnable(GL11.GL_DEPTH_TEST); // enable depth testing GL11.glDepthFunc(GL11.GL_LEQUAL); GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT,GL11.GL_NICEST); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glLight(GL11.GL_LIGHT0,GL11.GL_DIFFUSE,BufferUtils.createFloatBuffer(whiteDiffuse)); GL11.glLight(GL11.GL_LIGHT0,GL11.GL_POSITION,BufferUtils.createFloatBuffer(posSun)); GL11.glEnable(GL11.GL_LIGHT0); GL11.glEnable(GL11.GL_LIGHTING); GL11.glViewport(0,0,width,height); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); // a nice 45? perspective GLU.gluPerspective(45.0f,(float)width/(float)height,0.1f,fov); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); } public void initScene() { modelList = GL11.glGenLists(1); ModelReader mr = null; // we have no model? so don't try to load one if (modelFileName == null) return; StringBuilder msg = new StringBuilder(); try { // read mr = new ModelReader(new FileReader(new File("models/"+modelFileName))); mr.readModel(); model = mr.getModel(); // write if exists File outModel = new File(modelFileName.substring(0,modelFileName.length()-4)+".bmf"); if (!outModel.exists()) { ModelWriter mw = new ModelWriter(new FileOutputStream(outModel),model); mw.writeModel(); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (NumberFormatException nfe) { //nfe.printStackTrace() msg.append("Line: ("+mr.getLineNumber()+ ") "+mr.getLastReadLine()+"\n\n"); msg.append(nfe.getMessage()+"\n\n"); for (StackTraceElement ste : nfe.getStackTrace()) { msg.append(ste.toString()+"\n"); } JOptionPane.showMessageDialog(null,msg.toString(),"Error on model loading",JOptionPane.ERROR_MESSAGE); return; // on number parse errors, return! } catch (IOException ioe) { ioe.printStackTrace(); //return; // on read errors, just return to read the next model } textures = new HashMap<String,Integer>(); // preload textures for (String material : model.getMaterials().keySet()) { textures.put(material,TextureManager.getManager().getTexture("textures/"+model.getMaterials().get(material).trim())); } } public void renderScene() { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GL11.glLoadIdentity(); GL11.glTranslatef(0.0f+translateX,-5.0f+translateY,-40.0f+translateZ); GL11.glRotatef(rotateX,1.0f,0.0f,0.0f); GL11.glRotatef(rotateY,0.0f,1.0f,0.0f); GL11.glRotatef(rotateZ,0.0f,0.0f,1.0f); GL11.glListBase(modelList); GL11.glCallList(modelList); if (autoRotate) { if (autoRotateX) rotateX(); if (autoRotateY) rotateY(); if (autoRotateZ) rotateZ(); } } public void preRenderScene() { if (model == null) return; // no model, no rendering GL11.glNewList(modelList,GL11.GL_COMPILE); for (Mesh mesh : model.getMeshes()) { // bind the texture this mesh is using if (model.getMaterials().get(mesh.getMaterial()) != null) { GL11.glBindTexture(GL11.GL_TEXTURE_2D,textures.get(mesh.getMaterial())); } for (Face face : mesh.getFaces()) { final int[] vertices = face.getVertices(); final int[] uvs = face.getUVs(); final int[] normals = face.getNormals(); GL11.glBegin(face.getGLPolygonMode()); for (int i=0; i<vertices.length; i++) { Vertex3<Float> v = model.getVertices().get(vertices[i]); Normalf n = model.getNormals().get(normals[i]); n.glNormal(); if (uvs.length > 0) { TexCoordf uv = model.getUVs().get(uvs[i]); uv.glTexCoord(); } GL11.glVertex3f(v.getX(),v.getY(),v.getZ()); } GL11.glEnd(); } } GL11.glEndList(); } ...
Beitrag ge?ndert am 3.08.2006 14:36 von evil-devil -
naja ich verstehe zwar nur einzelne begriffe die ich aus php kenne, aber kompliziert sieht es wirklich aus.
Wof?r gibt es B?cher und TUtorials? SOviel Eigeninitiative kann man mit 15 schon erwarten -.-
ich hab mir schon das c tutorial gesucht und diese engine geschichte war nur eine frage die nebenbei aufgekommen ist, da ich st?ndig diese begriffe h?re, au?erdem bekommt jeder von uns so noch ein paar gulden (auch wenn dies nicht n?tig ist) -
Naja, BEgriffe h?rt man ?berall ;) Kenne viele Begriffe mit denen ich nichts anfangen kann aber deren Bedeutung kenne. Zum Teil weil man sie als einzelne Person in den seltesten F?llen je anwenden wird.
Zur Spiele Programmierung kannst eigentlich jede Sprache nutzen die es derzeit gibt. SOlange du kein VB benutzt geht alles klar ;)
Ob du als Grafik API D3D (nur Windows) oder OpenGL (fast ?berall, auch Handys) benutzt bleibt dir ?berlassen. Anbindung an beide gibt es f?r fast jede Sprache.
Wor?ber du dir aber am meisten im klaren sein solltest ist, dass die meisten wirklich guten Resourcen nur in der englischen Sprache verf?gbar sind und leider h?ufig von Mathematischen Ausdr?cken strotzen.
Gute Anlaufstellen sind unter anderem:
http://nehe.gamedev.net/
http://www.gamedev.net/
http://www.gamasutra.com/
http://developer.nvidia.com/
http://www.ati.com/developer/index.html
Gibt noch einige andere gute und weniger gute Pages, aber diese da oben sollte man schon regelm??ig abgrasen. N?her dran sein an der Industrie geht fast nicht. Es seidenn du arbeitest bei EA oder so ;) -
Ok hier ist mein erstes kleines C-Programm. Es ist nicht viel oder etwas besonderes aber ich habe es selbst erstellt. Jedoch wird es immer an einer bestimmten Stele unterbrochen und von Windows beendet.
#include <stdio.h>
main(void)
{
printf("\nHallo. Wie hei?t du?\n");
char feld[1]={};
char *name;
name=&feld[1];
scanf("%s",name);
printf("\nHallo %s\n",name);
/*
Nach der Ausgabe dieses Textes wird das Programm beendet.
*/
getchar();
return 0;
}
Worin besteht der Fehler? -
?hm, wenn ich das richtig sehe, versucht du bei deiner Zuweisung auf das Array "name=&feld[1]" auf einen nicht definierten Bereich zuzugreifen.
Du hast oben dein Array mit einer Gr??e von 1 definiert. Folglich musst du das erste Feld mit "0" ansprechen.
Der Index bei einem Array beginnt immer bei 0. Sprich egal wie gro? dein Array ist, der letzte Index ist immer Arraygr??e - 1.
?nder einfach mal das "name=&feld[1]" in "name=&feld[0]" um, und es sollte klappen. -
*vor den kopf hau*
stimmt. aber wenn ich jetzt mein programm starte dann schlie?t sich das Fenster nachdem es den eingegebenen Namen ausgibt, obwohl ich
getchar(); return 0;
drin habe -
Naja, ich denke mal, das getChar() einfach den eingebenen CHar liest und dann nat?rlich die Programmausf?hrung weitergeht. Entsprechend dein PRogramm beendet wird. M?sstest es in einer Schleife getChar() solange abfragen bis die entsprechende Taste gedr?ckt wurde.
Hab dazu noch nen Bsp. gefunden.
http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/getchar.c -
so langsam verzweifele ich wirklich
#include <stdio.h> main(void) { printf("\nHallo. Wie hei?t du?\n"); char feld[0]={}; char *name; name=&feld[0]; scanf("%s",name); printf("\nHallo %s\n",name); /*hier kommt immer eine fehlermeldung beim kompilieren*/ while ( getchar() != RETURN); }
Kann man die while-Schleife so schreiben? wenn nicht dann br?uchte ich eine Warte- bzw. Pause-Funktion die dann in while-Schleife reinkommt.
Beitrag ge?ndert am 7.08.2006 15:52 von esge -
Es muss meine ich weningstens eine Anweisung drin sein. Also weningstens ein continue in deinem Fall.
-
jetzt siehts so aus:
while ( getchar() != RETURN) continue;
auch wenn ich
continue()
schreibe dann geht es nicht. -
Ah ich habs *blind war*
Du hast RETURN gar nicht definiert. In dem Bsp. war doch folgendes:
#define RETURN '\n'
Wundert mich das er den Code ?berhaupt ?bersetzt hat. -
*blub*
#include <stdio.h> #define RETURN '\n'; main(void) { printf("\nHallo. Wie hei?t du?\n"); char feld[0]={}; char *name; name=&feld[0]; scanf("%s",name); printf("\nHallo %s\n",name); while (getchar() != RETURN) continue(); }
geht irgendwie trotzdem nicht. aber danke dass du mir die ganze zeit hilfst :D -
?hm, "continue" ist keine Funktion. Sondern ein Schl?sselwort. Also weg mit den Klammern. Das ganze d?rfte gar nicht kompilieren...
-
tut es auh nihct. sonst h?tte ich ja kein problem
-
Ich habe mir die Freiheit genommen, das Programm ein wenig umzugestalten:
#include <stdio.h>
// Um nach dem C99-Standard zu programmieren
// definiere ich den Typ des R?ckgabewerts
int main(void)
{
// Reserviert f?r 20 Zeichen (Bytes)
// Speicher im RAM
char feld[20];
// Erstellt einen Zeiger (Pointer) namens "name"
char *name;
// Weist dem Zeiger "name" die Anfangsadresse
// vom Char-Array zu (Alternativ auch name = feld)
name=&feld[0];
printf("\nHallo. Wie hei?t du?\n");
scanf("%s",name);
// Leert den Eingabe-Puffer
// Alternativ zu der while-L?sung
fflush(stdin);
printf("\nHallo %s\n",name);
// Wartet auf eine Eingabe des Benutzers
getchar();
return 0;
}
Btw: Damit Du Dir Dein Wissen nicht aus etlichen C-Tutorials aneignen musst -> http://www.galileocomputing.de/openbook/c_von_a_bis_z/
Beitrag ge?ndert am 7.08.2006 21:07 von compactdisc -
Was haltet ihr vom "Game Maker" von Mark Overmars als Einstieg in die Spieleprogrammierung?
http://www.gamemaker.nl
Beispiel-games, die damit erstellt wurden, findet ihr unter
http://www.gamemaker.nl/games_exe.html
(Dort findet ihr unter anderem auch einen Doom-like 3D-Egoshooter, der mit dem Gamemaker (allerdings mit der Vollversion) erstellt wurde.)
Ich finde, das Ding entlastet doch sehr vom Code-Ballast und f?hrt schnell zu Erfolgserlebnissen. Es ist nicht zu simpel und die Grundz?ge der Objektorientierung lernt man mit dem Teil auch.
Nachdem man ein paar Spiele mit dem Tool gebastelt hat, kann man sich immer noch in andere Programmiersprachen einarbeiten.
Beitrag ge?ndert am 7.08.2006 22:16 von anuehm -
wenn man mal schnell ein spiel haben will dann ist das programm bestimmt nicht schlecht aber ich will sp?ter beruflicher programmierer werden und dann brauch ich nunmal den code.
das ist genauso wie mit html und dreamweaver(ich hasse dreamweaver-benutzer)
und danke nochmal an compactdisc
Beitrag ge?ndert am 8.08.2006 19:09 von esge -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage