Как сделать игру шарик

Добавил пользователь Евгений Кузнецов
Обновлено: 04.09.2024

Это 3-й этап из 10 Gamedev Canvas tutorial. Вы можете найти исходный код как он должен выглядеть после завершения этого урока в Gamedev-Canvas-workshop/lesson3.html.

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

Простое обнаружение столкновений

Для обнаружения столкновения мы будем проверять - касается ли мяч стены, и если это так, изменим направление его движения в нужную сторону.

Чтобы сделать расчёты проще, давайте определим переменную ballRadius , что задаст радиус нарисованного круга и будет использоваться для вычислений. Добавьте это в ваш код, где-то ниже существующих переменных:

Теперь обновите строку, которая рисует шарик, внутри функции drawBall() :

Отскакивание от верхней и нижней стены

Есть четыре стены, от которых мяч будет отскакивать — давайте сначала сосредоточимся на верхней. При каждом кадре нужно проверять, коснулся ли мяч верхней границы — если да, то будет обратное движение мяча, поэтому он начнёт двигаться в противоположном направлении и остановится в пределах видимой границы. Вспомнив, что система координат начинается с левого верхнего угла, мы можем придумать что-то вроде этого:

Если значение y положения шара ниже нуля, изменить направление движения по оси y установив его с тем же значением но с другим знаком. Если мяч движется вверх со скоростью 2 пикселя на кадр, теперь он будет двигаться "вверх" со скоростью -2 пикселя, что на самом деле означает движение вниз со скоростью 2 пикселя.

Приведённый выше код описывает отражение только от верхней границы, так что теперь давайте думать о нижнем крае:

Если положение мяча по оси y больше, чем высота полотна (помните, что мы рассчитываем значения y от верхнего левого, чтобы верхний край начинался с 0, а нижний край — 480 пикселей, высота нашего ), затем после отскока от нижней кромки обратное движение по оси y .

Мы можем объединить эти две конструкции в одну, чтобы уменьшить код:

Если одно из двух утверждений верно, тогда направление мяча меняется.

Отскоки влево и вправо

Мы сделали отражение от верхней и нижней границ, нельзя забывать и про боковины. Задача очень похожа на самом деле, все, что вам нужно сделать, это повторить конструкцию заменив Y на X:

На этом этапе вы должны вставить этот блок кода в функцию Draw (), непосредственно перед закрывающей фигурной скобкой.

Мяч продолжает исчезать в стене!

Проверьте сейчас свой код, и вы будете впечатлёны — теперь мяч, отскакивает от всех четырёх краёв нашего ! Однако есть некоторая проблема - когда мяч попадает в любую стену, он немного заходит за границы перед отскоком:


Это происходит потому, что мы проверяем касание стены и центра мяча, а не его края. Мяч должен отскакивать сразу после касания, а не когда он уже на половину в стене, так что давайте корректировать наш код включив в него небольшое выражение. Обновите последний код добавив к нему:

Когда расстояние между центром шара и краем стены равно радиусу шарика, шарик изменит направление движения. Вычитая радиус при отскоке от одной стены и добавляя при отскоке от другой, мы получили простое обнаружение столкновений. Шарик отскакивает от стен как надо.

Сравните ваш код

Давайте ещё раз проверим готовый код для этой части, и код, что у вас есть, и играйте:

Упражнение: попробуйте изменить цвет шарика на случайный цвет каждый раз, когда он попадает в стену.

Следующий шаг

Теперь мы добрались до стадии, где наш мяч одновременно двигается и остаётся на игровом поле. В четвёртой главе мы рассмотрим реализацию управления — см. Paddle and keyboard controls.

Помогите мне, как сделать это в Дельфи.
Я написал программу чтобы шарик(Shape3) отскакивал от стенок, а как написать что если шарик коснулся платформы (Shape2) он тоже отскакивал?! К чему прировнять координаты шарика? Помогите я только начинаю!
И еще кто знает как сделать так чтобы музыка проигрывалась в медиаплеере постоянно, а то она играет до конца и останавливается.

Помогите мне, как сделать это в Дельфи.
Я написал программу чтобы шарик(Shape3) отскакивал от стенок, а как написать что если шарик коснулся платформы (Shape2) он тоже отскакивал?! К чему прировнять координаты шарика? Помогите я только начинаю!
И еще кто знает как сделать так чтобы музыка проигрывалась в медиаплеере постоянно, а то она играет до конца и останавливается.

Считай координаты шарика и плататформы от начала координат (например от левого верхного/нижнего угла).

Считай координаты шарика и плататформы от начала координат (например от левого верхного/нижнего угла).

сначала мат модель определяется, потом она на листочек записывается в виде формул, а потом эти факаные формулы аккуратно программируются

сначала мат модель определяется, потом она на листочек записывается в виде формул, а потом эти факаные формулы аккуратно программируются

Так в том то и дело что я незнаю как прировнять координаты шарика и платформы.
Ведь платформа то движется. Помогите напишите как это будет, ведь тут наверное 1-2 строчки кода!

Так в том то и дело что я незнаю как прировнять координаты шарика и платформы.
Ведь платформа то движется. Помогите напишите как это будет, ведь тут наверное 1-2 строчки кода!

В данной лабораторной работе предлагается ознакомиться с библиотекой Pygame для 2d графики, анимации, игр и т.п. Начнем с примера. Рассмотрим следующее простенькое приложение на Pygame:

Если запустить этот код, мы увидим кружок, двигающийся с постоянной скоростью.

Разберемся что здесь происходит. Импортировали модуль pygame. Что бы работать с этой библиотекой нужно позвать pygame.init() в начале. Далее инициализируем окно. Обратите внимание, функции pygame.disaplay.set_mode() в качестве параметра передается кортеж из ширины и высоты окна. Создали часы (clock), этот объект поможет нам считать время между кадрами анимации и контролировать FPS.

Далее идет вечный цикл, в котором мы будем отрисовывать наши кадры и обрабатывать события от пользователя (нажатия кнопок, например). Что же мы делаем в цикле?

В первую очередь, зовем метод tick() наших часов. Возвращаемое значение - время в миллисекундах, прошедшее от предыдущего кадра (т.е., на самом деле от предыдущего вызова .tick()). Параметр - это ограничение FPS (frames per second - количество кадров в секунду). Т.е. с таким параметром метода tick(), часы позаботятся о том, чтобы у нас не было больше 50 кадров в секунду. На самом деле, если вы снова позовете .tick() раньше положенного времени (1/50 секунды в данном случае), то она просто зависнет, пока не пройдет нужное время. Таким образом, итерации нашего цикла будут выполняться не друг за другом а через паузу. Это необдимо, т.к. цикл вида

В приложениях на Pygame используется событийная модель: программа крутится в цикле и обрабатывает поступающие события (нажатия кнопок, срабатывание таймера и т.п.). Список событий нам возвращает метод pygame.event.get() . События при этом удаляются из очереди в Pygame, т.е. если позвать этот метод дважды, то во второй раз мы не получим события, который получили в первый. Итак, в нашем примере, мы всего лишь проверяем, нажал ли пользователь любую клавишу, или может закрыл окно (событие QUIT, например если нажать на крестик в заголовке окна или Alt+F4), и если да, завершаем выполнение программы (только для этого мы и импортировали модуль sys).

Далее, обновляем координаты (no comments).

Далее, две функции рисования. screen.fill(цвет) красит весь экран (т.е. все наше окошко), pygame.draw.circle(screen, цвет, координаты, радиус) . Что характерно:

  1. В обоих случаях нам нужен объект screen , который мы получили в начале программы, это наше окошко, собственно, где нужно рисовать.
  2. Координаты в Pygame представлены кортежем целых чисел (x, y). Ось x направлена вправо, y вниз. Точка (0,0) находится в левом верхнем углу экрана. Заметьте, расчеты координат в примере ведутся в дробных числах, т.к. нам нужно точность. Но для рисования мы должны преобразовать координаты к типу int , т.к. для Pygame координаты - это номера пикселей на экране.
  3. Цвет задается кортежем трех целих чисел: (red, green, blue). Каждая составляющая цвета изменяется от 0 до 255. Никогда, пусть вы и не художник. не используйте прогерские цвета, вроде (255, 0, 0) или (0, 255, 255), будьте чуть более оригинальны.

И последнее. В Pygame все функции рисования не рисуют сразу на экране. Они рисуют в некоем скрытом буфере. И только вызов pygame.display.flip() обновляет экран и отображает все. Без вызова pygame.display.flip() мы ничего не увидим на экране.

Справка по Pygame

pygame.time.Clock() возвращает объект часов
clock.tick(fps) устанавливает желаемый FPS и возвращает время прошедшее с прошлого кадра

События

pygame.event.get() возвращает список новых событий
event.type тип события, например:
pygame.QUIT попытка закрыть окно
pygame.KEYDOWN нажатие клавиши. При этом поле event.key будет соответствовать нажатой клавише:
pygame.K_ESCAPE эскейп =)
pygame.K_SPACE пробел
pygame.K_ENTER энтер
pygame.K_0 ноль
pygame.K_a A
остальные тут
pygame.KEYUP отпускание клавиши. Аналогично.
pygame.MOUSEBUTTONUP отпускание кнопки мыши. При этом поле event.button будет соответствовать клавише:
1 левая кнопка мыши
2 средняя
3 правая
4 колесико вверх
5 колесико вниз

Также можно получить информацию о состояниях кнопок и не обрабатывая события:

Список состояний клавишь клавиатуры. True - нажата, False - нет. Например, чтобы проверить, нажата ли клавиша A, можно написать

Аналогично, список состояний клавишь мыши. Наример,

  • нажата ли левая кнопка мыши (здесь кнопки номеруются с нуля, в отличае от событий мыши).

Рисование

pygame.draw.circle(screen, цвет, координаты, радиус, width=0) рисует круг
pygame.draw.rect(screen, цвет, Rect(x, y, ширина, высота), width=0) рисует прямоугольник, со сторонами параллельными границам окна. Rect(. ) создает необходимый тут объект прямоугольника, который надо передать как параметр
line(screen, цвет, (x1, y1), (x2, y2), width=1) рисует прямую линию от одной точки до другой
screen.fill(цвет) заливка цветом всего окна
pygame.display.flip() отрисовка всего

Необязательный параметр width в некоторых функциях задает толщину линии. Остальное смотрите в документации.

Практика

Упражнение №1

Научите шарик отскакивать от стенок. Постарайтесь также сделать, чтоб шарик не залетал за края экрана (самым простым, нафизичным способом).

Упражнение №2

Добавим управление: пусть при нажатой клавише-стрелке, у шарика появляется ускорение в соответствующую сторону. Испульзуйте список pygame.key.get_pressed() .

Упражнение №3

Добавим трение об воздух. Бесконечно ускорять шарик - не очень естественно. Напомним, что сила трения о воздух (а значит и соответствующее ускорение) пропорционально скорости и прортивонаправлено ей.

Упражнение №4

Цвет шарика. Пусть он зависит от скорости.

Упражнение №5

Добавляем второй шарик. И пишем соударение шаров. Соударение шаров рассчитывается так: нужно разложить движение по двум осям: одна - это нормаль контакта, т.к. перпендикуляр к поверхности в точке контакта (в нашем случае, это будет прямая, проходящая через центры шаров), вторая ось - перпендикуляр к первой. Так вот, при упругом соударении, движение по первой оси изменится также, как если это былобы лобовое соударение шаров, а по второй - не изменится.

Упражнение №6

Добавление шаров по нажатию кнопки мыши (добавить в том месте, где находится курсор)

Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY-SA.


Практически каждый детский праздник, день рождения - это множество воздушных шаров. Ими обычно украшают помещения. Что делать со всеми шариками потом, после праздника? Очень просто: лучше всего устроить игры с воздушными шарами прямо на празднике: и от шариков избавитесь, и детям устроите настоящее веселье. Яркие праздничные аксессуары поднимут настроение вам и вашим гостям - не только декор, но и возможность весело поиграть!

Итак, придумываем игры с воздушными шарами!

Именные шарики


Напишите имена каждого вашего гостя на воздушном шаре. Для этого понадобится ручка, маркер, фломастер.

Бросьте все шарики в середине комнаты. Установите таймер на 30 секунд, и пусть дети топают и лопают шарики, так много, как они смогут.

Когда время истекло, игроки, шарики с чьими именами лопнули, выходят из игры. Игроки, чьи имена до сих пор остались на шарах, не лопнули, должны топать снова в течение ещё 20 секунд. Играйте такие короткие промежутки времени, пока не остается только один шар.

Игрок, чьё имя стоит на последнем шаре, выигрывает.

Поиск слов


Разделите гостей на две команды.

Сделайте два набора из шести шаров каждый. Напишите буквы на каждом из шести шаров, чтобы получалось слово П О Б Е Д А. Лучше всего, если все шарики будут одного цвета, так искать будет труднее.

Разбросайте шары вокруг. Пусть игроки ищут шарики, чтобы составить слово.

Первая команда, которая соберёт и составит из шаров слово ПОБЕДА, выигрывает.

Захват шара

Эта игра - вариант "захвата флага", просто с шарами - весёлая игра для вечеринки, для кемпинга, семейного, летнего пикника или любого события, где есть хотя бы несколько детей и много открытого пространства.


Разделите игроков на две команды. Пусть они будут, допустим, "синими" и "красными" (можно ориентироваться на костюмы или повязать ленточки). Дайте красный шарик каждому игроку из Красной команды и синий - каждому члену Синей команды.

Установите время на 3 минуты и определите, какая команда будет первым "захватчиком".

Команда захватчиков должна провести эти три минуты, гоняясь за игроками вражеской команды, пытаясь осалить их. Когда игрок осалил соперника, соперник должен отдать ему свой шарик.

Через три минуты игроки меняются сторонами и играют ещё три минуты - команда "захватчиков" пытается осалить игроков другой команды.

После того как время истекло, нужно подсчитать, сколько шаров есть у каждой команды (воздушные шары, которые выскочили из рук или лопнули, не в счёт).

Команда, набравшая наибольшее количество шариков, выигрывает.

Цветной хлоп!


Разделите детей на две команды. Дайте каждой команде много надутых шариков (используйте одинаковое количество шаров для каждой команды, но сделайте комплекты разного цвета) и два стула.

По знаку "старт" первые игроки в линии для каждой команды должны бежать и взять один из своих шариков, положить его на стул и сесть на него, пока он не лопнет. Когда шарик лопнул, игрок бежит к своим, дотрагивается до следующего члена команды, и тот повторяет всё то же - бежит, берёт шар, кладёт его на стул и лопает, садясь.

Игра продолжается таким образом до тех пор, пока одна из команд не перелопает все свои шары. Первая команда, которая справляется с заданием, побеждает.

Шарики с метлой

Дайте каждой команде несколько воздушных шаров и веник. Выстраивайте всех игроков за стартовой линией. Нарисуйте линию финиша в нескольких метрах от старта.

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

Засекаем время для одной команды, потом для другой, у кого время будет меньше, выигрывает. Если шары по дороге лопались, за каждый лопнувший шар можно прибавлять по секунде времени (так что лопать шары невыгодно!).

Хула-хуп и шарики: кольцеброс

По сути, эта забавная игра - огромного размера кольцеброс.


Вкопайте колья в землю на некотором расстоянии друг от друга (можно ближе-дальше). Привяжите шарики к каждому колышку.

Назначьте максимальный балл для каждой ставки, написав цифру на надутых воздушных шариках, прикреплённых к колышкам. Те колышки, что дальше, дают больше очков при попадании.

Игроки кидают хула-хуп по очереди, накидывая хула-хуп поверх шарика на колышек. Считайте очки каждого игрока, кто сколько сможет набрать. Лопнули шарик? Считайте столько очков этому игроку в минус. У кого больше очков - тот и победитель.

Дартс с воздушными шариками

Возьмите несколько воздушных шариков и большой лист, например, ватманский, или картон, доску.

Закрепите шарики (прикрепив кончики скотчем к доске, или пропустив нитки-завязки через листок ватмана, а ватман крепите к стенке). Можно закрепить шары просто скотчем на стене.

Дети выстраиваются перед доской, стенкой с закреплёнными шариками. Пускай каждый бросает по три дротика в воздушные шарики. Каждый лопнувший при броске шарик даёт один балл. Дротики можно взять самые обычные, от любого дартса. Можно попробовать метать в шарики карандаши или ручки - от них шарики тоже лопаются.

Чем плотнее надуты шарики - тем проще их лопать!

Танец Поймай шарик


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

Когда музыка прекращается, игрок, держащий шар, должен назвать имя любого другого игрока и бросить шар в воздух. Игрок, чьё имя назвали, должен поймать шар прежде, чем шар упадёт на пол. Если он проигрывает и не успевает поймать шар, он выбывает из игры.

Игра продолжается в течение нескольких раундов до тех пор, пока не останется лишь один игрок - он и выигрывает.

Шарико-конфетная охота

До начала игры вставьте небольшие конфетки в шары, прежде чем надувать их. Спрячьте шары в комнате, в саду (там, где проводится вечеринка).

Разделите детей на команды. Отправьте их на поиски шаров, можно засечь определённое время. Когда они находят воздушный шар, они должны лопнуть его и достать конфету.

Когда время истекло, команда, набравшая наибольшее количество конфет, выигрывает, и все могут насладиться выигранными конфетами.

Коллекционеры шариков


Надуйте много воздушных шаров и поместите их на полу, ниточек у них оставлять не надо, пусть будут только хвостики. Поставьте таймер на одну минуту (можно просто громко вместе считать вслух).

Отправьте первого игрока к куче шариков, чтобы он попытался собрать как можно больше шаров за одну ходку, пусть он донесёт их до условленного места. Когда время истекло, считайте, сколько шаров игрок смог унести. Упавшие по дороги или лопнувшие шарики не считаются.

Верните шары в кучу. Дайте каждому игроку возможность по очереди сделать то же самое. Тот игрок, который соберёт больше всего шариков и донесёт их, выигрывает. Он - настоящий коллекционер воздушных шариков!

Набор воздушных шаров


Упаковка - 100 воздушных шаров.
На фото -набор воздушных шаров в пакете, все шары - с рисунком.

Данные шары сделаны из натурального латекса. Ассорти из 10-12 цветов (в случайном соотношении), одного типа - металлик (шар с металлическим блеском). Шары с офсетным рисунком (6-8 дизайнов одной темы в пакете).

Смотрите примеры шаров этого набора на фото:


Информация на обратной стороне пакета.


Все шары в этом наборе - металлик, слегка блестящие, с рисунком.


Ассорти из 10-12 цветов, 6-8 вариантов дизайна рисунков.


Все шары - металлик, с рисунками, размер 10 дюймов (около 25 см).






А я сегодня придумала ещё 4 игры с шарами. ?
Игра первая – Попробуй закинь. Правила игры:
В игру может играть абсолютно любое количество игроков. Для игры нужен балкон, форточка, и четыре шара (можно разного размера, главное чтобы не фигурные). Игроки по очереди закидывают шарики через форточку на балкон, но есть одно правило – судья должен выбрать, с какого расстояния от форточки игроки будут кидать шары, дети помладше должны стоять поближе к форточке, а чем старше, тем дальше. Главное чтобы игроки никогда не меняли расстояние от форточки во время игры.
А теперь про подсчёт очков:
У судьи должен быть лист бумаги, расчерченный для очков. Он должен быть расчерчен так – сверху мелким шрифтом (мелкий шрифт не обязательно, но так меньше места тратится на листе) написаны имена всех игроков, затем начертите между именами линии до самого конца листа (или до половины, по желанию), затем провести горизонтальные линии, чтобы под именами получалось одинаковое количество квадратов.
Очки считаются так – один шар=1 очко (то есть максимум игрок за раунд может получить 4 очка). Сколько шаров закинет игрок на балкон через форточку, столько ему и очков. Но Важно – перекидывать шары, которые не попали на балкон, нельзя перекидывать второй раз! А записываются сами очки так:
Под именем игрока, бросившим шары, записывается количество очков, которые он заработал. Очки в каждом квадрате пишутся в сумме с прошлыми заброшенными данным игроком очками, нов верхнем правом углу маленькой цифрой записывается количество очков, заработанных за этот раунд (оно пишется не в сумме с прошлыми очками), а так же в левом верхнем углу (желательно ручкой или карандашом другого цвета) записывается номер раунда, одна строчка у всех игроков – равно одному раунду.

Так же у этой игры есть второй вариант – надо забросанные с балкона игроком шарики, данному игроку нужно перебросить их с балкона через форточку обратно в комнату, и за каждый перекинутый в комнату шар – дополнительное одно очко. Так что во втором варианте можно за один раунд получить максимум 8 очков.

Читайте также: