Skocz do zawartości
  • 0
nowy_user

Drawowanie tekstu z notatnika

Pytanie

Hej , jak zrobić w gm studio drawowanie całego tekstu z danego pliku w notatniku? Mam np. jakiś tekst w notatniku i chce go jota w jotę drawować w gmie. Czy nasz program ma taką funkcję?

 

Pozdrawiam,

Nowy_user!

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

23 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Tak wiem, ale co mam wpisać dalej ? draw_text(0,0, string(....i co tutaj? , jeśli wpiszę nazwę pliku.txt, to niestety nie wyświetla się) )

 

EDIT

 

Próbowałem też w step:

 

GML
ini_open(string(id))

text=ini_read_string("","","")

ini_close()

 

i w evencie draw:

GML
draw_text(0,0,text)

 

but nope, it's still not working. :(

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Musisz otworzyć plik za pomocą get_open_filename(filter, fname); a następnie otworzyć plik jako plik tekstowy. Potem musisz załadować w pętli while cały plik do stringa. Wygląda to tak:

 

GML
var Plik = get_open_filename("Plik tekstowy|*.txt",""); //Wybierz plik tekstowy i zapisz jego ID(takzwany handle - uchwyt) do zmiennej Plik

if Plik!=""{//Jezeli wybrano plik czyli uchwyt nie jest pusty

var PlikTekstowy = file_text_open_read(Plik); //Otworz plik "Plik" i zapisz ID otwartego pliku do zmiennej "PlikTekstowy"

//Od teraz bedziemy sie poslugiwac uchwytem otwartego pliku czyli PlikTekstowy aby korzystac z zawartosci otwartego pliku.

ZawartoscPliku = ""; //To zmienna typu string w ktorej bedziemy zapisywac zawartosc pliku

while(!file_text_eof(PlikTekstowy)){ //Dopoki nie dojdziemy do konca pliku tekstowego

ZawartoscPliku += file_text_readln(PlikTekstowy); //Dopisz do zmiennej "ZawartoscPliku" linie tekstu z "PlikTekstowy"

}

file_text_close(PlikTekstowy); //Zamknij otwarty plik. Bardzo wazne zeby zamykac pliki ktorych juz nie potrzeba uzywac, bo moze byc tylko 32 otwarte na raz.

}

 

//Calosc dziala tak: W petli while sprawdzamy czy doszlismy do konca pliku. Jezeli nie to wczytaj linijke tekstu. Teraz znowu sprawdz czy nie doszlismy do konca tekstu. W ten sposob bedzie wczytywac plik linia po lini az dojdzie do konca pliku. Calosc jest zapisywana do zmiennej. To te zmienna masz wyswietlic na ekranie.

//Zmienna mozesz wyswietlic z uzyciem np. draw_text(x,y,ZawartoscPliku);</span>

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dziękuję za wyczerpującą wypowiedź. Kod jest super, ale jest problem, jeśli wstawiam go gdzie indziej niż w create, wyskakuje mi błąd, że zmienne nie są zadeklarowane. To bardzo dziwne, bo zmienne var są lokalne i nie potrzebują deklaracji w Create. Muszę nad tym posiedzieć żeby zrozumieć w czym tkwi błąd.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Jak wygląda error który dostajesz tak dokładnie? Której zmiennej nie odnajduje?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Generalnie to mój problem jest chyba nieco głębszy,

 

Przede wszystkim bardziej chciałem aby kliknięciem lewym przyciskiem myszy na dany obiekt , utworzył się i włączył plik tekstowy o nazwie takiej jakie jest id obiektu, tak aby każdy obiekt miał swój plik txt. (zrobiłem to za pomocą Execute Shell) i to fajnie działa. Teraz chciałem zrobić dodatkową rzecz tzn. klikając prawy przycisk myszy na dany obiekt chciałbym aby tekst z pliku tekstowego pojawił się na obiekcie ( obiekt ma kształt kwadratu- ramki, właściwie jest to takie pole tekstowe) , czyli chce aby już bez okna dialogowego, odczytał plik tekstowy, który ma w nazwie id obiektu, i zaktualizował napis na obiekcie na taki sam jaki jest w notatniku. I tu zaczynają się schody.

 

Musiałem zamienić zmienne var na zwykłe zmienne, bo inaczej wyskakiwał mi błąd, zadeklarowałem je w create i dostosowałem nieco kod na następujący:

GML
if file_exists(working_directory + "\"+string(id)+".txt")

{

Plik = file_text_open_read(working_directory + "\"+string(id)+".txt");

while(file_text_eof(Plik)){

ZawartoscPliku += file_text_readln(Plik);

}

file_text_close(Plik);

}

 

Następnie proboje drawować ZawartoscPliku, ale niestety nie wyświetla mi tekstu tego , który jest w pliku w notatniku .

 

 

A błąd o który pytasz no chyba teraz zaczaiłem, chodziło o zmienną ZawartoscPliku , to nie jest zmienna tymczasowa.

 

 

EDIT: Ale tak teraz jeszcze raz patrzę to nawet jak używam twojego kodu , i wszystko daje w create to nie bardzo mi się ten tekst z notatnika wyswietla (pomimo że mam ustawioną komendę draw_text(x,y,ZawartoscPliku) .... już się trochę zamotałem, chyba muszę trochę odpocząć od GMa ;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Jest błąd w tym co podałem

zamiast while(file_text_eof(Plik)){

daj

while(!file_text_eof(Plik)){

(Dla potomnych juz poprawione w oryginale)

 

Edit: Wybacz ten błąd, kod robiłem na sucho bo mi się śpieszyło.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dziękuję za odpowiedź, wszystko działa cacy nawet wtedy , gdy ustawiłem sobie, aby zamiast okna dialogowego z wyborem pliku tekstowego, odczytywało mi odrazu dany plik ( plik który ma w nazwie id obiektu). I nawet wszystko działało cacy, dopóty dopóki pliki znajdowały się w "working directory", kod wtedy wyglądał tak:

GML
var PlikTekstowy = file_text_open_read(working_directory + string(id)+".txt");; //Otworz plik "Plik" i zapisz ID otwartego pliku do zmiennej "PlikTekstowy"

//Od teraz bedziemy sie poslugiwac uchwytem otwartego pliku czyli PlikTekstowy aby korzystac z zawartosci otwartego pliku.

ZawartoscPliku = ""; //To zmienna typu string w ktorej bedziemy zapisywac zawartosc pliku

while(!file_text_eof(PlikTekstowy)){ //Dopoki nie dojdziemy do konca pliku tekstowego

ZawartoscPliku += file_text_readln(PlikTekstowy); //Dopisz do zmiennej "ZawartoscPliku" linie tekstu z "PlikTekstowy"

}

file_text_close(PlikTekstowy); //Zamknij otwarty plik. Bardzo wazne zeby zamykac pliki ktorych juz nie potrzeba uzywac, bo moze byc tylko 32 otwarte na raz

 

Nawet nie wiecie jak bardzo się ucieszyłem, że po tylko godzinach walki wreszcie to zadziałało.

 

Niestety....

 

Gdy tylko chciałem zmienić ścieżkę z working directory na :C:\Users\User\Desktop\folder\"+ string(id) +"txt" < gdzie byłem na sto procent pewien że ten plik tam jest , to pojawiał się ten wkurzający błąd :

File is not opened for reading.

at gml_Object_o_square_KeyPressed_D_1 (line 8) - while(!file_text_eof(PlikTekstowy))

 

Na początku myślałem, że Gamemaker wogóle nie może operować na innych folderach niż working directory, ale to mylne założenie, bo np.jestem w stanie za pomocą execute shell utworzyć plik notatnikowy w jakimkolwiek tylko folderze sobie zapragnę.

 

Dziwne to, doprawdy dziwne...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Bo nie może, masz w dokumentacji podane foldery na których możesz operować. Execute shell to nie to samo co funkcje file_

 

Edit: Jaka wersja GM?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Gmstudio 1.4 proffesional

 

Niestety mam problem z tym wszystkim. Problem wynika z tego , że chcę stworzyć prosty program polegający na następującej rzeczy:

 

Program z kilkoma lub kilkunastoma kwadratami, które są w zasadzie polami tekstowymi. Po kliknięciu lewym przyciskiem myszy na dany kwadrat, chcę aby:

 

Program otworzył ( a wcześniej utworzył, jeśli go jeszcze nie ma) plik tekstowy, który ma w nazwie to samo id co dany obiekt. Następnie mogę sobie uzupełnić notatnik , zapisać wyłączyć, i chcę aby zaktualizował się tekst w polu tekstowym, w sensie takim , żeby było to samo w tym kwadracie co w notatniku

 

Aby to zrobić , korzystam z Execute Shell. Niestety następuje zgrzyt ponieważ wygląda na to , że Execute Shell co innego uważa za working directory:

 

taki kod:

GML
ExecuteShell("notepad.exe" + working_directory + string(id)+".txt",0);
nie tworzy danego pliku w
C:\Users\User\AppData\Local\folder_z_grą
a zamiast tego tworzy mi jakiś dziwny folder gmtt60107, spójrzcie na tę ścieżkę :
C:\Users\User\AppData\Local\gm_ttt_60107\gm_ttt_83194

 

I przez to wszystko się rypie.

 

Taka prosta sprawa , a tak mi psuje krew... do Gma trzeba mieć cierpliwość, oj trzeba...

 

---edit---

Tak BTW, to oczywiście wolałbym nie bawić się w żadne notatniki itp, tylko lepiej byłoby po prostu stworzyć taką opcję, że jak klikam na ten kwadrat to mogę sobie w nim od razu pisać itd, ale stworzenie funkcjonalnego programu typu text_input, z możliwością kopiowania i wklejania tekstu, z możliwością przechodzenia pomiędzy literkami za pomocą strzałek klawiatury, możliwość korzystania z takich kombinacji klawiszy jak ctrl+end itp, to robota na długie zimowe wieczory, a i tak nie mam pewności że w gmie jest to wykonalne. Dlatego próbuję to obejść korzystając z Execute Shell , ale jak sami widzicie , tu piętrzą się z kolei inne problemy.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Po pierwsze primo od kiedy można używać execute shell w studio?

Po drugie working_directory to folder w którym jest plik exe z grą i na 100% ten co podaje jest ok.

Po trzecie możesz użyć jakiegoś dll do obsługi plików

Po czwarte napisanie "text input" nie jest trudne.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Po czwarte napisanie "text input" nie jest trudne.

 

Z opcjami takimi jak zaznaczanie, wklejanie tekstu itd? To naprawdę wymaga olbrzymiej wiedzy gml, nic dziwnego że w markecie taki program kosztuje prawie 70 zł.

 

 

 

A co do Execute Shell to tak, używam w Gm Studio, ale może on nie jest rzeczywiście do niego przystosowany i stąd te kwiatki.

 

 

---edit---

 

GML
Po drugie working_directory to folder w którym jest plik exe z grą i na 100% ten co podaje jest ok.

To byłoby piękne, niestety wraz z końcem ery gm 8.1 to się zmieniło, i teraz working_directory oznacza folder w jakiejś wariackiej lokalizacji C:\Users\User\AppData\Local\

Wszystko dlatego, że nasi kochani twórcy naszego ulubionego programu wymyślili sobie, że gry w GMie będą sandboxowane. I co poradzisz, tak sobie wymyślili i na nic protesty użytkowników.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Tylko na czas jak uruchamiamy grę z poziomu GMa, kompiluje ją do folderu tymczasowego.

Jak będę miał chwilę to napisze te text input, przynajmniej sobie gml przypomnę ;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Tylko na czas jak uruchamiamy grę z poziomu GMa, kompiluje ją do folderu tymczasowego.

Nie jestem ekspertem, ale chyba nie do końca się tak dzieje. Nawet jeśli wyeksportujemy sobie programik do pliku executable, to wciąż working direcotry to :

C:\Users\User\AppData\Local\folder_z_grą

 

Jak będę miał chwilę to napisze te text input, przynajmniej sobie gml przypomnę smile2.gif

Z jednej strony chciałbym cię do tego jak najbardziej zachęcać - ze swoich egoistycznych względów- ale moje dobre serce bierze tu górę więc napiszę Ci tak: To nie jest takie proste jak się zdaje, zrobienie text_input z tymi funkcjonalnościami o których wspomniałem wymaga naprawdę dużej wiedzy, i nie jeden raz przeklniesz GMa oraz siebie, że się za to zabrałeś. Wierz mi, wiem co mówię, bo sam myślałem przed tym zadaniem , że będzie to kaszka z mlekiem , a nabawiłem się sporo frustracji. Lepiej zastanów się dwa razy, zanim sie za to zabierzesz. Żeby nie było, że nie ostrzegałem. :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Pobrałem to rozszerzenie i zaimportowałem, ale niestety, przy próbie wywołania pliku tekstowego za pomocą kodu:

GML
file_text_open_read("C:\Users\User\Desktop\telesalesmanago\100003.txt"

 

wyskakuje mi błąd:

 

File is not opened for reading.

at gml_Object_o_square_KeyPressed_D_1 (line 8)

 

Doprawdy, ludzie którzy zajmują się GMem zawodowo, to najbardziej cierpliwi ludzie na świecie :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dostajesz dziwny folder dla GMa ponieważ testujesz przez RUN GAME.

Gdybyś skompilował grę ścieżka byłaby normalna i prowadziłą do appdata/ROAMING lub appdata/LOCAL

 

@@EdiePL - On używa execute shell z rozszerzenia, dlatego ma.

 

Co do GMFileSystem, jest ono ździebko nieaktualne więc trzeba ręcznie je naprawić aby działało.

 

 

@UP

 

Musisz użyć funkcji z GMFileSystem nie wbudowanych

Aby użyć GMFIleSystem dopisz FS_ przed nazwą funkcji, czyli zamiast

GML
file_text_open_read("C:\Users\User\Desktop\telesalesmanago\100003.txt")

zró

GML
FS_file_text_open_read("C:\Users\User\Desktop\telesalesmanago\100003.txt")

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Niestety używam tego kodu

 

FS_file_text_open_read("C:\Users\User\Desktop\telesalesmanago\100003.txt")

 

i błąd jest ten sam

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Otwierasz plik w trybie tylko do odczytu, więc jeżeli nie istnieje nie zostaje on stworzony. Sprawdź czy wartość zwrócona przez te funkcje nie wynosi -1. Jeżeli tak to plik po prostu nie istnieje.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Pobierz i dodaj do projektu, ogólnie jest to dll od Microsoft C++ Redistributable Package

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Tak zrobie, ale dziwne jest to że jeszcze przed chwilą wszystko mi działało.Cóż, dziś GMStudio dał mi cenną lekcje kontroli nad swoimi emocjami i nerwami. Zuchwałe GMStudio myślało , że poddam się po kilku frustrujących momentach, ale ono tak naprawdę nie wie z kim zadarło ;) Zrobię tak jak napisałeś, i wracam do walki !

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×