• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed ASCI-gierka w konsoli, sposoby polepszenia wydajności odświeżania ekranu

Object Storage Arubacloud
0 głosów
172 wizyt
pytanie zadane 9 maja 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 10 maja 2018 przez Jakub 0

Hej, ostatnio udało mi się napisać jak na mój poziom zaawansowania dość ciekawy projekt. Jest to prosta gra do której piszemy/rysujemy poziomy w notatniku. Miał to być tylko prosty program dla ćwiczeń ale jakoś się rozrósł.

Projekt przykładowego poziomu:

Gra:

pewnie po treści wicie w czym jest problem...

 

Oto zasadnicze teraz kwestie programu:

1) main.cpp

#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include "Game.h"
#include "Program.h"

int main() {
	game::GameMap gm("testMap1.m");
	bool e = gameLoop(gm);
	if (e) 
		std::cout << "YOU WIN!" << std::endl;
	else 
		std::cout << "GAME OVER!" << std::endl;

	_getch();
}

2) Program.h

#ifndef PROGRAM_H_
#define PROGRAM_H_
#include "Game.h"

bool gameLoop(game::GameMap& gm);
void cls();

#endif 

3) Program.cpp

#include "Program.h"
#include "Game.h"
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>

///-----------------------------------------------------------------------------

bool gameLoop(game::GameMap& gm) {
	int theEnd{};

	while (true) {
		cls(); //czyścimy ekran
		std::cout << gm; //rysujemy mapę korzystając z zawartych w klasie przeciążeń (ma ona postać płaskiej dynamicznej tablicy odpowiednio wyświetlaną jako prostokąt2D za pośrednictwem metody)

		theEnd = gameEvent(gm);
		if (theEnd == 2 || theEnd == 1) break; //1 to wygrana a 2 to przegrana, natomiast 0 to kontynuacja

		playerControl(gm);
		monstersLogic(gm);        // obie funkcje dotyczą ruchu przeciwników 
		randomMonstersMove(gm);   //
		playerControl(gm);        // funkcji player control użyłem 2 razy, może zawsze to dać jakiś pozytywny efekt ;)
	}

	system("cls");

	if (theEnd == 1)
		return true;
	return false;
}
///---------------------------------------------------------------------------------------

void cls() { //ta funkcja ustawia kursor na współrzędne zerowe ( czyli w moim zamierzeniu czyści ekran )
	COORD cord;
	cord.X = 0;
	cord.Y = 0;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
}

///------------------------------------------------------------------------------------------

Największe znaczenie ma tu oczywiście plik źródłowy: Program.cpp

Myślę że głębiny pliku Game.h i Game.cpp nie mają znaczenia bo same tempo gry i optymalizacje zawartych tam algorytmów nie sprawiają problemów. Oczywiście jak deklaracje klas i definicje metod/funkcji zawartych w tych plikach będą potrzebne to napiszcie.

 

Chociaż użyta przeze mnie własna funkcja o nazwie cls() działa a niebo lepiej niż system("cls") to dalej zwłaszcza na ścianach mapy ( znakach '#' ) widać oznaki odświeżania ekranu, tzn to miganie. Czy da się czyszczenie ekranu jeszcze bardziej usprawnić? A może problem nie jest w czyszczeniu ekranu, może trzeba ustawić pokazywanie się mapy w jakimś timerze ( np 60 razy na sekundę  ) ?

Z tego jak ta gra mi wyszła jestem dość zadowolony, no ale to migane :/

Z góry dziękuje za porady ;)
 

 

 

komentarz zamknięcia: dostałem treściwą odpowiedź

1 odpowiedź

+1 głos
odpowiedź 9 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
wybrane 10 maja 2018 przez Jakub 0
 
Najlepsza

Raczej nie da się podwójnie buforować konsoli, aby uniknąć takiego efektu. Najlepsze co możesz spróbować zrobić, to odświeżać tylko tą część ekranu, która ulega zmianie.

void cls() { //ta funkcja ustawia kursor na współrzędne zerowe ( czyli w moim zamierzeniu czyści ekran )

No patrząc na nazwę tej funkcji nigdy bym się nie domyślił, że zamiast czyścić ekran tylko zmienia położenie kursora.

komentarz 10 maja 2018 przez Jakub 0 Pasjonat (23,120 p.)

Kompletnie nigdzie nie mogę znaleźć informacji jak można czyścić tylko wybrany element konsoli, wszędzie była mowa że trzeba wyczyścić wszystko a powtarzające się elementy rysować za każdym razem od nowa ( ja już tak oczywiście zrobiłem ). Będę wdzięczny za jakiegoś linka bo ja tego znaleźć na śmierć nie widzę.

No patrząc na nazwę tej funkcji nigdy bym się nie domyślił, że zamiast czyścić ekran tylko zmienia położenie kursora.

To ironia, stwierdzenie czy co ... :/ Bo nie rozumiem

1
komentarz 10 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Po prostu przesuwaj kursor konsoli w odpowiednie miejsce i nadpisz tyle, ile potrzebujesz.

To ironia, stwierdzenie czy co ... :/ Bo nie rozumiem

Chodzi mi o to, że nazwa funkcji powinna odzwierciedlać to co robi funkcja. Jak nazywasz funkcję cls, to sugerujesz, że ta funkcja czyści ekran konsoli. Jednak po wywołaniu jej  ekran nie będzie wyczyszczony, tylko kursor będzie ustawiony na początku. Jeśli funkcja resetuje ustawienie kursora, to jej nazwa powinna sugerować, że resetuje ustawienie kursora.

Podobne pytania

0 głosów
0 odpowiedzi 480 wizyt
pytanie zadane 24 sierpnia 2021 w C i C++ przez rafaeru Początkujący (330 p.)
0 głosów
0 odpowiedzi 303 wizyt
0 głosów
0 odpowiedzi 209 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...