Neues Inventar Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Neues Inventar Problem

    Mein Inventar ist recht besonders aufgebaut. Im Prinzip ist fast das ganze Inventar mit seinen Boxen ein Sprite. Dann habe ich ein Objekt obj_invScope, mit dem ich durch das Inventar navigieren kann. Dabei wird mit jedem bspw. vk_up die y Position um -80 verändert, bei jedem bspw. vk_right wird x um +100 verändert. Dadurch sieht es so aus, als würde das Scope immer exakt von Kasten zu Kasten springen.
    Ich habe sogar einen switch, der für die genaue x und y Position die Variable box = 0 verändert.

    GML-Quellcode

    1. switch (box)
    2. {
    3. case 1:
    4. x = 88 && y = 136;
    5. box = 1;
    6. break;
    7. case 2:
    8. x = 188 && y = 136;
    9. box = 2;
    10. break;
    11. case 3:
    12. x = 288 && y = 136;
    13. box = 3;
    14. break;
    15. case 4:
    16. x = 388 && y = 136;
    17. box = 4;
    18. break;
    19. case 5:
    20. x = 88 && y = 216;
    21. box = 5;
    22. break;
    23. case 6:
    24. x = 188 && y = 216;
    25. box = 6;
    26. break;
    27. case 7:
    28. x = 288 && y = 216;
    29. box = 7;
    30. break;
    31. case 8:
    32. x = 388 && y = 216;
    33. box = 8;
    34. break;
    35. case 9:
    36. x = 88 && y = 296;
    37. box = 9;
    38. break;
    39. case 10:
    40. x = 188 && y = 296;
    41. box = 10;
    42. break;
    43. case 11:
    44. x = 288 && y = 296;
    45. box = 11;
    46. break;
    47. case 12:
    48. x = 388 && y = 296;
    49. box = 12;
    50. break;
    51. }
    Alles anzeigen


    Nun kollidiere ich als Player mit meinem obj_knife, im Inventar wird dann auf x = 88 und y = 136 das Objekt obj_invKnife erzeugt. Den Switch Befehl habe ich auch im obj_invKnife, also kann man annehmen, dass obj_invKife.box = 1 ist, oder?

    Ich habe einen Befehl, mit dem ich bezwecken möchte, dass wenn mein obj_invKnife und mein obj_invScope diesselbe box (also box = 1) haben und man die Taste 1 drückt, mein obj_invKnife auf x = 88 und y = 40 "teleportiert" wird. Ich habe es sowohl mit instance_create als auch mit x = 88 und y = 40 probiert. Allerdings tut sich in beiden Fällen nichts. Was tun? :(

    GML-Quellcode

    1. if (box = obj_invScope.box)
    2. {
    3. if (keyboard_check_pressed(vk_numpad1))
    4. {
    5. instance_create(88, 40, obj_invKnife);
    6. }
    7. if (keyboard_check_pressed(vk_numpad2))
    8. {
    9. x = 188;
    10. y = 40;
    11. }
    12. }
    Alles anzeigen


    WICHTIGES UPDATE:

    Habe mal den string box ins draw event geschrieben, und obwohl mein obj_invScope über die einzelnen Felder wandert, bleibt der Wert bei 0? warum?
    Es gibt 10 Arten von Menschen: Diejenigen, die Binärcode verstehen und die, die es nicht tun ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von CallMeLegend ()

  • Ich könnte mein Inventory system aus wwyd mal ausgraben, wenn du denn willst. Ist halt was umfangreicher. Ich habe da einmal die Hotbar als Sprite, mit 7 subimages (jedes mit einem Kasten um einen anderen Auswahlplatz), dann ein spritesheet welcher die item Icons enthält (werden in die hotbar gemalt) ein sprite für die Waffe/Item (mit einem outline Glow prebaked) wie sie in der Welt zum aufnehemen aussieht, dann noch finale animierte Sprites für die waffe in der Hand. Für jedes Item gibt es ein script (zB scr_ump45) welches Itemspezifische werte festlegt. Meine Hotbar besteht aus einem 2dimensionalen Array. Hier benutze ich einen Speziellen Syntax [i,0] = Name; [i,1] = Beschreibung; [i,2] = Icon Index; [i,3] = ScriptName (zugriff durch asset_get_index(ScriptName)); [i,4] = Zusatzwert, bei Waffen Schussanzahl. Diese Werte werden duch ein eigens entwickeltes Script dynamisch aus Dateien (zB. itm_5.dat) ausgelesen und können dann in ein beliebiges 2dimensionales Array eingelesen werden sofern es die obrige Struktur aufweist. Man kann damit also auch ganz leicht Kisten etc einbauen, in die Items abgelegt werden können. Falls du dir halbwegs was drunter vorstellen kannst gib mir bescheid, dann werde ich mich bemühen den Code aufzuarbeiten und hier reinzustellen

    EDIT:

    GML-Quellcode

    1. ///scr_hotbar_ini()
    2. hotkeySelected = 1; //starts with (1), (0) is used for default statement (blank hotbar)
    3. hotkeyLast = hotkeySelected;
    4. hotkeySelectedOld = hotkeySelected; //used for Text blending
    5. hotkeyAlpha = 1;
    6. for (i = 0; i <= 7; i++){
    7. global.hotkeySlot[i,0] = ""; //name
    8. global.hotkeySlot[i,1] = ""; //description
    9. global.hotkeySlot[i,2] = 0; //sprite index
    10. global.hotkeySlot[i,3] = "scr_none"; //script to execute
    11. global.hotkeySlot[i,4] = 0; //additional value
    12. }
    Alles anzeigen

    GML-Quellcode

    1. ///scr_hotbar_draw()
    2. draw_set_alpha(1);
    3. draw_set_font(fnt_sys1_small);
    4. draw_set_halign(fa_center);
    5. draw_set_valign(fa_middle);
    6. var _h1 = sprite_get_height(gui_selector);
    7. var _h2 = _h1 + sprite_get_height(spr_hotbar_cover);
    8. //Draw Selector
    9. draw_sprite(gui_selector, 0, round(global.ds_width/2), global.ds_height-_h1);
    10. //Draw Icons
    11. for (i = 0; i <= 7; i++) {
    12. if (global.hotkeySlot[i,0] != "") {
    13. draw_sprite(spr_icons, global.hotkeySlot[i,2],
    14. round(global.ds_width/2)-sprite_get_xoffset(gui_selector)+(i*80),global.ds_height-_h1);
    15. if (i+1 = hotkeySelected)
    16. {
    17. draw_set_alpha(hotkeyAlpha)
    18. draw_text_outlined(round(global.ds_width/2),
    19. global.ds_height - _h2 - 35, 2, string(global.hotkeySlot[i,0]), c_black,
    20. c_orange);
    21. draw_set_alpha(1);
    22. }
    23. }
    24. }
    25. draw_sprite(gui_selector,
    26. clamp(hotkeySelected,0,sprite_get_number(gui_selector)-1),
    27. round(global.ds_width/2), global.ds_height-_h1);
    28. draw_sprite(spr_hotbar_cover, 0, round(global.ds_width/2), global.ds_height-_h2);
    29. if (armed) {
    30. draw_set_valign(fa_top);
    31. /*
    32. if (gunReloadTimer != -1) {
    33. draw_text_outlined(round(global.ds_width/2),global.ds_height-_h2,2,"reloading...",c_black,c_yellow);
    34. }
    35. */
    36. if (global.hotkeySlot[hotkeyLast-1,4] != -1) {
    37. draw_set_halign(fa_left);
    38. draw_text_outlined(round(global.ds_width/2)-sprite_get_xoffset(gui_selector)
    39. + 10,global.ds_height-_h2,2,"Rounds: " +
    40. string(global.hotkeySlot[hotkeyLast-1,4]) + "x",c_black,c_orange);
    41. }
    42. draw_set_halign(fa_right);
    43. draw_text_outlined(round(global.ds_width/2)-sprite_get_xoffset(gui_selector)+sprite_get_width(gui_selector)
    44. -
    45. 10,global.ds_height-_h2,2,string(global.hotkeySlot[hotkeyLast-1,1]),c_black,c_orange);
    46. }
    47. draw_set_halign(fa_left);
    48. draw_set_valign(fa_top);
    Alles anzeigen

    GML-Quellcode

    1. ///scr_hotbar_left()
    2. hotkeySelected = max(1, hotkeySelected-1);
    3. audio_play_sound(snd_click_1, 10, false);

    GML-Quellcode

    1. ///scr_hotbar_right()
    2. hotkeySelected = min(8, hotkeySelected+1);
    3. audio_play_sound(snd_click_1, 10, false);

    GML-Quellcode

    1. ///scr_hotbar_step()
    2. if(hotkeySelected != hotkeySelectedOld)
    3. {
    4. hotkeyAlpha = 1;
    5. }else{
    6. hotkeyAlpha = max(0, hotkeyAlpha-0.01);
    7. }
    8. hotkeySelectedOld = hotkeySelected;
    9. if ((keyboard_check_pressed(vk_enter)|| mouse_check_button_pressed(mb_right)) &!global.show_console &!show_stats)
    10. {
    11. hotkeyLast = hotkeySelected;
    12. gunReloadTimer = -1;
    13. if (audio_is_playing(gunSoundID)) { //stop previous sound
    14. audio_stop_sound(gunSoundID);
    15. }
    16. if (script_exists(asset_get_index(global.hotkeySlot[hotkeySelected-1,3])))
    17. {
    18. script_execute(asset_get_index(global.hotkeySlot[hotkeySelected-1,3]));
    19. }
    20. }
    Alles anzeigen

    GML-Quellcode

    1. ///scr_hotbar_get_free()
    2. //returns pos / -1
    3. var _pos;
    4. _pos = 0;
    5. repeat(array_height_2d(global.hotkeySlot)) {
    6. if (global.hotkeySlot[_pos,0] = "") {
    7. return _pos;
    8. }
    9. _pos++
    10. }
    11. return -1;
    Alles anzeigen


    GML-Quellcode

    1. ///scr_item_add(array 2d,pos,id)
    2. var _array, _pos, _id;
    3. _array = argument0; //NOTE: ARRAY IS COPIED WHEN CHANGED // USE @ FOR DIRECT ACCESS INSTEAD
    4. _pos = argument1;
    5. _id = argument2;
    6. var _list = scr_get_item(_id);
    7. if (_list = -1) {
    8. scr_add_notification_ext("FAILED CATCHING ITEM LIST::ID_" + string(_id),c_red,1);
    9. exit;
    10. }
    11. _array[@ _pos,0] = string(ds_list_find_value(_list,0));
    12. _array[@ _pos,1] = string(ds_list_find_value(_list,1));
    13. _array[@ _pos,2] = real(ds_list_find_value(_list,2));
    14. _array[@ _pos,3] = string(ds_list_find_value(_list,3));
    15. _array[@ _pos,4] = real(ds_list_find_value(_list,4));
    16. ds_list_destroy(_list);
    Alles anzeigen

    GML-Quellcode

    1. ///scr_get_item(id)
    2. //returns ds_list
    3. var file = argument0;
    4. file = "itm_" + string(file) + ".dat";
    5. file = file_text_open_read(working_directory + "items\" + string(file));
    6. if (file = -1) {
    7. scr_add_notification_ext("FAILED LOADING::items\" + string(file),c_red,1);
    8. return -1;
    9. }
    10. var _list = ds_list_create();
    11. ds_list_add(_list,file_text_read_string(file));
    12. file_text_readln(file);
    13. ds_list_add(_list,file_text_read_string(file));
    14. file_text_readln(file);
    15. ds_list_add(_list,file_text_read_real(file));
    16. file_text_readln(file);
    17. ds_list_add(_list,file_text_read_string(file));
    18. file_text_readln(file);
    19. ds_list_add(_list,file_text_read_real(file));
    20. file_text_close(file);
    21. return _list;
    Alles anzeigen

    GML-Quellcode

    1. //weapon pickup (in par_item)
    2. var _pos;
    3. _pos = scr_hotbar_get_free();
    4. if (_pos = -1) {
    5. scr_add_notification("You are carrying too much!");
    6. exit;
    7. }else{
    8. scr_add_notification("Picked up " + string(ItemString) + "!");
    9. }
    10. scr_item_add(global.hotkeySlot,_pos,ID);
    11. if (global.itemAutoSelect) {
    12. with (obj_player) {
    13. hotkeySelected = _pos+1;
    14. hotkeyLast = hotkeySelected;
    15. hotkeySelectedOld = hotkeySelected;
    16. hotkeyAlpha = 1;
    17. if (script_exists(asset_get_index(global.hotkeySlot[hotkeySelected-1,3]))){
    18. script_execute(asset_get_index(global.hotkeySlot[hotkeySelected-1,3]));
    19. }
    20. }
    21. }
    22. instance_destroy();
    Alles anzeigen


    Du wirst es was abstrahieren müssen und ich gebe zu es ist eventuell ein wenig übers Ziel hinausgeschossen, aber wenn du die Grundmechanik verstehst ist es schon Gold wert. Wie du siehst braucht es mit dem 2d array keine extra InventarObjekte, und die scr_hotbar_get_free funktion macht genau das was du willst, nämlich das Item was man aufnimmt im nächst-freien Slot abzulegen. Das heißt auch das du keine spezifischen Slots erstellen musst.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rhazul ()