forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Курсор (http://forum.boolean.name/showthread.php?t=2220)

Atomikc 28.12.2006 17:58

Курсор
 
Вот сижу и думаю. Как сделать нормальный рабочий курсор.
Вот код, и один фиг неработает. Помогите плиз


Код:

Graphics 800,600,32,2

;курсор

Global curs=LoadImage("data/menu/cursor.bmp")
MidHandle curs

Function curs_Update()


End Function

;Фон меню
img=LoadImage("data/menu/galaxi.jpg")
DrawImage img ,0,0 ; Позиция

;Логотип
Logo=LoadImage("data/menu/logo.bmp")
MaskImage Logo ,0,0,0 ; Маска
DrawImage Logo ,100,50 ; Позиция


;Музыка
sam =LoadSound ("data/sound/menu.mp3") ;загрузка музыки
PlaySound sam; Старт музыки

While Not KeyHit(1)=1

curs_update()
DrawImage curs,MouseX(),MouseY()
Flip
Wend

;----------------------------
End


ZanoZa 28.12.2006 19:31

Re: Курсор
 
во первых - не используй команду loadsound\playsopund длябольших музыкальных файлов(в данном случае это музыка), а используй playmusic(путь)
во вторых - используй команду cls. Поставь её в цикле.
Надеюсь полученый результат, то что ты хотел? :)

Platon 28.12.2006 20:05

Re: Курсор
 
ZanoZa
Наоборот - для музыкальных файлов лучше юзать LoadSound\PlaySound, так как PlayMusic() после каждого вызова загружает файл с диска заного, что может вызвать "тормоза".
Atomikc
Фон нужно тоже рисовать в цикле, и не юзай сравнение вроде "... = 1" вместe с оператором Not - или то или другое.

Repeat
Cls()
DrawImage(img, 0, 0)

DrawImage(curs, MouseX(), MouseY())
Flip()
Until KeyDown(1)

ZanoZa 28.12.2006 21:02

Re: Курсор
 
всмысле "заново"? а для чего же нам даны команды play\stop\resumechannel?

Platon 28.12.2006 21:13

Re: Курсор
 
ZanoZa
Ну если трек один то да, можно и PlayMusic(), а если их несколько? PlayMusic() после вызова обращается к диску - загружает трек и начинает проигрывать его, это вроде как LoadSound() и PlaySound() вместе. А если нужно сразу загрузить несколько треков, а потом их проигрывать (поочередно или еще как-нить) то лучше юзать LoadSound()
Почитай справку повнимательнее ;)

HolyDel 28.12.2006 21:41

Re: Курсор
 
imho. PlayMusic рулит. я так понимаю он проигрывает музыку "на лету".
Imho. не рулит тогда когда идет активная работа с жд (pagefile.sys например).

ZanoZa 28.12.2006 22:12

Re: Курсор
 
А почему у тебя в обоих постах доминирует работа с диском? это не обязательно.
Я делал проигрыватель - вполне нормально работает с playmusic, никак тормозов не было.
Если нужны конкретные треки, то да, стоит использывать load\playsound
Если проигрывание треков из какой-нить папки поочерёдно, то я бы придерживался playmusic.

Atomikc 28.12.2006 22:21

Re: Курсор
 
Пасиб. попробую..
Я предпологал что надо ставить Cls но кудаб я её не пихал, у меня стирало обсалютно всё.
Что вы спорите. Там играет простенькая маловесящяя мелодия. Тармозов вроде не замечал. Ну раз уж вы и этот вопос подняли то хотел спросить, а как задать, чтоб музыка повторялась бесконечно?

Atomikc 28.12.2006 23:43

Re: Курсор
 
Вложений: 2
Ну Вроде работает, хотя я задам ещё три вопроса и надеюсь меню я доделпю сам.
1. Как стереть стандартный курсор. А то он закрывает мой.
2. Курсор двигается рывкамию Как исправить.
3. Задумал звёзды сделать анемированые, но не получается их размножить: У меня экран 800 на 600, а картинка 400 на 300, а ещё это должно двиготся вниз.
Вот код:
Код:

;==================================================================
; Star Trash
; Космическая стрелялка. Дата начало работы 27.12.06
;=================================================
Graphics 800,600,32,2

;Фон меню
img=LoadImage("data/menu/galaxi.jpg")
DrawImage img ,0,0 ; Позиция

;звёзы
star=LoadImage("Data/menu/fon.png")
MaskImage star, 0,0,0
TileImage star ;размножение звёзд

;Логотип
 Logo=LoadImage("data/menu/logo.bmp")
MaskImage Logo ,0,0,0 ; Маска
;DrawImage Logo ,100,50 ; Позиция

;Музыка
sam=PlayMusic("data/sound/menu.mp3") ;загрузка музыки

;курсор
Global curs=LoadImage("data/menu/cursor.bmp");Загруска курсора

;цикл
Repeat
Cls()
DrawImage(img, 0, 0);Позиция галактики
DrawImage(logo, 100,50);позиция логотипа
DrawImage (star ,0,0 ); Позиция звёзд

DrawImage(curs, MouseX(), MouseY());Позиция Курсора
Flip()
;----------------------------
Until KeyDown(1)

Вот медиа:

Atomikc 28.12.2006 23:48

Re: Курсор
 
Ну а что ты хотел. Учюсь.

ZanoZa 29.12.2006 00:25

Re: Курсор
 
Чтобы спрятать курсор использую команду HidePointer.
Имхо, звёзды лучше сделать програмно. То есть размножить их командой plot исползуя цикл.

Atomikc 29.12.2006 00:45

Re: Курсор
 
Ну дапустим сделал 50 точек разного размера, как их заставить все двигаться вниз

HolyDel 29.12.2006 01:09

Re: Курсор
 
3.
Код:

TileImage star,0,star_y
star_y=(star_y+1) mod 300

про музыку:
до главного цикла
ch_music=playmsuic("music.mp3")
в главном цикле (там где музыка может кончиться)
if channelplaying(ch_music)=0 then ch_music=playmsuic("music.mp3")

HolyDel 29.12.2006 01:27

Re: Курсор
 
вот твой исправленный код:
Код:

;==================================================================
; Star Trash
; Космическая стрелялка. Дата начало работы 27.12.06
;=================================================
Graphics 800,600,32,2
SetBuffer BackBuffer()
HidePointer

;Фон меню
img=LoadImage("data/menu/galaxi.jpg")
DrawImage img ,0,0 ; Позиция

;звёзы
star=LoadImage("Data/menu/fon.png")
MaskImage star, 0,0,0
TileImage star ;размножение звёзд

;Логотип
 Logo=LoadImage("data/menu/logo.bmp")
MaskImage Logo ,0,0,0 ; Маска
;DrawImage Logo ,100,50 ; Позиция

;Музыка
sam=PlayMusic("data/sound/menu.mp3") ;загрузка музыки

;курсор
Global curs=LoadImage("data/menu/cursor.bmp");Загруска курсора

;цикл
Repeat
Cls()
TileImage star,0,star_y
DrawImage(img, 0, 0);Позиция галактики
DrawImage(logo, 100,50);позиция логотипа
If ChannelPlaying(sam)=0 Then sam=PlayMusic("data/sound/menu.mp3")

star_y=(star_y+1) Mod 300

DrawImage(curs, MouseX(), MouseY());Позиция Курсора
Flip()
;----------------------------
Until KeyDown(1)

найди 5 отличий ;)

2. Есть такая штука - BackBuffer. включяается командой
SetBuffer BackBuffer()
короче не вдаваясь в подробности это создает второй DirectSurface, на который все и прорисовывается и когда надо (командой flip). первичный и вторичный буффер меняются местами. короче - ето чтоб не дрожало.

P/S> все же рекомендую делать полноэкранные приложения, так как в таком случае им выделяются максимально количесво рессурсов.

2 Jimon не работает edit поетому два сообщения

Atomikc 30.12.2006 00:27

Re: Курсор
 
Вобщем сделал я звёзды па своему. Разобрался всётаки. С музыкой понятно, попробую. С BackBuffer я понял. Все забывал прописать :)
А полноэкранный режим и так будет. Просто постоянно экран насиловать не хочется. Один уже сгарел при переключении режима. Потом сделаю..

Atomikc 30.12.2006 00:38

Re: Курсор
 
Да, кстати, HolyDel, звёзды создаются за галактикой. А надо перед. А ещё там долно быть два типа звёзд. Один движытся быстро, другой по медленнее. Но это не так важно. Как я уже сказал я сам всё сделал. Правда используя картинку..

Atomikc 30.12.2006 18:05

Re: Курсор
 
Вот сижу и думаю. как сделать так, чтоб при нажатии кнопки ниже появлялся текст и не исчезал, пока не нажмёш другую кнопку. Я нажимаю, он появляется, я отжимаю, он исчезает.
Код:

;==================================================================
; Star Trash
; Космическая стрелялка. Дата начало работы 27.12.06
;=================================================


Graphics 800,600,32,2
SetBuffer BackBuffer()


;шрифт
font=LoadFont("Arial Cyr",30,1)
Tex=LoadFont("Arial Cyr",20,1)
dat=LoadFont("Arial Cyr",13,1)

;Фон меню
img=LoadImage("data/menu/galaxi.jpg")

;звёзы
star=LoadImage("Data/menu/fon.png")
star2=LoadImage("Data/menu/fon2.png")

;Логотип
 Logo=LoadImage("data/menu/logo.bmp")
MaskImage  logo,0,0,0 ; Маска

;Музыка
sam=PlayMusic("data/sound/menu.mp3") ;загрузка музыки

;курсор
Global curs=LoadImage("data/menu/cursor.bmp");Загруска курсора
HidePointer; Курсор невидим

;Загрузка кнопки
knop=LoadAnimImage("Data/menu/knop.png",175,40,0,2)
knop2=knop
knop3=knop
knop4=knop

; Загрузка диалогового окна
windialog=LoadImage("data/menu/windialog.png")

;цикл
Repeat
Cls()
  DrawImage(img, 0, 0);Позиция галактики

  TileImage star,0,qq:qq=qq- -3
  TileImage star2,0,hh:hh=hh- -1
  DrawImage(logo, 100,50);позиция логотипа
  DrawImage(knop, 310,200);позиция кнопки1
  DrawImage(knop2, 310,245);позиция кнопки2
  DrawImage(knop3, 310,290);позиция кнопки3
  DrawImage(knop4, 310,335);позиция кнопки4
  DrawImage(windialog, 100,385);позиция логотипа

; Если если курсор  над кнопой  Новая игра  и нажата мыш то..
 If MouseX()>310 And MouseY()>200 And MouseX()<485 And MouseY()<240
  DrawImage(knop, 310,200,1)
If MouseDown(1)
 TileImage star2,0,hh:hh=hh- 3 ; Проверить работает ли кнопка
EndIf
EndIf
;Если если курсор  над кнопой Помощь и нажата мыш то..
 If MouseX()>310 And MouseY()>245 And MouseX()<485 And MouseY()<285
  DrawImage(knop2, 310,245,1)
If MouseDown(1)

;Текст Описание
 SetFont tex Color 255,255,255:Text 160,410,"Помощь:",1,1
 SetFont tex Color 255,255,255:Text 175,426,"w - Вперёд",1,1
 SetFont tex Color 255,255,255:Text 167,442,"s - Назад",1,1
 SetFont tex Color 255,255,255:Text 168,458,"a - Влево",1,1
 SetFont tex Color 255,255,255:Text 172,474,"d - Вправо",1,1
 SetFont tex Color 255,255,255:Text 225,490,"Кнопка мыши 1 - пушка",1,1
 SetFont tex Color 255,255,255:Text 229,506,"Кнопка мыши 2 - ракеты",1,1

EndIf
EndIf
; Если если курсор  над кнопой Авторы и нажата мыш то..
 If MouseX()>310 And MouseY()>290 And MouseX()<485 And MouseY()<330
  DrawImage(knop3, 310,290,1)
If MouseDown(1)

;Текст Авторы
 SetFont tex Color 255,255,255:Text 150,410,"Автор:",1,1
 SetFont tex Color 255,255,255:Text 200,426,"Миха aka Atomikc",1,1
 SetFont tex Color 255,255,255:Text 190,442,"[email protected]",1,1
 SetFont tex Color 255,255,255:Text 268,458,"________________________________",1,1
 SetFont tex Color 255,255,255:Text 380,484,"Отдельное спасибо Shad0w agent, за предоставление семплов",1,1
 SetFont tex Color 255,255,255:Text 385,500,"А также сайту www.Boolean.name и всем тем, кто мне помогал...",1,1

EndIf
EndIf
;Если если курсор  над кнопой Выход и нажата мыш то выход
 If MouseX()>310 And MouseY()>335 And MouseX()<485 And MouseY()<375
  DrawImage(knop4, 310,335,1)
If MouseDown(1)
:Exit
EndIf
EndIf

;Текст кнопок
 SetFont font:Color 0,170,255:Text 399,219,"Новая игра",1,1
 SetFont font:Color 0,170,255:Text 399,264,"Помощь",1,1
 SetFont font:Color 0,170,255:Text 399,309,"Авторы",1,1
 SetFont font:Color 0,170,255:Text 399,354,"Выход",1,1

;Текст версии игры
 SetFont dat Color 255,255,255:Text 615,560,"Star Trash.    Версия игры  0.1",1,1
  DrawImage(curs, MouseX(), MouseY());Позиция Курсора
  If ChannelPlaying(sam)=0 Then sam=PlayMusic("data/sound/menu.mp3") ; Играть заного
 
Flip()
;----------------------------

Until KeyDown(1)


c0mrad 30.12.2006 18:29

Re: Курсор
 
Цитата:

If MouseX()>310 And MouseY()>200 And MouseX()<485 And MouseY()<240
O_o
А как же ImagesOverlap?Через него ведь проще!

Atomikc 30.12.2006 23:06

Re: Курсор
 
А что ты хотел от новечка. Я всё методом волшебного тыка делаю. Работает значит правильно. Вот стану более менее на ноги, потом и буду высматривать альтернативные варианты. А щя где чё найду тем и пользуюсь.

ZanoZa 31.12.2006 02:08

Re: Курсор
 
создай переменную, допустим, stat$ и туда записывай текущий текст.
и выводи соответственно на экран text,x,y,stat$
чтобы ничего не отображалось задай stat$=""

Atomikc 31.12.2006 13:38

Re: Курсор
 
Ну вопервых с НАСТУПАЮЩИМ ВАС 2007-М!!!
Разобрался я с менюшко. Создал пару переменных Х и У.
Вот весь код.
Код:

;==================================================================
; Star Trash
; Космическая стрелялка. Дата начало работы 27.12.06
;=================================================

;Инициализация графики
  Graphics 800,600,32,2
  SetBuffer BackBuffer()
;Глобал
  Global x,y
;шрифт
  font=LoadFont("Arial Cyr",30,1)
  Tex=LoadFont("Arial Cyr",20,1)
  dat=LoadFont("Arial Cyr",13,1)
;Фон меню
  img=LoadImage("data/menu/galaxi.jpg")
;звёзы
  star=LoadImage("Data/menu/fon.png")
  star2=LoadImage("Data/menu/fon2.png")
;Логотип
  Logo=LoadImage("data/menu/logo.bmp")
MaskImage  logo,0,0,0 ; Маска
;Музыка
  sam=PlayMusic("data/sound/menu.mp3") ;загрузка музыки
;курсор
 Global curs=LoadImage("data/menu/cursor.bmp");Загруска курсора
  HidePointer; Курсор невидим
;Загрузка кнопки
  knop=LoadAnimImage("Data/menu/knop.png",175,40,0,2)
  knop2=knop
  knop3=knop
  knop4=knop
; Загрузка диалогового окна
  windialog=LoadImage("data/menu/windialog.png")

;цикл
  Repeat
  Cls()
    DrawImage(img, 0, 0);Позиция галактики
    TileImage star,0,qq:qq=qq- -3
    TileImage star2,0,hh:hh=hh- -1
    DrawImage(logo, 100,50);позиция логотипа
    DrawImage(knop, 310,200);позиция кнопки1
    DrawImage(knop2, 310,245);позиция кнопки2
    DrawImage(knop3, 310,290);позиция кнопки3
    DrawImage(knop4, 310,335);позиция кнопки4
    DrawImage(windialog, 100,385);позиция логотипа
; Если курсор  над кнопой Новая игра  и нажата мыш то запустить игру
  If MouseX()>310 And MouseY()>200 And MouseX()<485 And MouseY()<240
    DrawImage(knop, 310,200,1)
      If MouseDown(1)
      EndIf
  EndIf
;Если если курсор  над кнопой Помощь и нажата мыш то показать помощь и стереть другое
    If MouseX()>310 And MouseY()>245 And MouseX()<485 And MouseY()<285
      DrawImage(knop2, 310,245,1)
        If MouseDown(1)
          x=1 
          y=0
        EndIf
      EndIf
    If x=1  SetFont tex Color 255,255,255:Text 160,410,"Помощь:",1,1    SetFont tex Color 255,255,255:Text 175,426,"w - Вперёд",1,1    SetFont tex Color 255,255,255:Text 167,442,"s - Назад",1,1    SetFont tex Color 255,255,255:Text 168,458,"a - Влево",1,1    SetFont tex Color 255,255,255:Text 172,474,"d - Вправо",1,1    SetFont tex Color 255,255,255:Text 225,490,"Кнопка мыши 1 - пушка",1,1    SetFont tex Color 255,255,255:Text 229,506,"Кнопка мыши 2 - ракеты",1,1
    If x=0 Then SetFont tex Color 255,255,255:Text 160,410," ",1,1
; Если если курсор  над кнопой Авторы и нажата мыш то паказать авторов и стереть другое
    If MouseX()>310 And MouseY()>290 And MouseX()<485 And MouseY()<330
        DrawImage(knop3, 310,290,1)
        If MouseDown(1)
          x=0
          y=1
        EndIf
    EndIf
  If y=1 Then  SetFont tex Color 255,255,255:Text 150,410,"Автор:",1,1    SetFont tex Color 255,255,255:Text 200,426,"Миха aka Atomikc",1,1    SetFont tex Color 255,255,255:Text 190,442,"[email protected]",1,1    SetFont tex Color 255,255,255:Text 268,458,"________________________________",1,1    SetFont tex Color 255,255,255:Text 380,484,"Отдельное спасибо Shad0w agent, за предоставление семплов",1,1    SetFont tex Color 255,255,255:Text 385,500,"А также сайту www.Boolean.name и всем тем, кто мне помогал...",1,1
  If y=0 Then SetFont tex Color 255,255,255:Text 160,410," ",1,1
;Если если курсор  над кнопой Выход и нажата мыш то выход
      If MouseX()>310 And MouseY()>335 And MouseX()<485 And MouseY()<375
        DrawImage(knop4, 310,335,1)
          If MouseDown(1)
            :Exit
          EndIf
      EndIf
;Текст кнопок
  SetFont font:Color 0,170,255:Text 399,219,"Новая игра",1,1
  SetFont font:Color 0,170,255:Text 399,264,"Помощь",1,1
  SetFont font:Color 0,170,255:Text 399,309,"Авторы",1,1
  SetFont font:Color 0,170,255:Text 399,354,"Выход",1,1
;Текст версии игры
  SetFont dat Color 255,255,255:Text 615,560,"Star Trash.    Версия игры  0.1",1,1
    DrawImage(curs, MouseX(), MouseY());Позиция Курсора
    If ChannelPlaying(sam)=0 Then sam=PlayMusic("data/sound/menu.mp3") ; Играть заного
 Flip()
;----------------------------
Until KeyDown(1)


Atomikc 04.01.2007 02:05

Re: Курсор
 
Ещё вопрос. Вот картинка курсора, виндовсовский курсор находится в углу картинки. Как её поставить в центор этой самой картинки.

Atomikc 05.01.2007 23:23

Re: Курсор
 
Сам нашол. MidHandle curs2. рисует curs2 вцентре курсора

Atomikc 04.04.2007 06:32

Re: Курсор
 
Вот я столкнулся с ещё одной проблемой. Есть у меня корабль с координатами XY и пушки на нем с координатами X+Число У+Число.
Так же есть курсор. Вот. Отсюда два вопроса. Как изменить точку вращения обьекта. Тоесть не MidHandle А своё???
И втарое. Как повернуть пушку в сторону курсора. В школе надо было не спать а учить. Теперь мучаюсь. Оч надеюсь на вашу помощь...

HolyDel 05.04.2007 01:58

Re: Курсор
 
1. незнаю смотри хелп.
2. atan2((canon_x-mousex()),(mousey()-canon_y)) - ф-я вернет угол. дальше на етот угол крути пушку (возможно придется знаки минуса сувать в параметры atan2, эксперементировать надо)

Atomikc 21.04.2007 23:36

Re: Курсор
 
Вложений: 2
Вот и добрался я в своём проэкте до ракет...
Как реализовать такую вещь: Куча врагов и один ты. Все перемещаются... Курсор свободно передвигается по экрану, и если нажать клавишу, то вылитает ракета.
А теперь вопрос. Как сделать так, чтоб ракета летела к объекту котрый ближе всех находится к курсору, при этом поворачиваясь на нужный угол.

Вот пример. Синяя линия- это маршрут следования ракеты. Ракета по этому маршруту должна лететь.

Magus 22.04.2007 00:58

Re: Курсор
 
Как бы сделал я:
1)определить расстояние от курсора до объектов-врагов, если есть координаты курсора и врагов, дума, труда не составит.
r=sqrt((x_rocket-x_enemy)^2+(y_rocket-y_enemy)^2)
2)Определяем расстояния до всех объектов в локации(или, как вариант, всех объектов в заданной области вокруг курсора), находим из них минимальное.
3)задаем ракете начальный вектор скорости
4)в каждый момент времени прибавляем к вектору скорости ракеты вектор малой величины(по крайней мере меньше, чем вектор скорости), направленный от ракеты к выбранному объекту.


Часовой пояс GMT +4, время: 15:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot