[WoT] Steuerung und Game-Variablen



  • Sorry für den Threadtitel, mir ist grade nix eingefallen wie ich es nennen könnte :D.
    Also gut, ich programmiere ein Spiel. Nix besonderes, aber immerhin, ich hab einige Pläne. Momentan läuft es mit der Entwicklung der Mechaniken sehr gut, kleinere Fehler kann ich schnell ausmerzen und alles ist soweit in Butter, dass ich sagen kann, so will ich es haben.

    Jetzt habe ich mehreren Leuten mal den Prototypen zukommen lassen, der keinen richtigen Content bietet, sondern mal die grundlegende Spielmechanik enthält, welche, zugegeben, sehr einfach ist. Das Feedback war von vielen einstimmig: Die Steuerung nervt. Und da is mein erstes Problem :D. Ich weiss 20 Leute sind nicht repräsentativ, aber ich will jetzt nicht daran festhalten wenn die ersten "Tester" schon sagen, dass diese nervt. Was nutzt das Spiel wenns keiner spielen mag..

    Ich glaube ich muss mein Spiel hier ein wenig vorstellen:
    Der Arbeitstitel ist "Night in Space" und es ist sowas wie ein Sidescroller in 2D wo man mit dem Raumschiff hin und herfliegen kann und die Gegner auf einen zukommen. Kennt denke ich jeder vom Spielautomat oder vom C64, Amiga etc. Einfaches, aber erfolgreiches Spielprinzip.
    Wenn man nun einmal nach rechts drückt, bewegt sich das Schiff dauerhaft nach rechts. Drückt man 2x mit doppelter und bei 3x drücken nach rechts 3x so schnell. Drückt man in die entgegensetzte Richtung, wird es wieder langsamer und wenn es wieder mit einfacher Geschwindigkeit fliegt, fliegt es in die andere Richtung. Stößt man gegen die Wand verliert man etwas Hitpoints und wird zurückgeschleudert, sprich fliegt mit gleicher Geschwindigkeit in die entgegengesetzte Richtung. Bremsen geht nicht, das wird später als PowerUp implementiert, welches man dann auch sammeln und aufheben kann für eine Situation wo man es braucht.
    Wer möchte, kann hier mal reinschauen: http://www.fileuploadx.de/742554
    Achja, die Grafiken sind nicht final :D. Das sind nur Platzhalter mit freien Grafiken und Fonts aus dem Netz. Also nicht daran rummeckern. Ich konzentriere mich derzeit nur auf die Programmierung des Spieles, nicht auf Design.

    Ich suche jetzt primär Ideen wie ich die Steuerung verbessern könnte, so dass sie nicht mehr so "nervig" ist. Manche beklagten dass man so oft drücken muss bis man wieder umdreht, andere stießen zu oft gegen die Wand oder Gegner aufgrund der Geschwindigkeit.
    Wie empfindet Ihr als Spieleprogrammierer diese Idee/Steuerung?

    Das andere Problem liegt ein wenig hm in meiner mangelenden Erfahrung. Ist es normal dass man so viele Klassenvariablen anlegen muss für Timing etc? Das läuft mir grade ein wenig aus dem Ruder in meiner Hauptklasse.
    Hier mal die Main-Render-Loop:

    void CGameManager::onRender( u32 delta )
    {
    	switch(m_gamestate)
    	{
    	case ATTACK_COUNTDOWN:
    		{			
    			int countdown = 1;
    			std::stringstream ss;
    			m_begin_countdown_timer += delta;
    
    			if ( m_begin_countdown_timer >= 1500 )
    			{
    				m_begin_countdown--;
    				m_begin_countdown_timer = 0;
    				if ( m_begin_countdown == -1 )
    				{
    					this->setGameState(GAME);
    					break;
    				}
    			}
    			if ( m_begin_countdown != 0 )
    			{
    				ss << m_begin_countdown;
    			}
    			else
    			{
    				ss << " F I G H T ";
    			}
    
    			m_background.renderObject();
    			m_player_ship->renderObject();
    			NLVector2f vec(m_font_big->getXAdvance(ss.str().c_str()), m_font_big->getHeight());
    			m_font_big->renderObject(ss.str().c_str(), GetCenterCoords(vec));
    			break;
    
    		}
    	case GAME:
    		{
    		   /************************************************************************
    			* Rendering BackGround
    			************************************************************************/
    			m_background.renderObject();	
    
    			m_corona_flash_timer += delta;
    			if ( m_corona_flash )
    			{
    				m_corona.renderObject();
    
    				if ( m_corona_flash_timer >= 2500 )
    				{
    					m_corona_flash_timer = 0;
    				}
    
    				m_corona_flash_counter++;
    				if (  m_corona_flash_counter == 3 )
    				{
    					m_corona_flash = false;
    					m_corona_flash_counter = 0;
    				}
    			}			
    
    		   /************************************************************************
    			* Rendering Spaceship
    			************************************************************************/
    			m_player_ship->render();
    			m_player_ship->update(delta);
    
    		   /************************************************************************
    			* Spawning Enemies
    			************************************************************************/
    			m_enemy_time_counter += delta;
    			if ( m_enemy_time_counter >= 1000 )
    			{
    				if ( m_enemy_list.size() <= 100 )
    				{
    					CEnemy *e = new CEnemy(m_enemy_config);
    					m_enemy_list.push_back(e);
    				}
    				m_enemy_time_counter = 0;
    			}
    
    		   /************************************************************************
    			* Rendering Enemies and testing shots.
    			************************************************************************/
    			for ( TEnemyList::iterator it = m_enemy_list.begin(); it != m_enemy_list.end(); ++it)
    			{
    				CEnemy* e = *it;
    				e->renderObject();
    				e->update(delta, m_player_ship);
    
    				if (m_player_ship->intersects(*e))
    				{
    					m_player_ship->move(STOP, STOP);
    					m_player_ship->setPosition(20,20);
    					this->notifyPlayerCollision(COLLISION_ENEMY);
    				}
    
    				// Testing if our shots have killed the enemy.
    				CSpaceShip::TShotsList& shots = m_player_ship->getShots();
    				CSpaceShip::TShotsList::iterator shot_it= shots.begin();
    				for ( shot_it; shot_it != shots.end(); shot_it++ )
    				{
    					CIWeapon* w = *shot_it;
    					if ( e->intersects(*w) )
    					{
    						m_player_ship->removeShot(shot_it);
    						e->setPosition(-500, 0);
    						m_player.Score += m_enemy_config.Points;
    						break;
    					}
    				}
    				if ( e->getPosition().x() <=  -64 )
    				{
    					it = m_enemy_list.erase(it);
    					if ( it == m_enemy_list.end() ) break;
    					delete e;
    				}
    			}
    
    			/************************************************************************/
    			/* Rendering HUD
    			/************************************************************************/
    			m_hud.renderObject();
    			break;
    		}
    	case CREDITS:
    		{
    			if ( m_credits.hasEnded() )
    			{				
    				m_credits.stop();
    				m_credits.free();
    				this->setGameState(MENU);
    			}
    			else
    			{
    				m_credits.renderObject();
    				m_credits.update(delta);
    			}			
    			break;
    		}
    	case MENU:
    		{
    			m_menu.renderObject();
    			break;
    		}
    	}	
    }
    

    Man braucht für alles iwie nen Timer und der muss auch angelegt werden, weil man ja die unterschiedlich zurücksetzen muss wenn man unterschiedliche Werte will. 🙂 Würde da mal gerne von eurer Erfahrung profitieren.
    Vielen Dank fürs Lesen dieser Wand und ich freue mich auf Kommentare.
    rya.



  • Ist die Steuerung ein "Feature" oder nur da weil dir nix besseres einfällt? Einmaldrücken um Geschwindigkeitsstufen zu wechseln ist schlecht, weil es (ich nehm einfach mal das englische Wort weil ich keine passende deutsche Übersetzung finden kann) "unresponsive" ist. Das heisst, es herrscht keine merkbare Interaktion ("Feedback") zwischen dem Spieler und dem, was sich auf dem Bildschirm bewegt (kurz: Der Spieler fühlt sich nicht "im Spiel drinnen" sondern fühlt sich eher so als würde er dem Spiel zuguggen und nur bestimmen wie es abläuft - was bei actionlastigen Games generell sehr schlecht ist). Daher wäre meine erste Empfehlung einfach das Steuern direkt zu machen und das Beschleunigen auf eine Extrataste zu legen.

    Wenn du die Steuerung aber so beibehalten willst, dann mach es wenigstens so, dass das Beschleunigen stufenlos (bis zu nem Maximal- und Minimalwert) funktioniert, in beide Richtungen (also so, dass der Spieler den Finger nicht von dem Tastaturknopf heben muss und neu drücken muss, um eine Geschwindigkeitsänderung zu erreichen. So, dass der Spieler gedrückt halten kann und sich die Geschwindigkeit ändert).


Anmelden zum Antworten