Понедельник, 11 Ноября 2024, 03:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 8
  • 1
  • 2
  • 3
  • 7
  • 8
  • »
Результаты поиска
minecrafter2Дата: Суббота, 01 Июля 2023, 00:33 | Сообщение # 1 | Тема: Простая змейка на Bevy
участник
Сейчас нет на сайте
Цитата TLT ()
Bevy - движок очень перспективный, а главное - он регулярно обновляется.


Согласен. Недостатки (совершенно нормальное явление для молодого проекта) которые я упоминал выше имеют далеко не критичный характер, я просто старался не создать ложное впечатление о движке как "ультра убийца Unity\UE".

Движок вправду очень интересный из за можно сказать популяризации ECS подхода и правда очень активно разрабатывается. Сообщество тоже очень активно.


Майнкрафт - лучшая игра в мире
minecrafter2Дата: Воскресенье, 25 Июня 2023, 19:48 | Сообщение # 2 | Тема: Простая змейка на Bevy
участник
Сейчас нет на сайте
Bevy молодой игровой движок общего назначения который предоставляет ECS логику для создания игровых сценариев. Основное отличие от ООП подхода как раз в отсутствии самого понятия "объект", вместо работает структура из Entity (сущности) Component (компоненты) и Systems (системы) (а так же ещё Resources, но их в аббревиатуру по какой-то причине не включают). Так же стоит отметить что ECS не ноу-хау Bevy, а в общем-то довольно известная технология. К примеру года 3 назад Unity предприняла попытку создать альтернативную логику движка на ECS.

Так что же, перейдём к змейке. И самое главное забываем про стандартный ООП подход и стараемся переключится на ECS логику (по началу может быть очень сложно).

Для начала настройки рабочего окружения.

Добавляем Bevy к проекту:
Код
cargo add bevy


Так как вы уже должны быть минимально знакомы с Rust'ом вы знаете какие у него долгие компиляция так что необходимо добавить пару оптимизаций что бы в результате наш .toml файл выглядел так:
Код
// ...
[dependencies]
bevy = "0.10.1"
rand = "0.8.5"

[profile.dev]
opt-level = 1

[profile.dev.package."*"]
opt-level = 3


И так же включить доп. функцию динамического линкера что бы наша конфигурация запуска выглядела таким образом:


После таких настроек нажимаем кнопку build и ждём компиляции. Имейте ввиду это может занять довольно приличное время (около 10 -+3 минут). Зато последующие запуски проекта будут в течении нескольких секунд.

Базовая настройка приложения

Для использования базовых функци движка необходимо использовать указать:
Код
use bevy::prelude::*;

Остальные же импорты сама IDE предложит.

Самый корень Bevy приложения это App. С помощью которого мы добавляем Системы. Системы это обычные функции Rust. Давайте добавить встроенную системы close_on_esc что по нажатию на соответствующую клавишу игра закрывалась. Код будет выглядеть так:

Код
use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(
            WindowPlugin {
                primary_window: Some(Window {
                    title: String::from("Bevy Tutorial"),
                    ..default()
                }),
                ..default()
            }
        ))
        .add_system(bevy::window::close_on_esc)
        .run()
}


Системы выполняются каждый кадр приложения. Но есть ещё отдельный вид систем которые исполняют себя только один раз при создании приложения. С помощью таким систем можно создать камеру через которую будет видно игровое поле.

Для этого сначало создадим новую систему:
Код
fn spawn_camera(mut commands: Commands) {
    commands.spawn(Camera2dBundle::default());
}

и добавим её:
Код
.add_startup_system(spawn_camera)


В качестве параметров системе принимает Commands - инструмент для работы с сущностями (удаление, создание). Обратите внимание, при добавлении системы передавать аргументы не надо! Bevy решит это самостоятельно какие параметры системе нужны.

Структура змейки

Код
#[derive(Resource)]
struct Snake(VecDeque<Entity>);

impl Default for Snake {
    fn default() -> Self {
        Self(VecDeque::new())
    }
}

#[derive(Resource)]
struct SnakeDirection(Direction);

impl Default for SnakeDirection {
    fn default() -> Self {
        Self(Direction::Right)
    }
}

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

#[derive(Component)]
struct SnakeSegment;


Для змейки нам необходим ресурс (глобально доступная структура) которая будет хранить вектор с id сущностей змейки. Так же необходим компонент SnakeSegment для маркировки сущностей принадлежностью к змейке и направление змейки. Так же не забываем имплементацию "по умолчанию" для того что бы инициализировать ресурс.

Инициализация ресурсов происходит так: (в App)
Код
.init_resource::<Snake>()
.init_resource::<SnakeDirection>()


Спавн начальной змейки

Код
fn spawn_default_snake(
    mut commands: Commands,
    mut snake: ResMut<Snake>,
    asset_server: Res<AssetServer>,
) {
    let default_snake = &[(0., 0.), (42., 0.), (84., 0.)];

    for (segment_x, segment_y) in default_snake {
        snake.0.push_back(
            commands
                .spawn((
                    SpriteBundle {
                        transform: Transform::from_xyz(*segment_x, *segment_y, 0.),
                        texture: asset_server.load("images/snake_segment.png"),
                        ..default()
                    },
                    SnakeSegment,
                ))
                .id(),
        );
    }
}


В качестве параметров ресурс берёт Commands для спавна сущности змейки, ресурс змейки и вектором (обязательно mut, нам его менять надо), и сервер по загрузки ассетов. Помимо спавна спрайта, добавляем ещё SnakeSegment, теперь сущности можно легко найти по фильтру этого компонента. Добавляем системы как стартовую.

Движение змейки

Код
fn snake_movement(
    mut commands: Commands,
    mut snake: ResMut<Snake>,
    snake_query: Query<&Transform, With<SnakeSegment>>,
    snake_direction: Res<SnakeDirection>,
    asset_server: Res<AssetServer>,
) {
    commands.entity(*snake.0.front().unwrap()).despawn();
    snake.0.pop_front();

    let snake_head = snake_query.iter().last().unwrap().translation;

    let (offset_x, offset_y) = match snake_direction.0 {
        Direction::Up => (0., 42.),
        Direction::Down => (0., -42.),
        Direction::Left => (-42., 0.),
        Direction::Right => (42., 0.),
    };

    snake.0.push_back(
        commands
            .spawn((
                SpriteBundle {
                    transform: Transform::from_xyz(
                        snake_head.x + offset_x,
                        snake_head.y + offset_y,
                        0.,
                    ),
                    texture: asset_server.load("images/snake_segment.png"),
                    ..default()
                },
                SnakeSegment,
            ))
            .id(),
    );
}


Тут логика игры стандартная - удаляем хвост добавляем спереди и так движемся по направлению. У данной системы есть очень важный параметр - запрос (Query). С помощью запросов можно легко найти все необходимые элементы с необходимыми компонентами. Это ключевая функция Bevy и ECS системы.

Ввод с клавиатуры

Код
fn snake_direction_input(
    mut snake_direction: ResMut<SnakeDirection>,
    keyboard: Res<Input<KeyCode>>,
) {
    if keyboard.just_pressed(KeyCode::Up) {
        snake_direction.0 = Direction::Up
    } else if keyboard.just_pressed(KeyCode::Down) {
        snake_direction.0 = Direction::Down
    } else if keyboard.just_pressed(KeyCode::Left) {
        snake_direction.0 = Direction::Left
    } else if keyboard.just_pressed(KeyCode::Right) {
        snake_direction.0 = Direction::Right
    }
}


Bevy использует ввод с клавиатуры как Ресурс, так что просто добавляем ресурс к системы и можем слушать клавиатуру.

Рост змейки

Код
fn snake_growth_event_handler(
    mut commands: Commands,
    mut snake: ResMut<Snake>,
    mut snake_growth_event_reader: EventReader<SnakeGrowthEvent>,
    snake_direction: Res<SnakeDirection>,
    snake_query: Query<&Transform, With<SnakeSegment>>,
    asset_server: Res<AssetServer>,
) {
    for _ in snake_growth_event_reader.iter() {
        let snake_head = snake_query.iter().last().unwrap().translation;

        let (offset_x, offset_y) = match snake_direction.0 {
            Direction::Up => (0., 42.),
            Direction::Down => (0., -42.),
            Direction::Left => (-42., 0.),
            Direction::Right => (42., 0.),
        };

        snake.0.push_back(
            commands
                .spawn((
                    SpriteBundle {
                        transform: Transform::from_xyz(
                            snake_head.x + offset_x,
                            snake_head.y + offset_y,
                            0.,
                        ),
                        texture: asset_server.load("images/snake_segment.png"),
                        ..default()
                    },
                    SnakeSegment,
                ))
                .id(),
        );

        println!("snake_growth_event_handler");
    }
}


Для создания системы роста змейки будем использовать ещё одну функцию Bevy - события (Event). События может отправить любая система и принять так же любая система кто имеет соотвествующий параметр.

Создаём пустую структуру и добавляем её как событие:
Код
.add_event::<SnakeGrowthEvent>()


Спавн еды
Для начала нам нужно создать еду по умолчанию:
Код
fn spawn_default_food(mut commands: Commands, asset_server: Res<AssetServer>) {
    let x = rand::thread_rng().gen_range(-7..=7) as f32;
    let y = rand::thread_rng().gen_range(-7..=7) as f32;

    commands.spawn((
        SpriteBundle {
            transform: Transform::from_xyz(x * SEGMENT_SIZE, y * SEGMENT_SIZE, 0.),
            texture: asset_server.load("images/food.png"),
            ..default()
        },
        Food,
    ));
}

Добавим эту сисему как стартовую

И по такой же логике проверяем столкновение головы змейки с едой:
Код
fn snake_eat_food(
    mut commands: Commands,
    mut snake_growth_event_writer: EventWriter<SnakeGrowthEvent>,
    food_query: Query<(Entity, &Transform), With<Food>>,
    snake_query: Query<&Transform, With<SnakeSegment>>,
    asset_server: Res<AssetServer>,
) {
    let snake_head = snake_query.iter().last().unwrap().translation;

    food_query.for_each(|food| {
        if snake_head == food.1.translation {
            commands.entity(food.0).despawn();
            snake_growth_event_writer.send(SnakeGrowthEvent);

            let x = rand::thread_rng().gen_range(-7..=7) as f32;
            let y = rand::thread_rng().gen_range(-7..=7) as f32;

            commands.spawn((
                SpriteBundle {
                    transform: Transform::from_xyz(x * SEGMENT_SIZE, y * SEGMENT_SIZE, 0.),
                    texture: asset_server.load("images/food.png"),
                    ..default()
                },
                Food,
            ));

            println!("Snake Eat Food!");
        }
    });
}


Змейка съела сама себя?
Тут можно применить более хитрый метод чем проверять у каждого сегмента змейки столкновение с головой. Для обработки проигрыша мы просто отфильтруем сегменты змейки и если сегментов с кординатами головы больше 1 то игра завершается.

Код
fn game_over(
    mut app_exit_event_writer: EventWriter<bevy::app::AppExit>,
    snake_query: Query<&Transform, With<SnakeSegment>>,
) {
    let snake_head = snake_query.iter().last().unwrap().translation;
    let skip_count = snake_query.iter().len()
        - snake_query
            .iter()
            .filter(|segment| segment.translation != snake_head)
            .count();

    if skip_count > 1 {
        app_exit_event_writer.send(bevy::app::AppExit);
        println!("Game Over!");
    }
}


Настройки порядка работы систем

Код
    App::new()
        .add_plugins(
            DefaultPlugins.set(WindowPlugin {
                primary_window: Some(Window {
                    title: String::from("Bevy Snake Game"),
                    resolution: WindowResolution::new(WIDTH * SEGMENT_SIZE, HEIGHT * SEGMENT_SIZE)
                        .with_scale_factor_override(1.),
                    ..default()
                }),
                ..default()
            }),
        )
        .insert_resource(FixedTime::new_from_secs(1. / 10.))
        .init_resource::<Snake>()
        .init_resource::<SnakeDirection>()
        .add_event::<SnakeGrowthEvent>()
        .add_startup_system(spawn_camera)
        .add_startup_system(spawn_default_snake)
        .add_startup_system(spawn_default_food)
        .add_system(bevy::window::close_on_esc)
        .add_system(snake_direction_input)
        .add_system(snake_growth_event_handler)
        .add_systems(
            (
                snake_movement,
                snake_eat_food.after(snake_movement),
                game_over.after(snake_movement),
            )
                .in_schedule(CoreSchedule::FixedUpdate),
        )
        .run()


Для того что бы змейка двигалась не так быстро создадим ресурс с фиксированным временем. Далее вместо поочерёдного добавление систем. Используем функцию добавление пачки систем и объеденим из Schedule. Такой способ позволет настроить порядок запуска систем и как часто они запускаются. В нашем случае необходимо что бы система движение всегда была перед система поедания и проигрыша.

Послесловие
Ещё хочу обратить внимание что при таком подходе нужно как можно больше разбивать логику работы на мелкие системы, тогда движок будет работать на все сто. Движок очень молодой (ему вот только 3 года), бесплатный, так что специально не обращал внимание на некоторые особенности API так они крайне часто меняются (тут версия 0.10.1). Но как по мне явно перспективный, явно не будет брошен, всё таки 25 тысяч звёзд на гитхабе о чём то говорит (к примеру у libgdx за всё его время существования в почти 13 лет только 21 тысяча).



Добавлено (29 Июня 2023, 18:04)
---------------------------------------------
Простейший графический интерфейс
Создание простейшего меню

Для создания графического интерфейса будем использовать встроенные функции движка Bevy UI. Графический интерфейс ещё достаточно сыроват (на момент версии 0.10.1) и код будет выглядеть достаточно громоздко но в общем полностью выполняет необходимые требования + возможна полная кастомизация внешнего вида.

Первое что нам понадобиться это дополнительный файл main_menu.rs (или лучше просто menu.rs, так больше подходит стилистике Rust кода)...

Небольшое отступление: структура и организация проекта для Bevy на данный момент это та ещё головная боль, поэтому такое разделение не является самым лучшим, но для небольших проектов вполне себе подойдёт.

...после создания файла с меню нам нужно подключить файл к основному (к примеру IntelliJ IDEA сама предложит подключение), сделать это так:
Код
mod main_menu;


Это указывает компилятору видимость данного файла но важно - не само содержимое файла.

Создадим в main_menu.rs структуру:
Код
pub struct MainMenuPlugin;


И указываем возможность его использования в main.rs:
Код
use crate::main_menu::MainMenuPlugin;


Теперь когда базовая настройка завершена перейдём к логике.

Состояния
Состояния это обычный enum с перечислением всех возможных вариантов.

Нам подойдёт такой:
Код
#[derive(Debug, Default, Clone, Eq, PartialEq, Hash, States)]
enum AppState {
    #[default]
    Menu,
    Game,
}


Для того что бы Bevy понял что это состояния необходимо указать черту States.

Вас могут испугать остальной набор атрибутов, но с помощью "cargo check" довольно просто понять какие именно нам необходимы - он сам нам их предложит.

И добавляем:
Код
.add_state::<AppState>()


Условия выполнения систем
К сожалению на текущей версии движка 0.10.1 не очень удобно задавать условия выполнения систем.

Обратите внимание что на скриншоте ниже ошибок нету, но такой способ всё равно работать не будет.


Вместо этого нам придётся указать критерий конкретной системе:
Код

        .add_systems(
            (
                snake_movement.run_if(in_state(AppState::Game)),
                snake_eat_food.after(snake_movement),
                game_over.after(snake_movement),
            )
                .in_schedule(CoreSchedule::FixedUpdate)
        )

Это очень неудобно (хотя есть немного другие пути решение такого, но всё равно не очевидные и не удобны), очень надеюсь что в 0.11 это исправят.

Создание плагина

Плагин в понятии Bevy это просто набор систем вынесенных в отдельное место. (Можно рассматривать как объект с функциями в ООП).

Реализация плагина:
Код
pub struct MainMenuPlugin;

impl Plugin for MainMenuPlugin {
    fn build(&self, app: &mut App) {
        app
            .add_startup_system(spawn_main_menu)
            .add_system(play_button_interaction);
    }
}


Так же создадим компоненты...

Код
#[derive(Component)]
struct RootNode;

#[derive(Component)]
struct PlayButton;


...для поиска самой кнопки "Играть" и корневого компонента этой кнопки.

Сама модель UI строиться по логике Flexbox и предстовляет собой довольно гибкую систему, но слишком громоздкую для человеческого глаза и может очень легко спугнуть новичка.

Создания кнопки:


Хотя с другой стороны трудно тут как либо прокомментировать, код сам себя объясняет. Единственное что отметить можно это логику: КорневойКомпонент -> Кнопка -> Текст.

Взаимодействие с кнопками

Для взаимодействия с кнопкой нужно использовать запрос (Query) вместе с параметром Interaction (это enum со всеми возможными действиями над кнопкой) и компонентов <ИмяНашейКнопочки>.

Так же не забываем использовать конструкцию...
Код
if let Ok(...) = ... {}

...что бы исключить ошибку если элемента не существует.

Код
fn play_button_interaction(
    mut commands: Commands,
    menu_query: Query<(&Interaction, Entity), With<PlayButton>>,
    mut state: ResMut<NextState<AppState>>,
) {
    if let Ok((interaction, entity)) = menu_query.get_single() {
        match interaction {
            Interaction::Clicked => {
                commands.entity(entity).despawn_recursive();
                state.set(AppState::Game);
            }
            Interaction::Hovered => {}
            Interaction::None => {}
        }
    }
}


Сущность удаляем рекурсивно что бы его наследники тоже были удалены.

На этом всё.

P.S.
Долька арбуза? Мечта детства получить награду на Gcup выполнена!


Майнкрафт - лучшая игра в мире

Сообщение отредактировал minecrafter2 - Четверг, 29 Июня 2023, 18:07
minecrafter2Дата: Четверг, 26 Мая 2022, 18:07 | Сообщение # 3 | Тема: Помогите скомпилировать библиотеку
участник
Сейчас нет на сайте
В инструкции написано что под Винду

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 25 Мая 2022, 21:35 | Сообщение # 4 | Тема: Помогите скомпилировать библиотеку
участник
Сейчас нет на сайте
Помогите деду (уже как никак 10 лет прошло, а как будто вчера было) скомпилировать библиотеку Ссылка (GitHub).

Уже обошёл несколько форумов так нигде ни у кого и не получилось. Был бы очень рад гайду как это сделать от А до Я с самого начала. Потому что сколько разного советовали и ошибки были на разных этапах.

Добавлено (25 Мая 2022, 21:35)
---------------------------------------------
Ну и нужны .dll под винду


Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 22 Июля 2020, 15:00 | Сообщение # 5 | Тема: Проблема с khrplatform.h при подключении GLAD
участник
Сейчас нет на сайте
При подключении GLAD компилятор не может найти khrplatform.h. Пробовал указывать с помощью -L, -I, -l но как-то не помогло.

Ошибка:


Исходный код:
Код
#include "glad/glad.h"
#include "glfw3.h"

#include <iostream>

int main()
{

}


Структура проекта:


Добавлено (25 Июля 2020, 19:51)
---------------------------------------------
Я уже разобрался. Я -I не правильно использовал.

Но возник другой вопрос: компиляция программы проходит успешно (SFML) но при запуске исполняемого файла появляется ошибка libgcc_s_seh-1.dll не обнаружен.

Добавлено (25 Июля 2020, 21:46)
---------------------------------------------
С этим тоже разобрался


Майнкрафт - лучшая игра в мире

Сообщение отредактировал minecrafter2 - Суббота, 25 Июля 2020, 21:46
minecrafter2Дата: Среда, 20 Мая 2020, 21:51 | Сообщение # 6 | Тема: [2D] - Хранитель Космоса 20015
участник
Сейчас нет на сайте
Так я сделал уже всё.

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Пятница, 17 Апреля 2020, 05:39 | Сообщение # 7 | Тема: [2D] - Хранитель Космоса 20015
участник
Сейчас нет на сайте


Жанр: скролл-шутер
Язык программирования: Java
Системные требования: Java (желательно последней версии), монитор с разрешением 1280х720 минимум

В 2015 году я попытался сделать игру на подобии "Space Invaders", но у меня не получилось (Ссылка на тему со старой игрой). Я решил это исправить.

Описание:
Вам предстоит выполнить 3 миссии и спасти Космос будущего от кого-то там не хорошего.

Скриншоты(1200x600):


Скачать игру
Скачать исходник
Если не работает, то попробуйте вот это Скачать 0.9 Скорее всего у вас стоит старая версия Java

Обратите внимание если вы решили посмотреть исходный код - я не программист и не умею программировать. Хотя я с Java уже знаком довольно давно но я её изучаю практически методом тыка и делаю только это в своё удовольствие в свободное время на нерегулярной основе. Я понимаю что код конечно очень плохой. Если хотите поправить или сказать как правильно - я буду только рад.

Вообще я рад что Gcup ещё жив, я ведь можно сказать вырос на нём. Думал со временем загнётся, а он ещё в самом расцвете сил.


Майнкрафт - лучшая игра в мире
minecrafter2Дата: Четверг, 31 Октября 2019, 06:48 | Сообщение # 8 | Тема: Неадекватный зум JFrame и подсчёт размера строки(Решено)
участник
Сейчас нет на сайте
1. При запуске JFrame из IDE (Eclipse) - всё нормально
Если скомпилировать программу в запускаемый .jar и запустить через иконку - то окно почему то место заявленных 1600х720 раздувает где то в раза полтора. Если запускать через cmd java -jar game.jar - окно нормальных размеров как указано в программе. Попробовал на другом компьютере - не зависимо от способа запуска фрейм зумится. Я попробовал убрать масштабирование Windows до 100% процентов - стало всё нормально. Как заставить её запускаться игнорируя масштаб Windows? И почему на одной машине способ запуская влияет на размер окна, а на другой - нет?

2. Но это ещё не всё. Самое весёлое вот: мне нужно отображать текст из .txt файла по середине фрейма зависимо от размера строки и размера фрейма, и тут опять же - если программа запустилась из IDE или через cmd то всё нормально - если нет то текст начинает съезжать из за того что размер первой строки почему то перестаёт правильно считаться.

Это функция по которой я текст рисую
Код
    
public void drawText(Graphics g, String textFile) {
  
  int y = 110;
  
  String text = " ", firstLine = " ";
  
  FileReader fr;
  
  try {
   
   fr = new FileReader(textFile);
   BufferedReader reader = new BufferedReader(fr);
   firstLine = reader.readLine();
   reader.close();
  } catch (IOException e1) {
   
   e1.printStackTrace();
  }
        
  try {
   text = new String(Files.readAllBytes(Paths.get(textFile)), "MS932");
  } catch (IOException e) {
   
   e.printStackTrace();
  }
  
  //g.setColor(Color.WHITE);
  //g.drawString(g.getFontMetrics().stringWidth(text) + " - " + g.getFontMetrics().stringWidth(firstLine), 32, 160);
  
  y += textScroll;
  
  g.setColor(Color.LIGHT_GRAY);
  for (String line : text.split("\n"))
   g.drawString(line, getWidth() / 2 - g.getFontMetrics(gameFont).stringWidth(firstLine) / 2, y +=  g.getFontMetrics().getHeight());
    }


Это вообще как так то

Вот именно здесь .stringWidth(firstLine) почему то начинает не правильно читаться
Код

getWidth() / 2 - g.getFontMetrics(gameFont).stringWidth(firstLine) / 2




Добавлено (31 Октября 2019, 06:56)
---------------------------------------------
Скриншотил с рабочем столом для большей наглядности(Все картинки 1280х720)

1. Как правильно


2. Как не надо


Изменение масштабирования до 100% не решает проблему с съезжанием текста.

Добавлено (01 Ноября 2019, 20:27)
---------------------------------------------
Вообще мне главное чтобы текст не съезжал, а на размер окна пофигу вообщем то.

Добавлено (01 Ноября 2019, 23:34)
---------------------------------------------
Хахах,это оказывается происходит только с русским текстом. Изменение кодировки не лечит.
Вообще можете поздравить меня, я нашёл баг - g.getFontMetrics().stringWidth(Line) работает не верно если строка была разгружена из файла с русским текстом.

Но вопрос открыт - как обойти этот баг?

Добавлено (02 Ноября 2019, 00:03)
---------------------------------------------
Хотя мне кажется g тут не причем, а чудит filereader:

Код
try {

tfr = new FileReader(textFile);
tBufferedReader reader = new BufferedReader(fr);
tfirstLine = reader.readLine();
treader.close();
} catch (IOException e1) {

e1.printStackTrace();
}


Ну и как с этим быть?

Добавлено (02 Ноября 2019, 00:05)
---------------------------------------------
Но почему же тогда если запускать из Ecplise то всё норм, а если нет - то всё не норм???

Помогите, сейчас убьюсь об клаву

Добавлено (02 Ноября 2019, 03:28)
---------------------------------------------
Капец stack overflow машина, первый раз там вопрос задал, как по мне серьёзно нерешаемый - решили.

ответ:
BufferedReader reader = Files.newBufferedReader(Paths.get(fileName), StandardCharsets.UTF_8);


Майнкрафт - лучшая игра в мире

Сообщение отредактировал minecrafter2 - Суббота, 02 Ноября 2019, 03:28
minecrafter2Дата: Среда, 30 Августа 2017, 21:50 | Сообщение # 9 | Тема: Вопрос про PointJS
участник
Сейчас нет на сайте
Решил я попробовать себя в web c помощью фреймворка PointJS очень понравился всё классно но есть одна существенная проблема: создание игрового поля начинается от левого верхнего угла а мне надо чтобы игра была посередине браузера. Как это решить? Может как то с помощью CSS?

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Четверг, 26 Ноября 2015, 18:34 | Сообщение # 10 | Тема: My saga of Vinland
участник
Сейчас нет на сайте
Цитата sfabrikan ()
кинуть детей на копья

И зачем делать это? Чтоб потом мяско их сожрать?


Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 04 Ноября 2015, 01:54 | Сообщение # 11 | Тема: Самое противное. Форумная игра
участник
Сейчас нет на сайте
Мои игры противнее Кончиты Вуртс

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 04 Ноября 2015, 01:50 | Сообщение # 12 | Тема: Ник/Аватар/Подпись
участник
Сейчас нет на сайте
6/6/6

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 04 Ноября 2015, 01:49 | Сообщение # 13 | Тема: Угадываем возраст сообеседника
участник
Сейчас нет на сайте
martuk тебе 21

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Среда, 04 Ноября 2015, 01:47 | Сообщение # 14 | Тема: Какую музыку вы слушаете?
участник
Сейчас нет на сайте
Oxxymiron, Hollywood undead

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Вторник, 03 Ноября 2015, 18:32 | Сообщение # 15 | Тема: по Jframe
участник
Сейчас нет на сайте
Если создаю окно JFrame и начинаю на нём отрисовывать что-то добавляю слушатель клавиатуры начинаю это что-то двигать и если нету фона то это всё начинает размываться.
Исходное состояние:

Как это убрать?


Майнкрафт - лучшая игра в мире

Сообщение отредактировал minecrafter2 - Вторник, 03 Ноября 2015, 18:33
minecrafter2Дата: Воскресенье, 13 Сентября 2015, 13:22 | Сообщение # 16 | Тема: [2.5D] Двери, которые лучше не открывать
участник
Сейчас нет на сайте
Музыка зачётная

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Четверг, 27 Августа 2015, 14:22 | Сообщение # 17 | Тема: Проблема с компиляцией
участник
Сейчас нет на сайте
Я значит в файле demo.java написал вот это:
Код
import java.applet.Applet;
import java.awt.Graphics;

public class demo extends Applet{
   
  public void paint(Graphics g){
    
    
   g.drawString("First applet", 32, 32);
  }

}


При компиляции происходит это:

Что делать?

Добавлено (27 августа 2015, 14:22)
---------------------------------------------
Спасибо за помощь, но я сам разобрался


Майнкрафт - лучшая игра в мире
minecrafter2Дата: Воскресенье, 16 Августа 2015, 14:46 | Сообщение # 18 | Тема: [3D] - Total Tank Battle (доступна мультиплеерная версия)
участник
Сейчас нет на сайте
Лучше танки заделай не реальные а свои придумай по-моему так интереснее. И госпади убери этот ужасный голос который говорит "Готов", "Активация прицела", а вообщем выглядит серьёзно так

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Вторник, 21 Июля 2015, 21:58 | Сообщение # 19 | Тема: Ardor3D
участник
Сейчас нет на сайте
Как - то искал движки на java и нарыл ardor3d ток вот везде облазил но нигде скачать незя его! Офф сайта нет уже.Помогите, киньте где скачать!

Майнкрафт - лучшая игра в мире
minecrafter2Дата: Понедельник, 29 Июня 2015, 00:20 | Сообщение # 20 | Тема: Опиши и плюсани игрока выше
участник
Сейчас нет на сайте
k0fe, наверно очень весёлый чувак и любит много кушать

Майнкрафт - лучшая игра в мире
  • Страница 1 из 8
  • 1
  • 2
  • 3
  • 7
  • 8
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг