Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.11.2014, 16:57

Figur automatisch endlos bewegen lassen - Hilfe beim Tempo !

Hallo,

ich arbeite grade an einem Ascii- Spiel mit C#
Ich will dass mein "Monster" (hier: @) sich in der Konsole automatisch im Viereck bewegt.
Ich hab es auch hinbekommen, nun ist es aber viel zu schnell, wie mach ich es, dass sich das Monster
langsamer bewegt ? Mit dem Befehl Thread Sleep funktioniert es zwar, aber das würde später im gesamten Spiel ja nicht funktionieren.
Benutze Visual Studios 2013

Bitte um Hilfe, bin echt seit Tagen am verzweifeln. hab dutzende Tutorials und Texte gelesen. Ich kriegs aber nicht nicht :dash:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Gegner
{
class Program
{

static void Main(string[] args)
{
int Gegnerx = 10; //GEGNER START
int Gegnery = 10;
while (true)
{
Bewegen(Gegnerx, Gegnery);
}
}

static void Bewegen(int Gegnery, int Gegnerx)
{
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write(" ");


//Gegnerx = Gegnerx + 1; // Gegner oben links
Console.SetCursorPosition(Gegnerx + 1, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx + 1, Gegnery);
Console.Write(" ");


//Gegnery = Gegnery + 1; // oben rechts
Console.SetCursorPosition(Gegnerx + 1, Gegnery + 1);
Console.Write("@");
Console.SetCursorPosition(Gegnerx + 1, Gegnery + 1);
Console.Write(" ");


//Gegnerx = Gegnerx - 1; // unten rechts
Console.SetCursorPosition(Gegnerx, Gegnery + 1);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery + 1);
Console.Write(" ");



//Gegnery = Gegnery - 1; // unten links
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write(" ");

}
}
}

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

07.11.2014, 17:08

Warum soll das später im ganzen Spiel nicht funktionieren?
Eingabe und gleichzeitig etwas in die Konsole schreiben geht nicht. Zumindest nicht soweit ich weiß...

[Edit]

Hmm, vielleicht ja doch.

3

07.11.2014, 17:13

Warum soll das später im ganzen Spiel nicht funktionieren?
Eingabe und gleichzeitig etwas in die Konsole schreiben geht nicht. Zumindest nicht soweit ich weiß...

[Edit]

Hmm, vielleicht ja doch.
also mein Dozent hat mir gesagt, dass es nicht geht

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

07.11.2014, 17:16

Gut wenn du es schon weißt, warum solltest du dann nicht neu zeichnen können indem du den Thread pausierst?

5

07.11.2014, 17:21

Gut wenn du es schon weißt, warum solltest du dann nicht neu zeichnen können indem du den Thread pausierst?
ich weiß jetzt nicht ob ich dich jetzt richtig verstanden habe oder du mich nicht, aber thread sleep wird ja nicht funktionieren

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

07.11.2014, 17:48

Die Bewegungen kannst du doch auch mit einem Timer lösen. Deine Timer stößt dann die jeweiligen Funktionen an.

C#-Quelltext

1
timer.Tick += UpdateWorld


Ob du den Timer selbst umsetzt oder den fertigen von .Net benutzt ist dir überlassen. So musst du nicht irgendwie mit Sleep rum hantieren. Das ganze Programm anzuhalten ist nicht sonderlich schön.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

07.11.2014, 18:06

Die Bewegungen kannst du doch auch mit einem Timer lösen. Deine Timer stößt dann die jeweiligen Funktionen an.

C#-Quelltext

1
timer.Tick += UpdateWorld


Ob du den Timer selbst umsetzt oder den fertigen von .Net benutzt ist dir überlassen. So musst du nicht irgendwie mit Sleep rum hantieren. Das ganze Programm anzuhalten ist nicht sonderlich schön.
und wo setz ich den timer in meinem code ein ?

[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true,
ExternalThreading = true)]
public class Timer : Component, ISupportInitialize

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

07.11.2014, 18:25

Ich dachte an sowas (pseudo):

Quellcode

1
2
3
4
5
6
7
8
9
while(Spiel läuft){

print("Konsolenausgabe 1");
print("Konsolenausgabe 2");
print("Konsolenausgabe 3");

sleep(500); // halbe Sekunde

}

9

07.11.2014, 18:39

Ich dachte an sowas (pseudo):

Quellcode

1
2
3
4
5
6
7
8
9
while(Spiel läuft){

print("Konsolenausgabe 1");
print("Konsolenausgabe 2");
print("Konsolenausgabe 3");

sleep(500); // halbe Sekunde

}

so ? so läuft's aber nicht ;(



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Gegner
{
class Program
{

static void Main(string[] args)
{
int Gegnerx = 10; //GEGNER START
int Gegnery = 10;

while (true)
{
Bewegen(Gegnerx, Gegnery);
}
}

static void Bewegen(int Gegnery, int Gegnerx)
{
while (true)
{
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write(" ");


//Gegnerx = Gegnerx + 1; // Gegner oben links
Console.SetCursorPosition(Gegnerx + 1, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx + 1, Gegnery);
Console.Write(" ");


//Gegnery = Gegnery + 1; // oben rechts
Console.SetCursorPosition(Gegnerx + 1, Gegnery + 1);
Console.Write("@");
Console.SetCursorPosition(Gegnerx + 1, Gegnery + 1);
Console.Write(" ");


//Gegnerx = Gegnerx - 1; // unten rechts
Console.SetCursorPosition(Gegnerx, Gegnery + 1);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery + 1);
Console.Write(" ");


//Gegnery = Gegnery - 1; // unten links
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write("@");
Console.SetCursorPosition(Gegnerx, Gegnery);
Console.Write(" ");

Thread.Sleep(500);
}
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

07.11.2014, 19:01

Ich verstehe dein Problem mit dem Timer nicht ganz.
Hier und hier kannst du ja mal gucken wie du einen Timer einbauen kannst. Ansonsten findet man da bei Google noch einige Seiten mehr. In deinem Mainloop kannst du dann deine Inputs abfragen und speichern und der Timer ruft eine Funktion auf die die Welt updatet. Das heißt hier bewegst du sowohl den Spieler als auch alle Gegner etc. Das wäre zumindest eine Möglichkeit.

edit: Du kannst hier im Forum auch Code Tags benutzen. Der Button mit der Raute ist allgemein für beliebigen Code und dann gibt es noch ein paar spezielle Code Tags für einige Sprachen (C++, C#, HLSL, Tex) speziell für die Sprachen. Dann wird der Code hier auch gehighlightet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige