Spieleentwicklung - Fragen und Co.

mrboring

Grünschnabel
Aloha =)
Ich wollte hier mal nach langer Suche um Hilfe beten.
Vorab: Ja ich habe gesucht, ja wirklich, ja auch hier, aber nichts was ich entdeckt habe konnte meine Fragen zufriedenstellend beantworten. Soweit ich das einschätzen kann gibt es zu diesem Thema sehr viele Threads oftmals von irgendwelchen "Anfängern" die gleich hochwertige 3D Spiele produzieren wollen, so einer bin ich nicht.

Zunächst zu meiner Person (ich glaube Infos zu mir helfen die Fragen schneller und gezielter zu beantworten):
Ich habe ein Semester C ein Semester C++ gelernt und mir jetzt in den Ferien ein Buch zu C# zugelegt und das durchgearbeitet.
Grundlagen in allen Sprachen sind gelegt, Objektorientierung ist mir nicht fremd.
Ich möchte in der Freizeit Spiele entwickeln und diese nach dem ich genug geübt und experimentiert habe u.U. für ein Entgeld anbieten o.ä. also in "ferner" Zukunft sollte also schon der Profit stehen. Profit und nicht das große Geld halt nur ein bisschen um für die geleistete Arbeit entlohnt zu werden.

Ich suche
a) ein Programm/Entwicklungsoberfläche mit der man zunächst 2DSpiele entwickeln kann am besten auch 3D Spiele (halt für die Zukunft)
b) dazu ein BUCH einfach weil ich damit besser arbeiten kann

Was ich bisher entdeckt habe ist Blender, Unity3d, und die Unreal Engine alles schön und gut aber ich finde keine guten Bücher und es ist glaube ich für den Einstieg etwas happig korrigiert mich wenn ich falsch liege.
XNA würde glaube ich in die richtige Richtung gehen aber wenn ich die Wahl habe würde ich lieber in C/C++ schreiben als in C#.



Am besten wäre ein Buch (wenn es nicht anders geht auch ein Online Tutorial) was mir nicht nur sagt wie ich in Blender schöne Charaktere bastel sie zum leuchten bringe und vllt hüpfen lasse sondern auch wo der Zusammenhang zum eigentlich Programmieren steckt ich finde immer nur Tutorials in denen ich a) Male/Zeichne/Modelliere ODER b) in eine Programmiersprache eingeführt werde aber nicht wie so ein Spiel insgesamt gebaut wird halt das große ganze mal gezeigt wird.

Ich meine mein C# Buch hat mit mir ne Tetris Variante Gebaut in dem Panels die Steine sind aber es sieht kacke aus und ich sehe einfach nicht den Zusammenhang zu dem eigentlichen modelieren.

Mir ist eigentlich egal ob die Spiele auf iOS laufen (Thema Profit) Flash Spiele werden (Quasi minigames fürn Browser) oder halt richtige Windows Games wobei ich wenn ich mich entscheiden MÜSSTE für die Flash Spiele entscheiden würde.
Ich weiß halt auch nicht ob völlig unterschiedliche Sprachen gebraucht werden Java, Jscript, Phyton, C oder wie sie nicht heißen ich habe auch kein Problem was neues zu lernen nur ich will endlich das Ganze sehen verstehen und "machen" und nicht solch Übungen wie "Speichern sie 30Temperaturen in einem 17246Dimensionalen Array und dann geben sie den Durchnitt aus" sondern schon etwas das mich essentiell in der Spiele Entwicklung weiterbringt.

Vielen Dank schonmal für die Antworten
(sollte es eine Edit Funktion geben werde ich die Form, rechtschreibung, und den inhalt dieses posts noch anpassen)
 
Für den Anfang empfehle ich Dir Spieleklassiker nachzuprogrammieren. Ein eigenes Tetris mit 2D Grafik funktionen, Pacman, SpaceInvaders... etc.
Das erfordert schon einiges an Zeit und übt gleichzeitig den Aufbau von Spielen.
Ich habe in Java mich schon ein wenig daran versucht und dabei festgestellt, wie schnell so ein kleines Projekt doch an Umfang gewinnt. Bevor du Dich an 3D wagst, solltest du ersteinmal 1-2 Spiele in 2D programmieren, dazu reicht auch ein simples Grafikbearbeitungsprogramm wie Paint.NET oder GIMP.
 
Ich würde das ja gerne nachprogrammieren aber wie?
Sagen wir es ich bestehe auf c++ sagen wir ich habe mir mit gimp ne pacman.jpg gemalt und nu? ich habe bisher immer immer immer nur Konsolenanwendungen gebastelt und alles darüber hinaus fehlt einfach, mir fehlt dieser eine Schritt....
Also dieses "Wie" binde ich ne jpg datei ein wie bewege ich sie blah
 
Es gibt verschiedene Multimediabibliotheken, z.B. SFML. http://www.sfml-dev.org/
Die bieten Funktionen wie Einblenden einer Grafik, Sound abspielen, Text darstellen etc.
Es gibt einige sehr gute Seiten mit SDL Tutorials, die einen Einstieg in die Programmierung von 2D Spielen bieten.
z.B. http://lazyfoo.net/SDL_tutorials/index.php
Wikipedia hat auch ein paar gute Seiten zu Spielen.
Und für viele Klassiker gibt es auch Codebeispiele im Netz.
 
In Java zum Beispiel ist das sehr einfach gehalten. Es gibt dort simple funktionen wie z.B. drawImage(). Um es zu bewegen musst du KeyboardEvents (gilt nicht nur für Java) abfangen, die Tastencodes vergleichen und dann die Position des Objektes verändern.
Java:
// Beispiel Pseudocode
Player p = new Player(150, 140);

if( isKeyDown('W') )
  p.moveUp();
if( isKeyDown('A') )
  p.moveLeft();
if( isKeyDown('S') )
  p.moveDown();
if( isKeyDown('D') )
  p.moveRight();


// ...
class Player{
  Location loc;
  int velocity = 2;
  public Player(int x, int y){
    loc = new Location(x, y);
  }
  public void moveUp(){
    loc.setY(loc.getY()-velocity));
  }
  public void moveLeft(){
    loc.setX(loc.getX()-velocity));
  }
  public void moveDown(){
    loc.setY(loc.getY()+velocity);
  }
  public void moveRight(){
    loc.setX(loc.getX()+velocity);
  }
  public void draw(Graphics g){
    g.drawImage("MeinSpieler.png", loc.getX(), loc.getY());
  }
}
 
Der Code ist wirklich sehr einfach sowohl vom Syntax als auch vom Verständnis vllt sollte ich mir Java vllt mal genauer anschauen
dazu hätte ich dann allerdings Fragen wieweit komme ich mit Java? ich meine C/C++ sind laut meiner Dozentin um einiges "mächtiger" als Java wie sieht dies bzgl. der Spieleentwicklung aus? welche Plattformen sind Java kompatibel also für welche Geräte könnte ich diese Spiele anbieten?

Achja und vllt iwelche Buchtipps (nicht nur zum Einstieg in Java sondern auch bzgl. der Spieleerstellung)

und sollte Java mir zusprechen hätte ich nun eine Sprache aber dann fehlt mir die Umgebung zum rummodellieren GIMP wird von allen so hoch angepriesen hat da jmd vllt auch einen Buchtipp und diesmal insbesonder ausschließlich für Spiele (also Characterdesign Umgebung ec.)

Vielen Dank für die bisherigen Antworten und die die noch kommen =)
 
Betriebssysteme (Geräte?) bei Java: Ungefähr alle wichtigen.
Mit C/C++ schaut es ähnlich aus, aber:
Multiplattformprogramme sind für den Programmierer in C/C++ aufwändiger als in Java.

Der Grund für C/C++: Javaprogramme werden langsamer ausgeführt.
Bei "Normalprogrammen" fällt das nicht so ins Gewicht,
aber größere 3D-Spiele lasten den Computer ziemlich aus.

Hat man ein Spiel in C, dass der eigene Computer grad noch schafft,
müsste man es in Java (vor allem grafikmäßig) abspecken, damit es auch ohne Stocken geht.
 
Ich habe mir damals das Buch "Java 6 Programmierung" von Alexander Schunk gekauft. Bin damit sehr zufrieden, alle wichtigen Sachen werden abgehandelt. Mit Programmierkenntnissen findet man sich sehr schnell in Java rein.
Den Pseudocode oben solltest du nicht wörtlich nehmen, ein wenig komplizierter wird es schon.

Ich habe mir mal ein kleines Towerdefence Spiel geschrieben, eine Einheit die durchrennt hatte folgenden Code:
Java:
package game.objects;

import game.engine.GameEngine;
import game.engine.GameProcessor;
import game.math.Point2D;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;

public class Creep extends Unit{	
	int wave;
	public Creep(GameEngine e, Path p, int wave){
		engine 			= e;
		path 			= new Path();
		path.waypoints 	= listCopy(p.waypoints);		
		bounds			= new Rectangle((int)p.waypoints.get(0).x, (int)p.waypoints.get(0).y, 15, 15);
		type 			= TYPE_CREEP;
		this.wave		= wave;
		stats[STAT_VELOCITY] 	= new double[] {1.0, 1.0, 2.0};
		stats[STAT_HEALTH] 		= new double[] {wave*20, wave*20, wave*20};
		stats[STAT_REGHEALTH]	= new double[]{ wave/10, wave/10, wave/10};
		stats[STAT_REGSHIELD]	= new double[]{ wave/20, wave/20, wave/20};
		stats[STAT_SHIELD]		= new double[]{ wave*2, wave*2, wave*2};
	}
	public void action(int time){
		// Schild Regen.
		if( stats[STAT_SHIELD][STAT_CURRENT] > 0 && stats[STAT_SHIELD][STAT_CURRENT] < stats[STAT_SHIELD][STAT_NORMAL] ){
			stats[STAT_SHIELD][STAT_CURRENT] = stats[STAT_SHIELD][STAT_CURRENT]+stats[STAT_REGSHIELD][STAT_CURRENT];
			if( stats[STAT_SHIELD][STAT_CURRENT] > stats[STAT_SHIELD][STAT_NORMAL] ){
				stats[STAT_SHIELD][STAT_CURRENT] = stats[STAT_SHIELD][STAT_NORMAL];
			}
		}
		// HP Regen.
		if( stats[STAT_HEALTH][STAT_CURRENT] < stats[STAT_HEALTH][STAT_NORMAL] ){
			stats[STAT_HEALTH][STAT_CURRENT] = stats[STAT_HEALTH][STAT_CURRENT]+stats[STAT_REGHEALTH][STAT_CURRENT];
			if( stats[STAT_HEALTH][STAT_CURRENT] > stats[STAT_HEALTH][STAT_NORMAL] ){
				stats[STAT_HEALTH][STAT_CURRENT] = stats[STAT_HEALTH][STAT_NORMAL];
			}
		}
		move();
	}
	public void move(){
		if( path.index+1 == path.waypoints.size() ){
			delete();
			GameProcessor.lives--;
			return;
		}
		Point2D p1 = path.current();
		Point2D p2 = path.next();				
		if( p1.x == p2.x ){
			 if( p1.y < p2.y ){
				 bounds.y += stats[STAT_VELOCITY][STAT_CURRENT];
			 }
			 else{
				 bounds.y -= stats[STAT_VELOCITY][STAT_CURRENT];
			 }
		}
		else if( p1.y == p2.y ){
			if( p1.x < p2.x ){
				bounds.x += stats[STAT_VELOCITY][STAT_CURRENT];
			}
			else{
				bounds.x -= stats[STAT_VELOCITY][STAT_CURRENT];
			}
		}
		if( bounds.x == p2.x && bounds.y == p2.y ){
			path.index++;
		}
		
	}
	public void receiveDamage(double damage){		
		if( stats[STAT_SHIELD][STAT_CURRENT] > 0 ){			
			stats[STAT_SHIELD][STAT_CURRENT] -= damage;
			if( stats[STAT_SHIELD][STAT_CURRENT] < 0 ){
				stats[STAT_HEALTH][STAT_CURRENT] += stats[STAT_SHIELD][STAT_CURRENT];
				stats[STAT_SHIELD][STAT_CURRENT] = 0;
			}
			
		}
		else{
			stats[STAT_HEALTH][STAT_CURRENT] -= damage;			
			if( stats[STAT_HEALTH][STAT_CURRENT] <= 0 )
				kill();
		}		
	}
	
	public void kill(){
		GameProcessor.funds += (int)Math.floor(wave/3)+1;
		delete();
	}
	
	public void delete(){
		engine.remove(this);
	}
	
	private ArrayList<Point2D> listCopy(ArrayList<Point2D> x){
		ArrayList<Point2D> y = new ArrayList<Point2D>();
		for( int i = 0; i < x.size(); i++ ){
			y.add(new Point2D(x.get(i)));
		}
		return y;
	}
	
	public void paint(Graphics g){
		int c1 = (int) (255 - 255 * stats[STAT_HEALTH][STAT_CURRENT]/stats[STAT_HEALTH][STAT_NORMAL]);
		if( c1 < 0 ) c1 = 0;
		g.setColor(new Color(c1, c1, c1));		
		g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
		if( stats[STAT_SHIELD][STAT_CURRENT] > 0 ){
			c1 = (int) (255 - 255 * stats[STAT_SHIELD][STAT_CURRENT]/stats[STAT_SHIELD][STAT_NORMAL]);
			if( c1 < 0 || c1 > 255) c1 = 0;
			int c2 = (int) (255 * stats[STAT_SHIELD][STAT_CURRENT]/stats[STAT_SHIELD][STAT_NORMAL]);
			if( c2 > 255 || c2 < 0) c2 = 255;
			g.setColor(new Color(c1, c2, 45));
			g.drawOval(bounds.x-6, bounds.y-6, bounds.width+12, bounds.height+12);
		}
	}
}

Mit Java kannst du außerdem APPs für Android entwickeln.

Ein spezielles Spielebuch für Java kenne ich gerade nicht. Wenn du dich erst mit den Grafikfunktionen vertraut gemacht hast, ist der Rest im Prinzip reine Logik.
 
Zurück