• Как сделать проверку на столкновение с ОБЪЕКТАМИ в C#?

    twobomb
    @twobomb
    Код конструктора формы, там где находится InitializeComponent
    partial class Form1
        {
            /// <summary>
            /// Обязательная переменная конструктора.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Освободить все используемые ресурсы.
            /// </summary>
            /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Код, автоматически созданный конструктором форм Windows
    
            /// <summary>
            /// Требуемый метод для поддержки конструктора — не изменяйте 
            /// содержимое этого метода с помощью редактора кода.
            /// </summary>
            private void InitializeComponent()
            {
                this.player = new System.Windows.Forms.PictureBox();
                this.floor = new System.Windows.Forms.PictureBox();
                this.left_wall = new System.Windows.Forms.PictureBox();
                this.right_wall = new System.Windows.Forms.PictureBox();
                this.roof = new System.Windows.Forms.PictureBox();
                this.platform1 = new System.Windows.Forms.PictureBox();
                this.platform2 = new System.Windows.Forms.PictureBox();
                this.platform3 = new System.Windows.Forms.PictureBox();
                this.label1 = new System.Windows.Forms.Label();
                ((System.ComponentModel.ISupportInitialize)(this.player)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.floor)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.left_wall)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.right_wall)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.roof)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform1)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform2)).BeginInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform3)).BeginInit();
                this.SuspendLayout();
                // 
                // player
                // 
                this.player.BackColor = System.Drawing.Color.Red;
                this.player.Location = new System.Drawing.Point(366, 139);
                this.player.Name = "player";
                this.player.Size = new System.Drawing.Size(67, 133);
                this.player.TabIndex = 0;
                this.player.TabStop = false;
                // 
                // floor
                // 
                this.floor.BackColor = System.Drawing.Color.DimGray;
                this.floor.Location = new System.Drawing.Point(92, 546);
                this.floor.Name = "floor";
                this.floor.Size = new System.Drawing.Size(1143, 50);
                this.floor.TabIndex = 1;
                this.floor.TabStop = false;
                // 
                // left_wall
                // 
                this.left_wall.BackColor = System.Drawing.SystemColors.Highlight;
                this.left_wall.Location = new System.Drawing.Point(92, 102);
                this.left_wall.Name = "left_wall";
                this.left_wall.Size = new System.Drawing.Size(32, 451);
                this.left_wall.TabIndex = 2;
                this.left_wall.TabStop = false;
                // 
                // right_wall
                // 
                this.right_wall.BackColor = System.Drawing.SystemColors.Highlight;
                this.right_wall.Location = new System.Drawing.Point(1189, 102);
                this.right_wall.Name = "right_wall";
                this.right_wall.Size = new System.Drawing.Size(32, 451);
                this.right_wall.TabIndex = 3;
                this.right_wall.TabStop = false;
                // 
                // roof
                // 
                this.roof.BackColor = System.Drawing.SystemColors.ControlLight;
                this.roof.Location = new System.Drawing.Point(92, 70);
                this.roof.Name = "roof";
                this.roof.Size = new System.Drawing.Size(1129, 35);
                this.roof.TabIndex = 4;
                this.roof.TabStop = false;
                // 
                // platform1
                // 
                this.platform1.BackColor = System.Drawing.Color.Yellow;
                this.platform1.Location = new System.Drawing.Point(588, 445);
                this.platform1.Name = "platform1";
                this.platform1.Size = new System.Drawing.Size(184, 38);
                this.platform1.TabIndex = 5;
                this.platform1.TabStop = false;
                // 
                // platform2
                // 
                this.platform2.BackColor = System.Drawing.Color.Yellow;
                this.platform2.Location = new System.Drawing.Point(879, 373);
                this.platform2.Name = "platform2";
                this.platform2.Size = new System.Drawing.Size(184, 38);
                this.platform2.TabIndex = 6;
                this.platform2.TabStop = false;
                // 
                // platform3
                // 
                this.platform3.BackColor = System.Drawing.Color.Yellow;
                this.platform3.Location = new System.Drawing.Point(999, 278);
                this.platform3.Name = "platform3";
                this.platform3.Size = new System.Drawing.Size(184, 38);
                this.platform3.TabIndex = 7;
                this.platform3.TabStop = false;
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.label1.Location = new System.Drawing.Point(264, 220);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(201, 25);
                this.label1.TabIndex = 8;
                this.label1.Text = "Управление WASD";
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(1233, 646);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.platform3);
                this.Controls.Add(this.platform2);
                this.Controls.Add(this.platform1);
                this.Controls.Add(this.roof);
                this.Controls.Add(this.right_wall);
                this.Controls.Add(this.left_wall);
                this.Controls.Add(this.floor);
                this.Controls.Add(this.player);
                this.Name = "Form1";
                this.Text = "Form1";
                ((System.ComponentModel.ISupportInitialize)(this.player)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.floor)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.left_wall)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.right_wall)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.roof)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform1)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform2)).EndInit();
                ((System.ComponentModel.ISupportInitialize)(this.platform3)).EndInit();
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
    
            #endregion
    
            private System.Windows.Forms.PictureBox player;
            private System.Windows.Forms.PictureBox floor;
            private System.Windows.Forms.PictureBox left_wall;
            private System.Windows.Forms.PictureBox right_wall;
            private System.Windows.Forms.PictureBox roof;
            private System.Windows.Forms.PictureBox platform1;
            private System.Windows.Forms.PictureBox platform2;
            private System.Windows.Forms.PictureBox platform3;
            private System.Windows.Forms.Label label1;
        }
  • Как сделать проверку на столкновение с ОБЪЕКТАМИ в C#?

    twobomb
    @twobomb
    DetectivePikachu, Для этого нужно вытолнуть игрока за пределы объекта с которым произошло столкновение. Вообще по хорошему делать через вектора и нормали, ну это сложно и для проекта на виндонс формс и так сойдет. Вообще рекомендую делать это на чем -то нормальном. Вот пример который решает и другие вопросы которые вы наверно будете дальше задавать, как делать движение, прыжки, прыжки только с земли, гравитация....
    Код формы
    public partial class Form1 : Form
        {
            private double speedX = 0;
            private double speedY= 0;
            private double speed = 5;//скорость движения
            private double jump= 12;//сила прыжка
            private double gravityForce= 0.05f;//Ускорение свободного падения
            private double gravitySpeed= 0;//сила гравитации
            private bool isGround = true;//За земли ли игрок
            public Form1() {
                InitializeComponent();
                
                PictureBox[] obstacles = new PictureBox[] {
                    left_wall,
                    right_wall,
                    floor,
                    roof,
                    platform1,
                    platform2,
                    platform3
                };
                KeyDown += Form1_KeyDown;
                KeyUp += Form1_KeyUp;
    
                Task.Run(() =>
                {
                    while (true) {
                        Invoke(new Action(() => {
                            //для управщения сначала двигаем по х, и проверяем всё, а потом по у и опять всё проверяем
                            player.Left += Convert.ToInt32(speedX);//Двинули по x
                            if(speedX!= 0)
                                for (int i = 0; i < obstacles.Length; i++)
                                {
                                    if (player.Left + player.Width > obstacles[i].Left &&
                                        player.Left < obstacles[i].Left + obstacles[i].Width &&
                                        player.Top + player.Height > obstacles[i].Top &&
                                        player.Top < obstacles[i].Top + obstacles[i].Height) {//Проверка столкновения с препятствием
                                        if (speedX > 0)//Если мы двигались вправо, то выталкиваем игрока за левую границу объекта с которым столкнулись
                                            player.Left = obstacles[i].Left - player.Width;
                                        else//Иначе если мы двигались влево, то выталкиваем игрока за правую границу объекта с которым столкнулись
                                            player.Left = obstacles[i].Left + obstacles[i].Width;
                                    }
                                }
    
                            gravitySpeed += gravityForce;//добавляем ускорение свободного падения к текущей гравитации
                            speedY -= gravitySpeed;
                            player.Top -= Convert.ToInt32(speedY);//Двинули по у
                            
                            for (int i = 0; i < obstacles.Length; i++) {
                                    if (player.Left + player.Width > obstacles[i].Left &&
                                        player.Left < obstacles[i].Left + obstacles[i].Width &&
                                        player.Top + player.Height > obstacles[i].Top &&
                                        player.Top < obstacles[i].Top + obstacles[i].Height) {//Проверка столкновения с препятствием
                                        if (speedY > 0)//Если мы двигались вверх, то выталкиваем игрока за нижнюю границу объекта с которым столкнулись
                                            player.Top = obstacles[i].Top + obstacles[i].Height;
                                        else {//Если мы двигались вниз(падаем), то выталкиваем игрока за верхнюю границу объекта с которым столкнулись, и заодно говорим что стоим на земле
                                            player.Top = obstacles[i].Top - player.Height;
                                            isGround = true;
                                        }
    
                                        gravitySpeed = 0;//Если врезали головой или ногами то обнуляем гравитацию
                                        speedY = 0;
                                    }
                                }
                        }));
                        Thread.Sleep(1000 / 60);
                    }
                });
            }
    
    
            private void Form1_KeyUp(object sender, KeyEventArgs e){
                if (e.KeyCode == Keys.D && speedX > 0)
                    speedX = 0;
                if (e.KeyCode == Keys.A && speedX < 0)
                    speedX = 0;
            }
    
            private void Form1_KeyDown(object sender, KeyEventArgs e) {
                if (e.KeyCode == Keys.D)
                    speedX = speed;
                if (e.KeyCode == Keys.A)
                    speedX = -speed;
                if (e.KeyCode == Keys.W && isGround) {
                    speedY = jump;
                    isGround = false;
                }
            }
        }
  • Как правильно написать это?

    twobomb
    @twobomb
    Запонимаешь время выстрела в какую нибудь переменную. При следующем выстреле ставишь проверку если текущее время минус время последнего выстрела больше или равно одной секунде то стреляем и опять запоминаем время выстрела иначе не стреляем
  • Как сделать проверку на столкновение с ОБЪЕКТАМИ в C#?

    twobomb
    @twobomb
    И чтобы он на входил в них

    Не входил в них?
    Ходил на них?
    Входил в них?
    Что?
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    Mellorn, Ну от получасовых видео непонятной тематики конечно бесплезно. Хотел найти хороший пример видео, но увы не смог, возможно удалили. Это именно запись лекций центра компьютерного обучения при мгту им. баумана, где люди платят бешенные бабки за обучение, а тут были эти видео прям в свободном доступе. Возможно удалили потому-что посмотрев их не было смысла платить такие деньги и идти на эти курсы.
    Да по времени один урок длился 3 часа, и уроков было немало. Но зато какое качество получаемых знаний, это далеко не получасовое видео про то "как сделать формочку". Ну я не говорил что можно научится только по видео, естественно понадобятся ресурсы и с текстовой информацией, которые кстате понадобятся и тем кто делает это все по книгам.
    А про то что человек не будет смотреть такие объемы, это еще почему? Люди записываются и находят время ездить на такие курсы, а видео в любой момент можно посмотреть, особенно если ты школьник или студент, то время у тебя хватит.
    Вы так говорите будто бы можно прочитать книгу и стать программистом, да хоть от корки до корки её выучи, без десятков, а то и сотен часов практики ты никто.
    P.S. Возможно у вас сложилось такое мнение о видеоуроках из-за плохого опыта с левыми видео про "формочки" или из-за того что вы даже никогда не пробовали обучаться таким способом.
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    shurshur, об этом и речь, что человек без понятия что это вообще такое. Это тоже самое что тебе сейчас дать какую нибудь книгу по транзисторной преобразовательной технике, которую ты откроешь и не поймешь ни слова. Тут нужен букварь от мира программирования, а в большинстве книг сразу с места в карьер.
  • Как правильно отображать фотографии?

    twobomb
    @twobomb
    Зайди на любой сервис где есть аватарки, и попробуй загрузить туда аватарки разных размеров и посмотри что произойдет, подумай и сделай также.
  • Как сделать счетчик успешных решений (распознавание картинок)?

    twobomb
    @twobomb
    Сделай чтобы клиент приобретал не n-ое количество решений, а апи ключ который действует до определенной даты. Ну или же уменьшай счетчик на сервере, не зависимо правильно ли он распознал картинку. Ну или еще вариант, если клиент по одному апи ключу воспользовался апи распознаванием и 10 раз вернул что распознавание не успешно, то блокируем этот апи ключ на определенное время, хотя если просекут то будут 9 раз отправлять не правильно, а 10й правильно и тогда можно тоже халявить.
    P.S. А ну и еще вариант, сохраняем на сервере все "картинки" и коды ответа, которые сервер якобы не правильно распознал по мнению клиента, нанимаем китайцев которые будут вручную их проверять. И если на одном апи ключе допустим китайцы видят что ответ сервера правильный на то что изображено на картинке, а клиент прислал что ответ не правильный, и если допустим такое случилось более 5ти раз на одном ключе, то баним этот ключ... ну тогда уж проще посадить китайцев которые будут вручную распознавать все ключи....
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    Mellorn, нууу некоторые книги могут отпугнуть своим объемом и определённой академичностью и отбить желание этим заниматься. Просто не все желающие попробовать себя в программировании являются задротами математиками старой закалки. На счет шлака да, увы особенно в последние годы каждый почувствовал себя мамкиным программистом считающим своим долгом записать свой видос о своих открытиях, тут нужно искать с умом.
  • При подключении библиотеки редактор кода выдает ошибку error An unexpected error occurred: "EPERM: operation not permitted, unlink?

    twobomb
    @twobomb
    Тыкни на C:\Users\Chessmasters\Desktop\practic JS\why-why\node_modules пкм- свойства и посмотри не стоит ли там атрибут только для чтения
  • Как совмещать программирование со школой?

    twobomb
    @twobomb
    mrisid, а вот это очень хреново и дальше будет еще хуже если ничего не изменишь, в твое время наоборот нужно иметь кучу друзей, расслабляться и наслаждаться свободным временем пока оно еще есть. Не нужно так сильно упарываться в обучение, потому что пострадает твоя личная жизнь и психика, нужно что-то менять, крупные проекты это хорошо, но нужно знать всему свою меру, иначе будешь жалеть об этом всю оставшуюся жизнь, что просрал своё время.
  • Как совмещать программирование со школой?

    twobomb
    @twobomb
    mrisid, нет друзей которые бы этим увлекались? Нужно пробовать их вербовать.
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    edward_freedom, ооо после слова "видосики смотреть" с тобой не о чем говорить. Ты похоже еще на перфокартах программировал. Я понял какого ты типа и переубеждать я тебя не собираюсь, останемся при своих мнениях.
  • Как совмещать программирование со школой?

    twobomb
    @twobomb
    mrisid, Ты уже давно избрал путь самообразования, я сомневаюсь что тебя кто-то обучает программированию хотя может. А в школе единомышленников не найти? Просто не факт что ты их найдешь там, куда ты поступишь.
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    edward_freedom, Правда? Тоесть по твоему чтобы выучить любой язык на базовом уровне нужно книжки читать? Да может, там будут какие-то специфические приемы. Ну к примеру посмотреть лекции по php того же мгту Баумана, где рассказывает бывалый программист куда интереснее. А когда ты уже достиг определенного уровня тебе достаточно почитать документацию.
  • Какие учебники почитать, чтобы выучить php и js?

    twobomb
    @twobomb
    Зачем тебе учебники, из какого ты века? Есть кучи видеоуроков, статей и информации в интернете.
  • Как совмещать программирование со школой?

    twobomb
    @twobomb
    Уже в 7м классе, а еще уроки делаешь :D Это хорошо.
    Переходи в первую смену. Ну конечно нехватка времени в школе это нонсенс, мне бы такую нехватку
    А вообще еще хватит времени с головой, ты такими темпами до окончания школы всё выучишь, а потом еще интерес пропадет, не убивайся сильно в программирование, а то может разонравится, дозируй.
  • Как бы вы сделали зрение NPC врага для stealth маханики?

    twobomb
    @twobomb
    Да просто рейкасты кидайте в игрока из глаз нпса, ну только если угол между векторами (направленными вперед от нпс и игрока) не более желаемого угла обзора нпса (ведь он не видит что происходит сзади или сбоку).
    Ну и смотрите если рейкасты не упираются в какой нибудь нибудь объект (пропуская прозрачные объекты типа стекол), то значит нпс видит игрока. Ну тут еще нужно несколько проверок сделать такие как например расстояние, позиция игрока допустим в присяди то заметность меньше, какая нибудь характеристика незаметности игрока например, время суток, а точнее освещение, если игрок в тени то заметность хуже, или если он в траве ну и из всех этих факторов уже решайте видит ли нпс или нет.